Labsco
TurtleTech-ehf logo

Ookcite MCP

โ˜… 1

from TurtleTech-ehf

Validate DOIs against a real citation database, format references in 2900+ CSL styles (APA, IEEE, Chicago, Nature, etc.), and catch hallucinated academic references before they reach your paper or documentation or pitch deck. Manage citation collections, import/export BibTeX, and batch-process references. 29 tools.

๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅโœ“ VerifiedPaid serviceNeeds API keys

OokCite MCP Server

MIT License Crates.io npm

Give any LLM the ability to validate DOIs, format citations, manage bibliography collections, and catch hallucinated references. Returns citation metadata only -- not PDFs or full-text articles. Works with any MCP client: Grok Build, Claude, Codex, Cursor, Windsurf, OpenCode, Qwen agents, and more.

Configure

If you used setup, you're done. Otherwise, add to your MCP client config:

{
  "mcpServers": {
    "ookcite": {
      "command": "npx",
      "args": ["-y", "@turtletech/ookcite-mcp"]
    }
  }
}

With an API key:

{
  "mcpServers": {
    "ookcite": {
      "command": "npx",
      "args": ["-y", "@turtletech/ookcite-mcp"],
      "env": {
        "OOKCITE_API_KEY": "your_key_here"
      }
    }
  }
}

If you installed globally (npm install -g or cargo install), you can use "command": "ookcite-mcp" directly instead of npx.

Common config file locations:

ClientConfig file
Grok BuildPlugin install (below) or ~/.grok/config.toml / project .mcp.json
Claude Desktop (Linux)~/.config/Claude/claude_desktop_config.json
Claude Desktop (macOS)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Code.mcp.json (project) or ~/.claude/settings.json (global)
CursorSettings > MCP Servers
Codex~/.codex/config.toml

Grok Build

Recommended: install from the xAI plugin marketplace once published (/marketplace in Grok Build, search for ookcite). The marketplace entry clones this repo at a pinned commit and loads the bundled .mcp.json + plugin.json.

From this repo (local / PR testing):

grok plugin install /path/to/ookcite-mcp
# or from git once plugin files are on the branch you pin:
# grok plugin install https://github.com/TurtleTech-ehf/ookcite-mcp.git

Set OOKCITE_API_KEY in your shell or Grok env for collection tools (optional for basic lookup/format tools). Trust the plugin when prompted so its MCP server is allowed to start.

Manual MCP config (same payload as other clients; Grok also loads project .mcp.json at the repo root):

{
  "mcpServers": {
    "ookcite": {
      "command": "npx",
      "args": ["-y", "@turtletech/ookcite-mcp"],
      "env": {
        "OOKCITE_API_KEY": "your_key_here"
      }
    }
  }
}

This repository ships that config as .mcp.json plus plugin.json for Grok plugin discovery. After changing MCP config, restart Grok or reload MCP servers.

Optional env (stdio MCP, all clients):

VariablePurpose
OOKCITE_API_KEYHigher rate limits + collection tools (optional for basic lookup/format)
OOKCITE_STARTUP_PROBES=1Run auth + npm update checks on stderr before accepting MCP connections (default off for faster connect)

Claude Desktop / Claude Code

ookcite-mcp setup uses add-mcp for most Claude installs. Manual fallback uses the same mcpServers.ookcite JSON as above:

ClientConfig location
Claude Desktop (Linux)~/.config/Claude/claude_desktop_config.json
Claude Desktop (macOS)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Code (project).mcp.json in the project root
Claude Code (user)~/.claude/settings.json โ†’ mcpServers

Restart the app or reload MCP servers after edits.

Codex

For Codex, the equivalent global registration also works from the CLI:

codex mcp add ookcite --env OOKCITE_API_KEY=your_key_here -- npx -y @turtletech/ookcite-mcp

Then restart Codex so the new stdio server starts with the updated environment. You can also declare [mcp_servers.ookcite] in ~/.codex/config.toml.

MCP / agent usage tips

  • Prefer batch tools (verify_references, batch_format, batch_add_to_collection, import_bibliography) over many single-citation calls.
  • Collection mutations require OOKCITE_API_KEY. Destructive tools (delete_collection, remove_from_collection, unshare_collection) are annotated for clients that honor MCP tool hints.
  • The server writes diagnostics to stderr only on the MCP path; stdout is reserved for JSON-RPC.

Tools

Lookup & Validation

ToolPurpose
validate_doiCheck if a DOI exists (anti-hallucination)
lookup_isbnLook up a book by ISBN
reverse_lookupFind a paper from messy citation text
health_checkCheck API availability and health

Formatting

ToolPurpose
format_citationFormat a DOI in any of 2900+ CSL styles
verify_referencesBatch-check a list of DOIs
batch_formatFormat multiple citations at once
search_stylesFind CSL style IDs by name
group_citeGenerate grouped in-text markers (e.g. [1-3])

Collections (requires sign-in)

Collections are a signed-in feature. Set OOKCITE_API_KEY to use these tools.

ToolPurpose
list_collectionsList saved citation collections
add_to_collectionAdd a citation (by DOI or free-text)
batch_add_to_collectionAdd multiple citations at once
import_bibliographyImport BibTeX/RIS files into a collection
export_collectionExport collection as BibTeX
search_collectionSearch within a collection; returns entry_id per match
check_duplicatesCheck for duplicates; returns entry_id for matches
delete_collectionDelete a collection
update_collectionUpdate name, description, or style
remove_from_collectionRemove an entry by entry_id, bare DOI, or doi:10.x/y
update_tagsSet tags on a collection
reorder_collectionReorder entries

Typical workflow:

  1. Keep references.bib or library.bib under version control in your project
  2. Import that file into an OokCite collection with import_bibliography
  3. Use search_collection, check_duplicates, and export_collection while revising
  4. Treat the collection as an audit/export companion, not the only copy of your bibliography

Removing a single entry: call search_collection (or check_duplicates) to see each hit as entry_id: โ€ฆ (and optionally aliases: doi:โ€ฆ when the stored id is opaque). Pass that entry_id to remove_from_collection, or pass the paper's bare DOI / doi:10.x/y โ€” the server resolves aliases locally before the API call.

Sharing & Bulk Operations (requires academic/business plan)

ToolPurpose
share_collectionCreate a shareable link
unshare_collectionRevoke sharing
view_sharedView a shared collection by token
merge_collectionsMerge multiple collections
batch_move_entriesMove entries between collections

Plans & Pricing

TierPriceLookups/dayCollectionsEntries/collection
AnonymousFree100--
FreeFree301100
Academic$4/mo10,0005500
Business$12/mo10,000102,000

Papers in your collections are free and unlimited to re-lookup. Only new lookups count against your daily quota. Papers stay free as long as they remain in a collection.

Batch operations require an academic or business plan. Academic pricing is for students, researchers, and educators at accredited institutions.

Anti-Hallucination

Add this to your system prompt:

Before citing any paper, use validate_doi to confirm the reference exists. If validation fails, do not include the citation.

For revision workflows, add:

Keep the project bibliography in a local .bib file under version control. Use OokCite collections for verification, deduplication, and export.

How It Works

The MCP server connects to the public OokCite API to look up and format citations. It's a thin MCP wrapper around the OokCite REST API with no local database, and no heavy dependencies.

Sign up for a free account (30 lookups/day), or upgrade to academic ($4/mo) or business ($12/mo) for batch operations and larger collections.

Source layout

The crate is a thin MCP (stdio) wrapper around the public OokCite REST API. There is no local citation database; all state lives on the API.

PathRole
src/main.rsBinary entry: --version, setup, start MCP server
src/cli.rsStartup probes (validate OOKCITE_API_KEY via /api/v1/me, update check)
src/setup.rsookcite-mcp setup / npx add-mcp client config installer
src/server.rsServer + #[tool_router] MCP tool handlers (plus unit tests at bottom)
src/tool_args.rsTool argument structs (serde + schemars)
src/constants.rsAPI base URL, package version, reverse-lookup confidence threshold
src/http_error.rserror_detail and HTTP status classification for agent-facing strings
src/collection_entries.rsCollection entry ids, bare DOI / doi: alias resolution, search lines
src/resolve_helpers.rsReverse-lookup and free-text resolve payload helpers
src/endpoints.rsEndpoint registry (lib crate surface); contract-tested
src/lib.rsLibrary root (exports endpoints only)
tests/api_contract.rsDecrypts contract/openapi.json.age; asserts every endpoint exists
contract/Age-encrypted OpenAPI snapshot + regen.sh
npm/@turtletech/ookcite-mcp installer/wrapper (downloads release binary)
demo/Asciinema recording scripts
scripts/set-version.shCocogitto pre-bump hook: Cargo.toml + npm/package.json version

Collections / entry ids: search_collection and check_duplicates emit entry_id: โ€ฆ lines. remove_from_collection accepts that id, a bare DOI, or doi:10.x/y (resolved locally in collection_entries before the DELETE call).

Release: tag v* runs .github/workflows/release.yml (multi-arch GitHub Release assets, crates.io, npm). Version bumps use cocogitto (cog.toml + scripts/set-version.sh).

Why server.rs is large: rmcp's #[tool_router] / #[tool] macros keep handlers on one impl Server. Further file splits without macro workarounds add little user value; peel tests or add small helpers (resolve_many, shared Me type) before fighting the macro.

Contributing / local checks

cargo test --bin ookcite-mcp          # unit tests (no contract key needed)
cargo build --release
./target/release/ookcite-mcp --version

# Contract tests (optional locally; required in CI with secret):
export OOKCITE_CONTRACT_KEY=$(pass show turtletech/ookcite-contract-key)
cargo test --test api_contract

Live MCP smoke (optional; needs OOKCITE_API_KEY): add/search/remove with a bare DOI on a throwaway collection, then delete_collection.

Documentation

License

MIT. see LICENSE.