Semantic Scholar Search
Search Semantic Scholar for academic papers, fetch paper details by ID or DOI, retrieve author profiles, and analyse citation graphs. Preferred over google-scholar-search — uses the official API with no scraping. Triggers: search papers, find papers, semantic scholar, paper details, paper by DOI, paper by ID, author profile, citation analysis, references, literature search, paper discovery.
npx skills add github:pantheon-org/tekhne --skill documentation--research--semantic-scholar-searchSearch Semantic Scholar for papers, fetch structured metadata by paper ID or DOI, profile authors, and traverse citation graphs. Uses the official Semantic Scholar API — no scraping, structured results, free to use.
When to Use
- Discovering papers on a topic before running
triage-paper - Resolving an arxiv ID or DOI to full metadata during
triage-paperstep 1 - Fetching papers that cite or are cited by a known paper
- Profiling an author to find their key publications
- Preferred over
google-scholar-searchwhenever both are available
When Not to Use
- The
semantic-scholarMCP server is configured — optionally prefer it over this script; the MCP returns the same data with less setup - The paper is in a biomedical domain not covered by Semantic Scholar — consider PubMed instead
- You need Google Scholar–exclusive sources (patents, grey literature) — use
google-scholar-search
Mindset
This is a structured API, not a search engine — treat it accordingly.
- IDs over titles: a gotcha is using a paper title as the
--paper-idflag. Thepapersubcommand requires a Semantic Scholar paper ID, arxiv ID (prefixarXiv:), or DOI. Titles go tosearch. - Author IDs, not names: the
authorsubcommand requires a Semantic Scholar author ID. A common pitfall is passing a name and getting “not found”. Usesearchfirst to locate the author ID. - Rate limits apply without a key: 100 requests per 5 minutes without an API key. NEVER issue search loops that exhaust the quota; optionally set
SEMANTIC_SCHOLAR_API_KEYto increase limits.
Workflow
1. Choose the right subcommand
| Goal | Subcommand | Key flag |
|---|---|---|
| Keyword discovery | search |
--query |
| Full metadata for a known paper | paper |
--paper-id (SS ID, arXiv:NNNN, or DOI) |
| Author publications and h-index | author |
--author-id (Semantic Scholar ID) |
| Papers citing or cited by a paper | citations |
--paper-id + --type |
2. Set up the environment (first run only)
See setup-and-troubleshooting.md.
3. Run the subcommand
# Keyword discovery
./scripts/semantic-scholar-search.py search \
--query "retrieval-augmented generation" --limit 10
# Full paper metadata — Semantic Scholar ID, arxiv ID, or DOI
./scripts/semantic-scholar-search.py paper --paper-id "arXiv:2005.11401"
./scripts/semantic-scholar-search.py paper --paper-id "10.18653/v1/2020.acl-main.740"
# Author profile — requires Semantic Scholar author ID
./scripts/semantic-scholar-search.py author --author-id "1741101"
# Citations and references for a known paper
./scripts/semantic-scholar-search.py citations --paper-id "arXiv:2005.11401" --type citations
./scripts/semantic-scholar-search.py citations --paper-id "arXiv:2005.11401" --type references
# Export any result to JSON
./scripts/semantic-scholar-search.py search \
--query "chain-of-thought reasoning" --limit 10 --format json \
--output /tmp/candidates.json
4. Find a Semantic Scholar author ID (if needed)
# Step 1: search for the author's papers to locate their ID
./scripts/semantic-scholar-search.py search --query "<author name> <topic>" --limit 5 --format json \
| python3 -c "import json,sys; [print(a['authorId'], a['name']) for p in json.load(sys.stdin) for a in p.get('authors',[])]"
5. Present candidates and hand off
Show results to the user. NEVER triage automatically. For each promising paper offer:
Found N results. Would you like to triage any of these with
triage-paper?
For known papers, pass the arxiv ID or DOI directly to triage-paper step 1.
Anti-Patterns
NEVER pass a paper title to the paper subcommand
WHY: The paper subcommand resolves by ID only. Passing a title returns “not found” or a wrong paper.
BAD --paper-id "Attention Is All You Need" → GOOD --paper-id "arXiv:1706.03762" or the Semantic Scholar paper ID.
NEVER pass an author name to the author subcommand
WHY: The author subcommand requires a Semantic Scholar author ID (numeric string). Names are not accepted.
BAD --author-id "Yoshua Bengio" → GOOD Locate the numeric author ID via search first, then use --author-id "1794492".
NEVER loop subcommands to exhaustion
WHY: Without an API key, the rate limit is 100 requests per 5 minutes. A tight loop will trigger a 429 and block further queries.
BAD Fetch citations recursively in a loop without rate limiting. → GOOD Batch fetches with time.sleep(1) or set SEMANTIC_SCHOLAR_API_KEY for higher quota.
NEVER treat search ranking as completeness
WHY: Semantic Scholar search ranks by relevance, not publication date or citation count. The top 10 results are not “the 10 most important papers on X”.
BAD Claim “here are the key papers on X” from a top-10 search. → GOOD Qualify results as “top results by Semantic Scholar relevance ranking.”
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 candidate list; confirm with the user which papers to triage.
NEVER use DOI and Semantic Scholar ID interchangeably without the correct prefix
WHY: The API distinguishes ID types. An unprefixed DOI is treated as a Semantic Scholar paper ID and will return “not found”.
BAD --paper-id "10.18653/v1/2020.acl-main.740" when the script expects an S2 ID. → GOOD Confirm the ID type; arxiv IDs need arXiv: prefix; DOIs are accepted as-is in most contexts but verify against the script’s --help.
References
- Setup & troubleshooting: setup-and-troubleshooting.md
- Script source: semantic-scholar-search.py
- Dependencies: requirements.txt
- Upstream: JackKuo666/semanticScholar-search-skill
- API key: semanticscholar.org/product/api
- Preferred MCP 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
Installation
Recommended: uv
cd skills/documentation/research/semantic-scholar-search
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
Alternative: standard venv
cd skills/documentation/research/semantic-scholar-search
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Verify
python3 scripts/semantic-scholar-search.py --help
API Key (optional but recommended)
The Semantic Scholar API is free without a key, but limited to 100 requests per 5 minutes. For heavier use, set an API key:
# Obtain a free key at https://www.semanticscholar.org/product/api#api-key
export SEMANTIC_SCHOLAR_API_KEY="your-key-here"
Or add to a .env file in the skill directory and load with dotenvx run --.
Activating the environment
Every session requires activating the venv:
source skills/documentation/research/semantic-scholar-search/.venv/bin/activate
Troubleshooting
HTTP 429 — rate limit exceeded
Without an API key, you are limited to 100 requests/5 minutes. Wait 5 minutes before retrying. Set SEMANTIC_SCHOLAR_API_KEY to raise the limit.
“Paper not found”
Check the ID format:
- Semantic Scholar ID: plain alphanumeric string (e.g.
204e3073870fae3d05bcbc2f6a8e263d9b72e776) - arxiv ID: must be prefixed with
arXiv:(e.g.arXiv:1706.03762) - DOI: accepted as-is (e.g.
10.18653/v1/2020.acl-main.740)
If the paper is very recent (< 2 weeks), it may not yet be indexed.
“Author not found”
The author subcommand requires a Semantic Scholar author ID (a numeric string like 1794492), not a name. Locate the ID by running a search for the author’s papers and extracting authorId from the response.
Import error for semanticscholar
pip install semanticscholar
If running in a venv, ensure it is activated first.