---
title: MCP server
description: A stateless MCP server at https://mcp.arxivv.org/mcp (also https://arxivv.org/mcp) with seven tools for reading papers by anchor.
sidebar:
  order: 8
---

arXivv runs a [Model Context Protocol](https://modelcontextprotocol.io) server built on the document tree.

| Property   | Value                                                                             |
| ---------- | --------------------------------------------------------------------------------- |
| Endpoint   | `https://mcp.arxivv.org/mcp`                                                      |
| Alias      | `https://arxivv.org/mcp`, proxied to the endpoint above                           |
| Transport  | Streamable HTTP, JSON responses                                                   |
| Sessions   | Stateless: every call stands alone                                                |
| Auth       | None                                                                              |
| Tools      | All read-only                                                                     |
| Rate limit | Requests through `arxivv.org/mcp` share the [HTTP rate limit](/errors-and-limits) |

## Connect

```json
{
  "mcpServers": {
    "arxivv": {
      "type": "http",
      "url": "https://mcp.arxivv.org/mcp"
    }
  }
}
```

With Claude Code:

```bash
claude mcp add --transport http arxivv https://mcp.arxivv.org/mcp
```

## Tools

`paper` is any paper reference: `1706.03762`, `1706.03762v7` or `hep-th/9901001`. Without a version, the latest is used.

| Tool           | Input                           | Output                                                                                           |
| -------------- | ------------------------------- | ------------------------------------------------------------------------------------------------ |
| `outline`      | `{ paper, wait? }`              | [`Outline`](/json#outline) as JSON                                                               |
| `read`         | `{ paper, anchor, maxTokens? }` | One section's Markdown, heading included                                                         |
| `cite`         | `{ paper, anchor }`             | `{ text, url, anchor }`: plain text of one paragraph or section, its section URL and resolved id |
| `references`   | `{ paper, id? }`                | `{ idv, references: Reference[] }`, or one `Reference` when `id` is given                        |
| `figure`       | `{ paper, anchor }`             | [`FigureJson`](/json#other-shapes), or `TableJson` for a table                                   |
| `equation`     | `{ paper, anchor }`             | `{ id, number, latex }`; `number` is `null` when the equation is unnumbered                      |
| `search_paper` | `{ paper, query, limit? }`      | `[{ anchor, sectionId, snippet }]`: the best-matching paragraphs                                 |

### Arguments

| Tool           | Argument    | Accepts                                                                                                     |
| -------------- | ----------- | ----------------------------------------------------------------------------------------------------------- |
| `outline`      | `wait`      | Integer 0–60: seconds to wait for inferred fields, as `Prefer: wait=N`. See [first request](/first-request) |
| `read`         | `anchor`    | Section id (`S3.SS2`), alias (`S3.2`), `A1` or a title slug (`introduction`)                                |
| `read`         | `maxTokens` | Integer 100–100000, default 8000 (chars/4)                                                                  |
| `cite`         | `anchor`    | Paragraph id (`S3.SS2.p3`) or section id, alias or slug                                                     |
| `references`   | `id`        | Reference id (`bib.bib12`) or printed number (`12` or `[12]`)                                               |
| `figure`       | `anchor`    | Figure id (`S3.F1`) or `F<n>`; table id (`S6.T2`) or `T<n>`                                                 |
| `equation`     | `anchor`    | Equation id (`S3.E1`) or `E<n>`                                                                             |
| `search_paper` | `query`     | Words to look for, e.g. `label smoothing`                                                                   |
| `search_paper` | `limit`     | Integer 1–50, default 5                                                                                     |

### Behaviour

- **`read` truncation:** output longer than `maxTokens × 4` characters is cut and ends with `…[truncated: N more tokens; fetch /1706.03762v7/sections/S3.2.md]`.
- **`cite` URL:** `url` is `https://arxivv.org/<idv>/sections/<sectionId>.md`, where `<idv>` is the resolved version and `<sectionId>` the enclosing section's id. `anchor` is the cited node's id. For example, `S3.SS2.p1` returns `url: "https://arxivv.org/1706.03762v7/sections/S3.SS2.md"` and `anchor: "S3.SS2.p1"`. The Markdown has no in-page anchors, so the URL carries no fragment.
- **`figure` resolves tables too:** `T<n>` and table ids return a `TableJson` with its cells.
- **`search_paper` ranking:** the query is split on whitespace into lowercase terms. Paragraphs that contain more distinct terms rank first, then those with more total occurrences. Each snippet is about 150 characters either side of the first match. It searches one paper, by substring; it is not semantic.
- **Errors:** a failed call returns `isError: true` with text such as `not-found: Unknown paper 1706.99999` (the HTTP [error code](/errors-and-limits) and detail).

## Typical flow

1. `outline({ paper: "1706.03762" })`: title, TL;DR, contributions and the section tree with token counts.
2. `read({ paper: "1706.03762", anchor: "S3.2" })`: only the section you need.
3. `search_paper({ paper: "1706.03762", query: "label smoothing" })`: find paragraph anchors.
4. `cite({ paper: "1706.03762", anchor: "S3.SS2.p1" })`: exact text plus a stable URL to quote.
5. `figure({ paper: "1706.03762", anchor: "F1" })` or `equation({ paper: "1706.03762", anchor: "E1" })` as needed.

A typical question costs ~3K tokens this way, against ~15K for the full paper.

## Example

```json
{
  "method": "tools/call",
  "params": {
    "name": "equation",
    "arguments": { "paper": "1706.03762", "anchor": "E1" }
  }
}
```

```json
{
  "id": "S3.E1",
  "number": "1",
  "latex": "\\mathrm{Attention}(Q,K,V)=\\mathrm{softmax}\\left(\\frac{QK^{T}}{\\sqrt{d_{k}}}\\right)V"
}
```

Tool outputs follow [schema 1](/json#compatibility).
