Skip to content

cyanheads/arxiv-mcp-server

v1.8.0Apache-2.0

Search arXiv, fetch paper metadata, and read full-text content via MCP. STDIO or Streamable HTTP.

Changelog

All notable changes to this project. Each entry links to its full per-version file in changelog/.

1.8.0 — 2026-10-26

Publishes the arxiv-guide Agent Skill, served over MCP as skill://arxiv-guide/SKILL.md and shipped in the npm package, Docker image, and .mcpb, and adopts mcp-ts-core 0.13.18: the HTTP per-request memory leak fixed in 0.13.17, and a .mcpb that no longer carries source, a local database, or node-gyp build files.

1.7.2 — 2026-10-25

content[] from arxiv_search_papers, arxiv_get_metadata, and arxiv_read_paper reads back through a CommonMark parse as structuredContent carries it. Mirror schema v5 repairs stored apostrophes and quotes, and searches over several category groups run faster.

1.7.1 — 2026-10-23

arxiv_search_papers reads mirror queries with arXiv's grammar and sends forms the mirror cannot answer as arXiv does to the live API. Term-less mirror searches are index-driven under schema v4, with a lower-bound total. An unparseable PDF fails pdf_extraction_failed.

1.7.0 — 2026-10-21 · ⚠️ Breaking

arxiv_read_paper extracts PDF text in a worker thread and now fails Timeout when extraction outlasts ARXIV_READ_TIMEOUT_MS. Mirror query errors and queries the mirror cannot answer as arXiv does go live; a hung arXiv API no longer times out reads the mirror can answer.

1.6.1 — 2026-10-18

Moves mirror searches off the request thread, gives arxiv_read_paper one read deadline (ARXIV_READ_TIMEOUT_MS), makes the server's mirror connection query-only with one migrating writer at a time, and fixes the lookup and read paths around outages, stalled bodies, and superseded old-style versions.

1.6.0 — 2026-10-17 · ⚠️ Breaking

Renames arxiv_search to arxiv_search_papers (no alias), adds a section outline to arxiv_read_paper, runs every ID input through one parser, and bounds mirror searches and refreshes. Adopts mcp-ts-core ^0.13.15.

1.5.4 — 2026-10-04

Adopts mcp-ts-core 0.13.7–0.13.12 — tool errors carry a request id, declared recovery hints reach callers without per-throw forwarding, an integer sent for a string parameter is accepted, and the Docker image builds multi-arch without emulation.

1.5.3 — 2026-09-19

Adopts mcp-ts-core 0.13.1-0.13.6 — sessionMode is now declared as stateless in src/index.ts, tool errors close with a machine-readable reason/retryable suffix, argument handling tolerates client-added keys and case-style aliases, and upstream fetch errors no longer carry the request URL.

1.5.2 — 2026-09-13 · ⚠️ Breaking

Adopts mcp-ts-core 0.13.0 — the framework skill tree moves to framework-skills/ so an installing agent no longer inherits it, and the Bun floor rises to 1.4.0. Mirror and live arxiv_search are now held to identical results by an offline contract test.

1.5.1 — 2026-08-22 · ⚠️ Breaking

Adopts MCP SDK v2 with strict top-level tool inputs and 2026-07-28 HTTP negotiation; arxiv://categories advertises a public 24-hour cache hint.

1.5.0 — 2026-07-27

arxiv_search's cat: query operand now expands the same way on both search paths, co:/jr: prefixes resolve on the mirror, and query cat: composes with the category parameter the way arXiv does (#36, #37); mirror schema v3 rebuilds its full-text index automatically in place

1.4.0 — 2026-07-27 · ⚠️ Breaking

arxiv_read_paper falls back to PDF-text extraction when no HTML render exists, accepts max_characters: null for whole-paper reads, and no longer fails the whole chain on an ar5iv outage (#23, #24, #38)

1.3.1 — 2026-07-26

Fix arxiv_search's effective_query echo to include applied filters, accept bare archive category codes, and add submitted_from/submitted_to date-window filtering past the pagination ceiling (#20, #27, #32)

1.3.0 — 2026-07-26

Classify arXiv responses by HTTP status before content-type, distinguish mirror version-misses from not_in_arxiv, fix rate-limit recovery hints and abstract_url versioning, and reject failed mirror refreshes instead of resolving them (#9, #29, #30, #31, #34, #35)

1.2.16 — 2026-07-26

Fix silent version substitution in metadata batch lookup, mirror fallback, and whitespace-only ID validation (#25, #26, #28, #33); adopt mcp-ts-core 0.11.0

1.2.15 — 2026-06-20

Adopt @cyanheads/mcp-ts-core 0.10.7–0.10.9: devcheck fresh-scaffold guards, dependency-specifier guard, plugin-manifest packaging checks, ctx.content collector, DuckDB SQL-gate fixes; skill + script re-sync

1.2.14 — 2026-06-15

Adopt @cyanheads/mcp-ts-core 0.10.6: server identity name/title, arxiv_search truncation disclosure, env booleans via z.stringbool(), MCPB bundle cleaner

1.2.13 — 2026-06-02

Adopt @cyanheads/mcp-ts-core 0.9.21: per-request log context fix, secret redaction in fetchWithTimeout, withRetry fail-fast on non-retryable errors

1.2.12 — 2026-06-01

Scheduled mirror refresh runs in a child process — harvest SQLite writes no longer block the request event loop

1.2.11 — 2026-05-31

Incremental and failed mirror refreshes no longer drop arxiv_search to the rate-limited live API

1.2.10 — 2026-05-30

arxiv_search and arxiv_list_categories surface query echoes, true result totals, and empty-result guidance in a typed enrichment block

1.2.9 — 2026-05-29

mirror schema v2: ISO 8601 date normalization for chronological sort (#18), index-backed category filter via junction table (#19)

1.2.8 — 2026-05-28

mcp-ts-core ^0.9.6 → ^0.9.13: 413 body cap, HTTP session-init gate, quieter client-error logging, GET /mcp keywords

1.2.7 — 2026-05-26

Mirror fallback when live API fails: search recency bypass and readContent metadata paths now recover gracefully instead of surfacing upstream errors.

1.2.6 — 2026-05-23

mcp-ts-core ^0.9.1 → ^0.9.6. Error factories in harvester (McpError → validationError/notFound). manifest.json and .mcpbignore scaffolded for MCPB bundle support. Skills synced. fast-xml-parser unpinned.

1.2.5 — 2026-05-22

Mirror translator's cat: extraction no longer leaves dangling boolean operators or empty ( ) groups inside parens (#14). New cleanupDanglingOps post-pass collapses empty groups and drops orphaned operators to a fixed point, covering all six failing shapes from the issue.

1.2.4 — 2026-05-22

Mirror query translator inserts explicit AND at every parenthesis boundary so all: expansions and user-typed groups stop emitting FTS5-invalid expressions. Defense-in-depth catch in ArxivService.searchMirror rethrows any leaked fts5: SQLiteError as validationError with the original query and recovery hint.

1.2.3 — 2026-05-21

Dockerfile production stage writes a minimal tsconfig.json mapping @/* → ./dist/* so Bun resolves the path alias the mirror scripts import through. v1.2.2 shipped the scripts but Bun couldn't resolve @/config/server-config.js. Final piece for an end-to-end deployable mirror.

1.2.2 — 2026-05-21

Ship the mirror:* scripts in the published artifacts. v1.2.0 added scripts/arxiv-mirror-{init,refresh,verify}.ts but omitted them from the Docker production stage and the npm files array — bun run mirror:init failed with Module not found inside the container and in npm-installed copies. Runtime code unchanged; packaging only.

1.2.1 — 2026-05-21

Dockerfile build stage adds --ignore-scripts to bun install so better-sqlite3's node-gyp native build doesn't fail in the oven/bun:1.3 base image (no python3/make/g++). Runtime is Bun-only and uses bun:sqlite, so the compiled binary is never loaded — skipping it is strictly an improvement. No source changes.

1.2.0 — 2026-05-21

Optional OAI-PMH metadata mirror for arxiv_search and arxiv_get_metadata — local SQLite + FTS5 eliminates per-IP rate-limit exposure. Opt-in via ARXIV_MIRROR_ENABLED=true and bun run mirror:init (~4.4h cold harvest). Falls back to the live API on incomplete harvest or lookup miss; arxiv_read_paper still uses the live API.

0.1.19 — 2026-05-18

Field-test fixes from issues #4 — #10: arxiv_get_metadata preserves input order; arxiv_read_paper honors version suffix in HTML URLs and collapses MathML to dollar-delimited LaTeX (2-3× shrink); category suggestions rank by edit distance; rate-limit cooldown grows geometrically (5s → 10s → 20s → 30s capped) per consecutive hit.

0.1.18 — 2026-05-16

Adopt server-level instructions from @cyanheads/mcp-ts-core 0.9.x — spec-compliant clients now forward arXiv tool orientation to the model on every initialize. Framework refresh 0.8.19 → 0.9.1 (portability lint family, Workers nodejs_compat boot fix, SSRF hardening, changelog summary cap 250 → 350 chars).

0.1.17 — 2026-05-08

Fix retry storm on AbortSignal.timeout — connection-layer arXiv throttle now classified as Timeout (non-retryable) instead of ServiceUnavailable (retryable), cutting caller-visible latency from 60-90s to 15s. Framework refresh 0.8.15 → 0.8.19.

0.1.16 — 2026-05-05

Error-contract conformance pass — every non-baseline throw on every API-using surface now carries a typed contract entry and resolves its recovery hint at runtime. Bumps mcp-ts-core 0.8.7 → 0.8.15.

0.1.15 — 2026-04-30

arxiv_read_paper adds start offset for chunk-by-chunk pagination on long papers; HTML cleaner preserves ltx_section/title structural markers; description clarifies arxiv.org/html → ar5iv fallback (no PDF auto-extract)

0.1.14 — 2026-04-30 · ⚠️ Breaking

Bump @cyanheads/mcp-ts-core 0.7.5 → 0.8.7; typed error contracts on every tool/resource; arxiv_get_metadata adopts partialResult; fixes arxiv_search retry-storm on rate-limit (#8) — fail-fast + Retry-After cooldown + User-Agent

0.1.13 — 2026-04-27

Bump @cyanheads/mcp-ts-core 0.6.17 → 0.7.5; arxiv_search validates categories with near-match suggestions and parens-scopes multi-word queries to prevent category leakage; arxiv_read_paper strips LaTeXML noise (3-4× shrinkage)

0.1.12 — 2026-04-24

Bump @cyanheads/mcp-ts-core 0.6.16 → 0.6.17 (HTTP transport hardening) and adopt upstream CLAUDE.md guidance on external API wrapping and format() parity

0.1.11 — 2026-04-24

Fail fast on permanent 4xx from arXiv API, and harden arxiv_search / arxiv_read_paper input schemas to reject values arXiv would return 400/500 for

0.1.10 — 2026-04-24

Framework refresh to @cyanheads/mcp-ts-core 0.6.16 — adopted directory-based changelog, recursive describe-on-fields lint fixes, synced skills/scripts

0.1.9 — 2026-04-20

Framework refresh to @cyanheads/mcp-ts-core 0.5.3 — format-parity fixes across tools, parseEnvConfig for better env-var validation errors

0.1.8 — 2026-04-19

Tool/resource quality improvements aligned with new framework skill patterns, plus a dependency refresh to mcp-ts-core 0.3.7

0.1.7 — 2026-03-30

Public hosted instance at arxiv.caseyjhand.com/mcp, README tagline rewrite, npm/Docker badges, funding links

0.1.6 — 2026-03-30

arxiv_read_paper max_characters defaults to 100k, strips HTML head/boilerplate before truncation, descriptive input validation

0.1.5 — 2026-03-30

Search reliability — raw-colon field prefixes instead of percent-encoded, better empty-result messaging, mcp-ts-core 0.2.10

0.1.4 — 2026-03-30

mcp-ts-core 0.2.9 refresh, description cleanup (no string concat), Map.groupBy() modernization

0.1.3 — 2026-03-29

Comprehensive test suite (9 files, all tools/resources/services covered); finalized TypeScript build and Vitest config

0.1.2 — 2026-03-28

Full MCP surface implemented — 4 tools, 2 resources, ArxivService with rate-limited request queue and HTML fallback chain

0.1.1 — 2026-03-28

Project metadata, documentation, and packaging finalized for initial publish — README, LICENSE, scoped package name

0.1.0 — 2026-03-28

Initial release — scaffolded from @cyanheads/mcp-ts-core with full MCP surface design for arXiv paper search, metadata, and content reading