Google Scholar Search
Search Google Scholar for academic papers and author profiles. Use when discovering papers to triage — by keyword, author, or year range. Returns titles, authors, abstracts, and links. Triggers: search papers, find papers, google scholar, search scholar, find author, author profile, literature search, paper discovery, search academic literature.
npx skills add github:pantheon-org/tekhne --skill documentation--research--google-scholar-searchSearch Google Scholar for academic papers and author profiles to build a candidate list before triaging.
When to Use
- Discovering papers on a topic before running
triage-paper - Finding papers by a specific author, optionally filtered by year range
- Scoping a research area and exporting a candidate list to JSON for batch review
When Not to Use
- The paper is already known (arxiv ID, DOI, URL) — go straight to
triage-paper - The
semantic-scholarMCP is configured — optionally prefer it; it returns structured data with no rate-limit risk - The search is for biomedical literature — use PubMed or a domain-specific source
- A candidate JSON already exists at
/tmp/<topic>-candidates.json— reuse it rather than re-running
Mindset
Search is discovery, not triage. The goal is a candidate list, not a finished reference.
- Return candidates, not conclusions: hand the list to the user; let them choose what to triage.
- Scraping is fragile: a gotcha is that a blank result may be a silent CAPTCHA redirect, not an empty query. Always verify by checking the raw response length before reporting “no results”.
- MCP first: a common pitfall is invoking the script without checking whether a
semantic-scholarorgoogle-scholarMCP is available. MCPs are faster, structured, and avoid rate-limit risk.
Workflow
1. Check MCP availability
Consider the semantic-scholar or google-scholar MCP server first. If either is configured and reachable, prefer it over this script.
2. Set up the environment (first run only)
See setup-and-troubleshooting.md for venv creation and dependency installation.
3. Run the search
Activate the venv, then choose the appropriate subcommand:
# Basic keyword search
./scripts/google-scholar-search.py search --query "retrieval-augmented generation" --results 10
# Advanced: filter by author and year range
./scripts/google-scholar-search.py advanced \
--query "LLM reasoning" --author "Yann LeCun" \
--year-start 2020 --year-end 2024 --results 10
# Author profile
./scripts/google-scholar-search.py author --name "Geoffrey Hinton"
# Export candidate list to JSON
./scripts/google-scholar-search.py search \
--query "prompt compression" --format json --output /tmp/candidates.json
4. Parse JSON output (optional)
# Preview titles from a saved candidate list
python3 -c "import json; [print(p['title']) for p in json.load(open('/tmp/candidates.json'))]"
5. Handle blocked responses
If the script returns HTTP 429 or an unusually short HTML body, wait 60 seconds and retry once:
sleep 60 && ./scripts/google-scholar-search.py search --query "<topic>" --results 10
NEVER retry in a tight loop. If still blocked, offer the semantic-scholar MCP as fallback and document the blocker.
6. Present candidates and hand off
Show the result list. For each promising paper, offer:
Found N results. Would you like to triage any of these with
triage-paper?
NEVER triage automatically — always confirm with the user first.
Anti-Patterns
NEVER auto-triage search results
WHY: Discovery and triage are separate quality gates. Auto-triaging bypasses user review.
BAD Run triage-paper on every result. → GOOD Present the list; wait for the user to choose.
NEVER loop on blocked responses
WHY: Repeated retries worsen the block and may trigger a longer ban.
BAD Retry in a tight loop. → GOOD Retry once after 60 s; switch to MCP fallback on second failure.
NEVER treat scraped abstracts as canonical
WHY: Scraped text is truncated and misformatted. Passing it to triage-paper corrupts the research record.
BAD Use the scraped abstract as the paper summary. → GOOD Use results for discovery only; re-fetch from arxiv or DOI during triage.
NEVER skip the MCP availability check
WHY: The script is the fragile fallback. Skipping the check needlessly risks rate-limiting.
BAD Invoke the script without checking for an MCP first. → GOOD Check for semantic-scholar/google-scholar MCP; only fall back to the script if neither is available.
NEVER treat year-range results as exhaustive
WHY: Google Scholar’s year filter is a ranking hint, not a strict predicate. Papers outside the range may appear; papers inside may be missing.
BAD Claim “all 2020–2024 papers on X”. → GOOD Qualify results as “a sample in the requested range, as returned by Google Scholar.”
NEVER report “no results” without checking for a silent block
WHY: A 200 response with a near-empty body is often a CAPTCHA redirect, not a genuine empty result set.
BAD Report “no papers found” when the HTML body is unusually short. → GOOD Check response length; if under ~1 KB, treat it as a potential block and retry once.
References
- Setup & troubleshooting: setup-and-troubleshooting.md
- Script source: google-scholar-search.py
- Dependencies: requirements.txt
- Upstream: JackKuo666/google-scholar-search-skill
- Preferred alternative: see
triage-paperforsemantic-scholarMCP config
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
No eval scenarios available.
Setup and Troubleshooting
Reference for installing dependencies and diagnosing common failures.
Installation
Recommended: uv
cd skills/documentation/research/google-scholar-search
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
Alternative: standard venv
cd skills/documentation/research/google-scholar-search
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Verify
python3 scripts/google-scholar-search.py --help
Activating the environment
Every shell session requires activating the venv before running the script:
source skills/documentation/research/google-scholar-search/.venv/bin/activate
Troubleshooting
HTTP 429 / rate limit
Google Scholar rate-limits scraping aggressively. If you receive a 429 or the response body is unusually short (~under 1 KB):
- Wait 60 seconds and retry once.
- If still blocked, switch to the
semantic-scholarMCP (seetriage-paperSKILL.md for config). - Do not retry in a loop — it worsens and extends the block.
Empty result set on a valid query
A 200 response with zero results may be a silent CAPTCHA redirect. Check response length:
curl -s "https://scholar.google.com/scholar?q=machine+learning" | wc -c
If the byte count is under ~2000, the request was likely intercepted. Treat as a block; see above.
scholarly import error (author search only)
Author profile lookup requires the scholarly library. If it fails to import:
pip install scholarly
If scholarly triggers its own block, use Semantic Scholar’s author API via MCP instead.
Wrong Python version
The script requires Python 3.10+. Check with:
python3 --version
If below 3.8, use mise or pyenv to install a compatible version.