Semanticscholar (semanticscholar.org) for agents: Paper detail with citations and references; Search semanticscholar β through Unbrowse's scoped MCP for semanticscholar.org (unofficial), which...
Semanticscholar as tools for your agent. Unofficial: not affiliated with or endorsed by semanticscholar.org. Unbrowse compiled these from semanticscholar.org's own requests: each call replays the site's first-party API server-side and returns a verified result. No scraping of rendered pages, no browser on your side, no semanticscholar.org API key.
This server is a tool scope holding only semanticscholar.org: its compiled tools plus the Unbrowse tools that run them, so the agent's tool list stays small and every call stays on semanticscholar.org.
claude mcp add --transport http semanticscholar https://unbrowse.ai/mcp/semanticscholar.org
codex mcp add semanticscholar --url https://unbrowse.ai/mcp/semanticscholar.org && codex mcp login semanticscholar
{"mcpServers":{"semanticscholar":{"url":"https://unbrowse.ai/mcp/semanticscholar.org"}}}
The first connect signs in to Unbrowse with OAuth (free tier, only verified results count). For scripts, send Authorization: Bearer $UNBROWSE_API_KEY (key from https://unbrowse.ai/app/keys; keep it in a secret manager, never in config you commit).
If none of the tools below are in this session's tool list, the server is not connected or not signed in: say so and stop. Do not fetch semanticscholar.org some other way and present it as this skill's result.
semanticscholar_org__get_paper_by_id β Paper detail with citations and referencesPaper detail with citations and references. Inputs: q; query_string. Also takes the site's own parameters, each optional (left out, the recorded value is sent): sort (recorded: "relevance"); page (recorded: 1); pageSize (recorded: 10); sort_post_search (recorded: "relevance"); yearFilter; requireViewablePdf (recorded: false). Mid-run it asks you to pick selected_result from the options it found (status input_required). Returns responseType, paper, citedPapers, figureExtractions, skipperExperiments, citationSortAvailability. Read-only on semanticscholar.org.
q (string, required)query_string (string, required) β query stringsort (string) β optional, e.g. "relevance"page (integer) β optional, e.g. 1sort_post_search (string) β optional, e.g. "relevance"yearFilter (string) β optional, e.g. nullrequireViewablePdf (string) β optional, e.g. falsehydrateWithDdb (string) β optional, e.g. trueincludeTldrs (string) β optional, e.g. trueperformTitleMatch (string) β optional, e.g. trueincludeBadges (string) β optional, e.g. truegetQuerySuggestions (string) β optional, e.g. falseincludePdfVisibility (string) β optional, e.g. truerequireSlug (string) β optional, e.g. "true"aggregateCitationsByIntent (string) β optional, e.g. "true"withEntitlements (string) β optional, e.g. "true"citedPapersLimit (integer) β optional, e.g. "10"select (array) β Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. "results[].{title,url}"). Unmatched paths come back in selectMissing.{"q":"<q>","query_string":"<query_string>"}
semanticscholar_org__post_search β Search semanticscholarSearch semanticscholar. Inputs: query. Also takes the site's own parameters, each optional (left out, the recorded value is sent): page (recorded: 1); pageSize (recorded: 10); sort (recorded: "relevance"); yearFilter; requireViewablePdf (recorded: false); hydrateWithDdb (recorded: true). Returns results, query, querySuggestions, totalPages, totalResults, stats, matchedAuthors, matchedEntity. Read-only on semanticscholar.org.
query (string, required) β query (typed during βfill Search textβ)page (integer) β optional, e.g. 1sort (string) β optional, e.g. "relevance"yearFilter (string) β optional, e.g. nullrequireViewablePdf (string) β optional, e.g. falsehydrateWithDdb (string) β optional, e.g. trueincludeTldrs (string) β optional, e.g. trueperformTitleMatch (string) β optional, e.g. trueincludeBadges (string) β optional, e.g. truegetQuerySuggestions (string) β optional, e.g. falseincludePdfVisibility (string) β optional, e.g. trueselect (array) β Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. "results[].{title,url}"). Unmatched paths come back in selectMissing.{"query":"<query>"}
Always there too: unbrowse_run (a task on semanticscholar.org in plain words), unbrowse_inspect, unbrowse_resume, unbrowse_scrape and unbrowse_map (any page on semanticscholar.org), and the recorded cloud browser unbrowse_browse_open β unbrowse_browse_act β unbrowse_browse_finish. Hosts that reject dotted names show them with _ (unbrowse_run).
status. succeeded carries the verified result. input_required is not a failure: answer the open fields with unbrowse_resume {runId, answers} on the same run.unbrowse_run {task}. It fails with no_capability when nothing is compiled for that yet: do it once with unbrowse_browse_open on semanticscholar.org β unbrowse_browse_act β unbrowse_browse_finish, which compiles a new tool this server lists next time. Anything off semanticscholar.org is refused here (not_in_scope): use the general Unbrowse server for that.unbrowse_browse_act with action: "autofill" fills semanticscholar.org's login from their Unbrowse password manager.succeeded result says. outcome_unknown means a change may have happened: check before retrying. Posting, buying, sending or deleting needs the user's go-ahead.Every tool is also a REST call:
curl -s https://unbrowse.ai/api/v1/sites/semanticscholar.org/call/semanticscholar_org__get_paper_by_id \
-H "authorization: Bearer $UNBROWSE_API_KEY" -H "content-type: application/json" \
-d '{"q":"<q>","query_string":"<query_string>"}'
OpenAPI: https://unbrowse.ai/api/v1/sites/semanticscholar.org/openapi.json. Every other site: the general Unbrowse skill (https://github.com/unbrowse-ai/unbrowse) and https://unbrowse.ai/mcp.