{"id":"0409dbd6-dd75-433a-96db-5ac91de0381a","slug":"trove-mcp","kind":"mcp","name":"trove-mcp","summary":"Fail-closed MCP server for academic research over OpenAlex, Semantic Scholar, arXiv, PubMed, Unpaywall and CORE","owner":"LalwaniPalash","repoUrl":"https://github.com/LalwaniPalash/trove-mcp","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-03-31T09:09:16.000Z","addedAt":"2026-10-14T12:19:22.895Z","logoUrl":"https://avatars.githubusercontent.com/u/147582785?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra"],"tags":[],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-17T22:16:50.242Z","sample":false,"url":"https://conduits.dev/tools/trove-mcp","language":"TypeScript","transports":["stdio"],"install":{"npm":"trove-mcp"},"requirements":{"env":[{"name":"TROVE_CONTACT_EMAIL","secret":false,"required":false,"description":"Contact email for polite OpenAlex usage"},{"name":"UNPAYWALL_EMAIL","secret":false,"required":false,"description":"Email required to enable Unpaywall open-access lookup"},{"name":"TROVE_DB_PATH","secret":false,"required":false,"description":"Path to the local SQLite cache and citation-snapshot database"},{"name":"SEMANTIC_SCHOLAR_API_KEY","secret":true,"required":false,"description":"Needed for reliable find_similar_papers"},{"name":"CORE_API_KEY","secret":true,"required":false,"description":"Improves CORE full-text throughput"}],"upstreamMayCharge":false},"tools":null,"readme":"# trove-mcp\n\n[npm package](https://www.npmjs.com/package/trove-mcp) · [GitHub repo](https://github.com/LalwaniPalash/trove-mcp)\n\nTrove is an MCP server for academic research.\n\nThe basic idea is simple: let Claude search papers, fetch metadata, read open full text when it can, and build structured outputs on top of that.\n\nI have tried to keep it conservative. If a provider cannot support an answer well enough, Trove returns `partial`, `error`, or `unavailable` instead of pretending it knows more than it does.\n\n## What it connects to\n\n- OpenAlex (primary metadata, discovery, citations)\n- Semantic Scholar (semantic recommendations and similarity)\n- arXiv (preprint metadata and full text)\n- Unpaywall (OA discovery by DOI)\n- PubMed (biomedical indexing)\n- Hugging Face Papers API (discovery context endpoints; strict trending uses citation snapshots only)\n- CORE (full-text fallback)\n\n## Install (Claude Desktop, stdio)\n\nNo local install is required with `npx`.\n\nQuick smoke test:\n\n```bash\nnpx -y trove-mcp@latest sync --queries=\"graph neural network\"\n```\n\nOptional global install:\n\n```bash\nnpm i -g trove-mcp\ntrove-mcp sync --queries=\"graph neural network\"\n```\n\n### Claude Desktop on macOS\n\n1. Open Claude Desktop.\n2. Go to `Settings` -> `Developer` -> `Edit Config`.\n3. Edit `~/Library/Application Support/Claude/claude_desktop_config.json`.\n4. Add this server entry under `mcpServers`:\n\n```json\n{\n  \"mcpServers\": {\n    \"trove\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"trove-mcp\"],\n      \"env\": {\n        \"TROVE_CONTACT_EMAIL\": \"you@example.com\",\n        \"TROVE_DB_PATH\": \"/Users/you/.trove-mcp/trove.db\",\n        \"SEMANTIC_SCHOLAR_API_KEY\": \"\",\n        \"UNPAYWALL_EMAIL\": \"you@example.com\",\n        \"CORE_API_KEY\": \"\"\n      }\n    }\n  }\n}\n```\n\n5. Save the file and fully restart Claude Desktop.\n6. Start a new chat and use Trove tools.\n\nNo API keys are required to start. Missing optional keys produce graceful partial/degraded responses.\n\n## Using with Claude\n\nIf you want Claude to use Trove, just say so in the prompt.\n\nExamples:\n\n- \"Use Trove to find papers on speculative decoding\"\n- \"Use Trove to compare DPO and RLHF papers\"\n- \"Use Trove to trace the origin of LoRA\"\n\nIf you do not want Claude to touch the setup-sensitive tools, hide them with `TROVE_DISABLED_TOOLS`.\n\n## What to expect on a fresh install\n\n- `get_trending_papers` will usually return `mode = unavailable` on first run. Trove has to accumulate at least two local citation snapshot dates before it can compute citation velocity honestly.\n- `find_similar_papers` works without a Semantic Scholar key, but keyless calls share a busy pool and often get `429`. Semantic Scholar also has no recommendations for many papers outside computer science and recent work. In both cases Trove returns an error and says why. It never falls back to keyword overlap.\n- Some papers are retrievable even when their provider coverage is incomplete. For example, an arXiv preprint may have full text but no usable reference list in Semantic Scholar or OpenAlex.\n\n## Runtime behavior\n\n- Every tool returns a structured envelope with `status`, `degraded`, `warnings`, `provenance`, `meta.version`, and tool-specific `data`.\n- Provider outages and rate limits are surfaced as warnings, not process crashes.\n- Trove prefers explicit unavailability over approximate output. That is why some tools return empty results with warnings instead of \"best effort\" guesses.\n\n### Tools with real prerequisites\n\n- `get_trending_papers`\n  - Strict fail-closed: only returns `mode = snapshot` when local citation history contains at least two snapshot dates and the computed velocity is non-zero.\n  - Candidate discovery can come from OpenAlex, Semantic Scholar, and Hugging Face, but none of those official APIs provide day-level historical citation data.\n  - First-run `mode = unavailable` is expected. Run `trove sync` once to seed, then rerun after a later day to accumulate history.\n- `find_similar_papers`\n  - Strict fail-closed: Semantic Scholar only, no lexical fallback.\n  - Reliable use requires `SEMANTIC_SCHOLAR_API_KEY`.\n  - Without a key, Trove returns an explicit error immediately instead of spending time on unreliable unauthenticated requests.\n\n### Known provider constraints\n\n- Semantic Scholar is publicly accessible without a key, but unauthenticated traffic uses a shared pool and often returns `429`.\n- Unpaywall is only used when `UNPAYWALL_EMAIL` or `TROVE_CONTACT_EMAIL` is set.\n- CORE works without a key for basic access but may rate-limit or degrade under load; `CORE_API_KEY` improves throughput. Also the CORE API is free, you just need to signup on their site and verify your mail address.\n- `get_references` is strict fail-closed. Some large institutional arXiv preprints are retrievable as papers but still lack usable reference coverage in both Semantic Scholar and OpenAlex. In those cases Trove returns an explicit warning and suggests `get_full_text` for inline citation inspection.\n- `get_author` returns `mostCitedPaperIds` and `recentPaperIds` as best-effort enrichment. If those follow-up lists cannot be fetched reliably, Trove returns the profile as `partial` and does not cache empty arrays as authoritative.\n- OpenAlex-heavy search can still be domain-ambiguous for niche queries. `search_papers` and `build_literature_map` apply precision gates, but overloaded terms may still need tighter prompts or filters.\n- `trace_idea` uses heuristic origin ranking. The timeline is often useful, but the earliest canonical paper can still be missed when provider ranking is imperfect.\n\n## A practical setup\n\nIf you just want the useful core workflow, this is enough:\n\n- `TROVE_CONTACT_EMAIL`\n- `UNPAYWALL_EMAIL`\n- `TROVE_DB_PATH`\n\nIf you want similar-paper recommendations to work reliably, also set:\n\n- `SEMANTIC_SCHOLAR_API_KEY`\n\nIf you want trending to become useful, run:\n\n```bash\nnpx -y trove-mcp@latest sync\n```\n\nand do that on a schedule. Trending depends on local snapshot history, so it will not be useful on day one.\n\nIf you want a more conservative setup, you can hide the tools that need extra setup:\n\n```json\n{\n  \"mcpServers\": {\n    \"trove\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"trove-mcp\"],\n      \"env\": {\n        \"TROVE_CONTACT_EMAIL\": \"you@example.com\",\n        \"TROVE_DB_PATH\": \"/Users/you/.trove-mcp/trove.db\",\n        \"UNPAYWALL_EMAIL\": \"you@example.com\",\n        \"TROVE_DISABLED_TOOLS\": \"get_trending_papers,find_similar_papers\"\n      }\n    }\n  }\n}\n```\n\nThat gives you the core paper-search / paper-read / compare / trace workflow without exposing the two tools that are most sensitive to setup.\n\n## HTTP mode (streamable)\n\n```bash\nTROVE_HTTP_BEARER_TOKEN=change-me npx trove-mcp --transport=http --port=3000\n```\n\nBrowser client example:\n\n```bash\nTROVE_HTTP_BEARER_TOKEN=change-me TROVE_HTTP_CORS_ORIGIN=http://localhost:3000 npx trove-mcp --transport=http --port=3000\n```\n\n- `POST /mcp` for authenticated MCP requests\n- `GET /health` for health checks\n- Auth header: `Authorization: Bearer <token>`\n- CORS exposes `Mcp-Session-Id`/`MCP-Session-Id` for browser MCP clients\n\n## Tools\n\n| Tool | What it does |\n|---|---|\n| `search_papers` | Multi-source search + dedupe + deterministic ranking (OpenAlex/S2/arXiv/PubMed/CORE) |\n| `get_trending_papers` | Topic papers ranked by citation velocity with `mode = snapshot | unavailable` |\n| `get_paper` | Resolve paper by DOI/arXiv/S2/OpenAlex/PubMed/title |\n| `get_full_text` | arXiv -> OpenAlex open-access PDF location -> Unpaywall -> CORE full-text fallback with chunked output; a journal landing page is followed to the PDF named in its `citation_pdf_url` tag |\n| `get_citations` | Papers that cite a target paper |\n| `get_references` | Papers referenced by a target paper |\n| `find_similar_papers` | Semantic Scholar recommendations; works without a key, `SEMANTIC_SCHOLAR_API_KEY` makes it reliable |\n| `get_author` | Author profile and impact metrics; paper-list enrichment is best-effort |\n| `get_institution_output` | Institution profile + publication output |\n| `get_coauthor_network` | Collaboration graph around an author |\n| `build_literature_map` | Structured evidence map (claims/methods/limitations/consensus) |\n| `compare_papers` | Structured 2-5 paper comparison |\n| `trace_idea` | Concept lineage across time and influence |\n\n## Resources\n\n- `trove://resources/version`\n- `trove://resources/source-capability-matrix`\n- `trove://resources/schema-reference`\n- `trove://resources/cache-health`\n\n## Prompts\n\n- `literature-review-workflow`\n- `paper-comparison-workflow`\n- `idea-lineage-workflow`\n\nThese are optional workflow helpers.\n\n## Sync job for citation snapshots\n\n```bash\nnpx trove-mcp sync\nnpx trove-mcp sync --queries=\"agentic ai,graph neural network,causal inference\"\n```\n\nRun this on a schedule (e.g. cron) to improve `get_trending_papers` quality.\nWithout older local snapshots, first-run trending results will correctly return `mode = unavailable`.\nIf you want actual short-window trending, run this at least twice on different days.\n\n## Tests\n\nThe tests are mostly there to protect the parts that are easy to quietly break:\n\n- identifier normalization\n- dedupe / alias handling\n- ranking and off-topic filtering\n- full-text cleanup quality\n- synthesis extraction quality\n- fail-closed provider behavior\n- release gates for fake trending / fake similarity / weak evidence\n- live provider contract checks\n\n`npm run verify:release` is in the publish path. Live tests are separate because they depend on upstream providers behaving that day.\n\n## Development\n\n```bash\nnpm install\nnpm run typecheck\nnpm test\nnpm run test:quality\nnpm run verify:release\nnpm run build\nnpm run inspect\n```\n\nLive-contract tests:\n\n```bash\nLIVE_CONTRACT=1 npm run test:live\n```\n\nTemporarily hide tools from MCP registration (for strict release gating):\n\n```bash\nTROVE_DISABLED_TOOLS=get_trending_papers,find_similar_papers npx -y trove-mcp@latest\n```\n\n## Data and compliance\n\n- No scraping\n- No Sci-Hub or paywalled bypassing\n- All sources are public/open APIs or legal OA links\n\n## Contributing and support\n\nBug reports, questions and pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Citation\n\nIf you use Trove in research, please cite it using [CITATION.cff](CITATION.cff).\n\n## License\n\nMIT\n"}