7 unstable releases (3 breaking)
| new 0.4.0 | May 21, 2026 |
|---|---|
| 0.3.0 | May 20, 2026 |
| 0.2.0 | May 18, 2026 |
| 0.1.3 | May 17, 2026 |
#531 in Science
Used in doiget-cli
1MB
14K
SLoC
doiget-mcp
stdio MCP server for doiget. Exposed by the
doiget servesubcommand fromdoiget-cliso an MCP host (Claude Desktop, Cursor, Codex, Claude Code) can resolve DOIs and arXiv ids, fetch Open Access PDFs through official publisher APIs, and inspect the local store.
Status
Phase 0 skeleton. Server::new(...) constructs a server bound to a resolved
doiget_core::CapabilityProfile, but Server::run currently returns an error of the
form "doiget-mcp vX.Y.Z (Phase 0): MCP server is not yet implemented". The JSON-RPC
loop, tool dispatch, and the 9-tool surface land in Phase 3. See
docs/PHASES.md for the implementation plan.
This crate is published to crates.io ahead of Phase 3 so that downstream tooling
(packagers, capability profile consumers, and the doiget-cli serve subcommand) can
take a stable dependency on the type surface.
Why stdio only
doiget speaks stdio JSON-RPC only. There is no HTTP / SSE / WebSocket transport, and there will not be one. This is a permanent architectural decision recorded in ADR-0001 — MCP transport is stdio only, and it is enforced structurally:
- No Cargo feature exists for an HTTP transport.
cargo-denybans HTTP server crates (axum,actix-web,warp,tide,hyperserver) workspace-wide.clippy::print_stdoutisdenyin this crate so stdout stays a JSON-RPC frame channel only. Logs go to stderr viatracing-subscriber.
The defense-in-depth payoff: no listening port, no auth surface, no SSRF vector, no multi-tenant accounting. doiget remains a strictly local tool that the user runs on their own machine under their own credentials.
Tool surface (planned, Phase 3)
The 9-tool baseline shipped at Phase 3 (full spec in
docs/MCP_TOOLS.md):
| Tool | Purpose |
|---|---|
doiget_resolve_paper |
Resolve DOI / arXiv id to authoritative metadata. |
doiget_fetch_paper |
Resolve and download a single PDF to the store. |
doiget_batch_fetch |
Up to 100 refs in one call. |
doiget_info |
Retrieve a store entry's metadata. |
doiget_search_local |
Search store metadata (title / authors / venue). |
doiget_list_recent |
Last N fetched entries. |
doiget_paper_pdf_path |
Return the local path of a cached PDF. Does not read content. |
doiget_capability_profile |
Report which sources this instance is allowed to use. |
doiget_health |
Operational sanity (store writable, version, schema). |
Phase 4 adds doiget_expand_citation_graph, doiget_bibtex_export, and
doiget_csl_export. Permanent exclusions (no doiget_delete_paper,
doiget_set_credentials, doiget_run_shell, doiget_fetch_url) are listed in
docs/MCP_TOOLS.md §6.
Embedding in an MCP host
End users do not depend on this crate directly. MCP hosts launch the server by
configuring the doiget binary's serve subcommand, e.g. for Claude Desktop:
{
"mcpServers": {
"doiget": {
"command": "doiget",
"args": ["serve"]
}
}
}
stdin EOF triggers a 5-second graceful shutdown. See
docs/MCP_TOOLS.md §8 for lifecycle details and
docs/INTEGRATION/ for per-host integration notes.
License
MIT. See LICENSE at the workspace root.
Dependencies
~38–60MB
~1M SLoC