Skip to main content
Glama

Arxiv Read Paper

arxiv_read_paper
Read-only

Fetch the full text of an arXiv paper. Tries arxiv.org/html first, falls back to ar5iv.labs.arxiv.org, and falls back again to text extracted from the PDF when neither has an HTML render — check the source field to know which one answered. Page through long papers with start and max_characters, or pass max_characters null to get the entire body in one call. To read one section, take the outline from the first page (start 0) and pass an entry's start.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
startNoCharacter offset into the cleaned body to begin reading from. Defaults to 0. Use with max_characters to page through long papers — e.g., start=100000 with max_characters=100000 returns chars 100,000–199,999 — or pass an outline entry's start to read from that heading. The total length is reported as body_characters in the response.
paper_idYesarXiv paper ID: "2401.12345", "2401.12345v2" (a pinned version), or a pre-2007 ID like "hep-th/9901001" (archive spelled as arXiv issued it), optionally prefixed "arXiv:", or an arxiv.org abs, pdf, or html URL, with or without https:// or a ?query or #fragment.
max_charactersNoMaximum characters of paper body to return, counted after boilerplate stripping. Defaults to 100,000; pass null to return the entire body in one call. Whole-paper reads can exceed a client tool-result size cap — math-heavy bodies run 300KB-1MB+ — so prefer the default plus start-based paging unless the full text is needed. When truncated, a notice and the total character count are included.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
startNoCharacter offset of the first character in content within the cleaned body.
titleNoPaper title (from metadata, not parsed from HTML).
sourceNoWhich upstream artifact the body was read from. arxiv_html and ar5iv are HTML renders; pdf_text is text extracted from the PDF, where prose is reliable but math, tables, and heading structure are flattened. ar5iv keeps one render per paper, so an ar5iv body can be another revision than paper_id (see revision_unconfirmed).
contentNoPaper body for the requested slice — the article as cleaned HTML, with relative image, object, and link URLs made absolute (in-page #fragment links stay as written), when source is arxiv_html or ar5iv; plain text when source is pdf_text. Empty when start is past body_characters.
outlineNoSection headings of the whole cleaned body in document order, each with the start that reads from it. Returned only when start is 0. Empty for pdf_text, whose text carries no reliable headings. At most 200 entries — see outline_omitted_levels and outline_continues_at.
pdf_urlNoDirect PDF download URL.
paper_idNoarXiv paper ID.
truncatedNoTrue when more body content exists past this slice (start + content.length < body_characters).
abstract_urlNoarXiv abstract page URL for attribution.
body_charactersNoCharacter count of the full cleaned body. Use with start and max_characters to page. Typically 3-4× smaller than total_characters for math-heavy HTML papers.
total_charactersNoCharacter count of the body before cleaning — the article HTML, without the site header and footer, for arxiv_html and ar5iv; equal to body_characters for pdf_text, which needs no cleaning.
outline_continues_atNoPresent when the shallowest heading level alone has more than 200 headings, so outline stops at its first 200: the start of the first heading left out. Pass it as start to read on from there.
revision_unconfirmedNoPresent, true, when source is ar5iv: ar5iv keeps one render per paper whatever version is asked for, so the body may be another revision than paper_id, while pdf_url is exactly the paper_id revision. Absent for every other source, and for an unversioned read where the arXiv API reported v1 as the only version of the paper.
outline_omitted_levelsNoHeading levels left out of outline because the paper has more than 200 headings, deepest first. Present only when levels were left out.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / revision_unconfirmed / description
      Previous value: -"Present, true, when source is ar5iv: ar5iv keeps one render per paper whatever version is asked for, so the body may be another revision than paper_id, while pdf_url is exactly the paper_id revision. Absent for every other source, and for an unversioned read of a paper whose only version is v1."New value: +"Present, true, when source is ar5iv: ar5iv keeps one render per paper whatever version is asked for, so the body may be another revision than paper_id, while pdf_url is exactly the paper_id revision. Absent for every other source, and for an unversioned read where the arXiv API reported v1 as the only version of the paper."
  2. Changed4 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_id`: paper_id is not an arXiv identifier in an accepted form. `no_match`: Paper ID is not present in the arXiv index. `content_unavailable`: Paper exists but neither arxiv.org/html nor ar5iv has an HTML rendering and arXiv served no PDF either. `pdf_extraction_failed`: Paper has no HTML rendering and its PDF carries no text layer — an image-only or scanned submission. `version_unavailable`: A version-pinned paper_id was requested, arXiv is unreachable, and the local mirror holds only a different version — per-version reads require the live API. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the metadata lookup (HTTP 4xx other than 429). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_id`: paper_id is not an arXiv identifier in an accepted form. `no_match`: Paper ID is not present in the arXiv index. `content_unavailable`: Paper exists but neither arxiv.org/html nor ar5iv has an HTML rendering and arXiv served no PDF either. `pdf_extraction_failed`: Paper has no HTML rendering and its PDF carries no text layer — an image-only or scanned submission. `version_unavailable`: A version-pinned paper_id was requested, arXiv is unreachable, and the local mirror holds only a different version — per-version reads require the live API. `version_not_served`: paper_id pins a superseded version of a pre-2007 paper that arXiv's API answers HTTP 500 for. The version exists, but its metadata cannot be returned. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the metadata lookup (HTTP 4xx other than 429). Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_id",
      -  "no_match",
      -  "content_unavailable",
      -  "pdf_extraction_failed",
      -  "version_unavailable",
      -  "rate_limited",
      -  "invalid_request"
      -]New value: +[
      +  "invalid_id",
      +  "no_match",
      +  "content_unavailable",
      +  "pdf_extraction_failed",
      +  "version_unavailable",
      +  "version_not_served",
      +  "rate_limited",
      +  "invalid_request"
      +]
    • addedOutput schema / properties / revision_unconfirmed
      Added value: +{
      +  "const": true,
      +  "description": "Present, true, when source is ar5iv: ar5iv keeps one render per paper whatever version is asked for, so the body may be another revision than paper_id, while pdf_url is exactly the paper_id revision. Absent for every other source, and for an unversioned read of a paper whose only version is v1.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / source / description
      Previous value: -"Which upstream artifact the body was read from. arxiv_html and ar5iv are HTML renders; pdf_text is text extracted from the PDF, where prose is reliable but math, tables, and heading structure are flattened."New value: +"Which upstream artifact the body was read from. arxiv_html and ar5iv are HTML renders; pdf_text is text extracted from the PDF, where prose is reliable but math, tables, and heading structure are flattened. ar5iv keeps one render per paper, so an ar5iv body can be another revision than paper_id (see revision_unconfirmed)."
  3. Changed9 schema fields changed
    • changedInput schema / properties / paper_id / description
      Previous value: -"arXiv paper ID (e.g., \"2401.12345\" or \"2401.12345v2\")."New value: +"arXiv paper ID: \"2401.12345\", \"2401.12345v2\" (a pinned version), or a pre-2007 ID like \"hep-th/9901001\" (archive spelled as arXiv issued it), optionally prefixed \"arXiv:\", or an arxiv.org abs, pdf, or html URL, with or without https:// or a ?query or #fragment."
    • changedInput schema / properties / start / description
      Previous value: -"Character offset into the cleaned body to begin reading from. Defaults to 0. Use with max_characters to page through long papers — e.g., start=100000 with max_characters=100000 returns chars 100,000–199,999. The total length is reported as body_characters in the response."New value: +"Character offset into the cleaned body to begin reading from. Defaults to 0. Use with max_characters to page through long papers — e.g., start=100000 with max_characters=100000 returns chars 100,000–199,999 — or pass an outline entry's start to read from that heading. The total length is reported as body_characters in the response."
    • changedOutput schema / properties / content / description
      Previous value: -"Paper body for the requested slice — cleaned HTML when source is arxiv_html or ar5iv, plain text when source is pdf_text. Empty when start is past body_characters."New value: +"Paper body for the requested slice — the article as cleaned HTML, with relative image, object, and link URLs made absolute (in-page #fragment links stay as written), when source is arxiv_html or ar5iv; plain text when source is pdf_text. Empty when start is past body_characters."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_match`: Paper ID is not present in the arXiv index. `content_unavailable`: Paper exists but neither arxiv.org/html nor ar5iv has an HTML rendering and arXiv served no PDF either. `pdf_extraction_failed`: Paper has no HTML rendering and its PDF carries no text layer — an image-only or scanned submission. `version_unavailable`: A version-pinned paper_id was requested, arXiv is unreachable, and the local mirror holds only a different version — per-version reads require the live API. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the metadata lookup (HTTP 4xx other than 429), e.g. malformed ID syntax. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_id`: paper_id is not an arXiv identifier in an accepted form. `no_match`: Paper ID is not present in the arXiv index. `content_unavailable`: Paper exists but neither arxiv.org/html nor ar5iv has an HTML rendering and arXiv served no PDF either. `pdf_extraction_failed`: Paper has no HTML rendering and its PDF carries no text layer — an image-only or scanned submission. `version_unavailable`: A version-pinned paper_id was requested, arXiv is unreachable, and the local mirror holds only a different version — per-version reads require the live API. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the metadata lookup (HTTP 4xx other than 429). Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "no_match",
      -  "content_unavailable",
      -  "pdf_extraction_failed",
      -  "version_unavailable",
      -  "rate_limited",
      -  "invalid_request"
      -]New value: +[
      +  "invalid_id",
      +  "no_match",
      +  "content_unavailable",
      +  "pdf_extraction_failed",
      +  "version_unavailable",
      +  "rate_limited",
      +  "invalid_request"
      +]
    • addedOutput schema / properties / outline
      Added value: +{
      +  "description": "Section headings of the whole cleaned body in document order, each with the start that reads from it. Returned only when start is 0. Empty for pdf_text, whose text carries no reliable headings. At most 200 entries — see outline_omitted_levels and outline_continues_at.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A part, chapter, section, subsection, subsubsection, paragraph, appendix, or bibliography heading.",
      +    "properties": {
      +      "level": {
      +        "description": "Heading depth from its tag number minus one: h2 = 1, h3 = 2, and so on to h6 = 5.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "start": {
      +        "description": "Offset of the heading in the cleaned body. Pass as start to read from it.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "title": {
      +        "description": "Heading text with markup removed, e.g. \"3.1 Encoder and Decoder Stacks\"; cut at 120 characters.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "level",
      +      "title",
      +      "start"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / outline_continues_at
      Added value: +{
      +  "description": "Present when the shallowest heading level alone has more than 200 headings, so outline stops at its first 200: the start of the first heading left out. Pass it as start to read on from there.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / outline_omitted_levels
      Added value: +{
      +  "description": "Heading levels left out of outline because the paper has more than 200 headings, deepest first. Present only when levels were left out.",
      +  "items": {
      +    "maximum": 9007199254740991,
      +    "minimum": -9007199254740991,
      +    "type": "integer"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / total_characters / description
      Previous value: -"Character count of the body before cleaning — the unprocessed HTML body for arxiv_html and ar5iv, and equal to body_characters for pdf_text, which needs no cleaning."New value: +"Character count of the body before cleaning — the article HTML, without the site header and footer, for arxiv_html and ar5iv; equal to body_characters for pdf_text, which needs no cleaning."
  4. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "paper_id",
      +      "title",
      +      "content",
      +      "source",
      +      "truncated",
      +      "start",
      +      "total_characters",
      +      "body_characters",
      +      "pdf_url",
      +      "abstract_url"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `no_match`: Paper ID is not present in the arXiv index. `content_unavailable`: Paper exists but neither arxiv.org/html nor ar5iv has an HTML rendering and arXiv served no PDF either. `pdf_extraction_failed`: Paper has no HTML rendering and its PDF carries no text layer — an image-only or scanned submission. `version_unavailable`: A version-pinned paper_id was requested, arXiv is unreachable, and the local mirror holds only a different version — per-version reads require the live API. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the metadata lookup (HTTP 4xx other than 429), e.g. malformed ID syntax. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_match",
      +            "content_unavailable",
      +            "pdf_extraction_failed",
      +            "version_unavailable",
      +            "rate_limited",
      +            "invalid_request"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "paper_id",
      -  "title",
      -  "content",
      -  "source",
      -  "truncated",
      -  "start",
      -  "total_characters",
      -  "body_characters",
      -  "pdf_url",
      -  "abstract_url"
      -]
  5. Changed10 schema fields changed
    • addedInput schema / properties / max_characters / anyOf
      Added value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / max_characters / description
      Previous value: -"Maximum characters of paper body content to return. Defaults to 100,000. HTML head/boilerplate is stripped before counting. When truncated, a notice and total character count are included."New value: +"Maximum characters of paper body to return, counted after boilerplate stripping. Defaults to 100,000; pass null to return the entire body in one call. Whole-paper reads can exceed a client tool-result size cap — math-heavy bodies run 300KB-1MB+ — so prefer the default plus start-based paging unless the full text is needed. When truncated, a notice and the total character count are included."
    • removedInput schema / properties / max_characters / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / max_characters / minimum
      Removed value: -1
    • removedInput schema / properties / max_characters / type
      Removed value: -"integer"
    • changedOutput schema / properties / body_characters / description
      Previous value: -"Character count of the full cleaned body HTML. Use with start and max_characters to page. Typically 3-4× smaller than total_characters for math-heavy papers."New value: +"Character count of the full cleaned body. Use with start and max_characters to page. Typically 3-4× smaller than total_characters for math-heavy HTML papers."
    • changedOutput schema / properties / content / description
      Previous value: -"Cleaned paper body HTML for the requested slice. Empty when start is past body_characters."New value: +"Paper body for the requested slice — cleaned HTML when source is arxiv_html or ar5iv, plain text when source is pdf_text. Empty when start is past body_characters."
    • changedOutput schema / properties / source / description
      Previous value: -"Which HTML source the content was fetched from."New value: +"Which upstream artifact the body was read from. arxiv_html and ar5iv are HTML renders; pdf_text is text extracted from the PDF, where prose is reliable but math, tables, and heading structure are flattened."
    • changedOutput schema / properties / source / enum
      Previous value: -[
      -  "arxiv_html",
      -  "ar5iv"
      -]New value: +[
      +  "arxiv_html",
      +  "ar5iv",
      +  "pdf_text"
      +]
    • changedOutput schema / properties / total_characters / description
      Previous value: -"Character count of the original unprocessed HTML body."New value: +"Character count of the body before cleaning — the unprocessed HTML body for arxiv_html and ar5iv, and equal to body_characters for pdf_text, which needs no cleaning."
  6. Changed6 schema fields changed
    • addedInput schema / properties / start
      Added value: +{
      +  "default": 0,
      +  "description": "Character offset into the cleaned body to begin reading from. Defaults to 0. Use with max_characters to page through long papers — e.g., start=100000 with max_characters=100000 returns chars 100,000–199,999. The total length is reported as body_characters in the response.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / body_characters / description
      Previous value: -"Character count of the cleaned body HTML — what fits into max_characters. Typically 3-4× smaller than total_characters for math-heavy papers."New value: +"Character count of the full cleaned body HTML. Use with start and max_characters to page. Typically 3-4× smaller than total_characters for math-heavy papers."
    • changedOutput schema / properties / content / description
      Previous value: -"Cleaned paper body HTML, truncated to max_characters."New value: +"Cleaned paper body HTML for the requested slice. Empty when start is past body_characters."
    • addedOutput schema / properties / start
      Added value: +{
      +  "description": "Character offset of the first character in content within the cleaned body.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / truncated / description
      Previous value: -"Whether content was truncated due to max_characters."New value: +"True when more body content exists past this slice (start + content.length < body_characters)."
    • changedOutput schema / required
      Previous value: -[
      -  "paper_id",
      -  "title",
      -  "content",
      -  "source",
      -  "truncated",
      -  "total_characters",
      -  "body_characters",
      -  "pdf_url",
      -  "abstract_url"
      -]New value: +[
      +  "paper_id",
      +  "title",
      +  "content",
      +  "source",
      +  "truncated",
      +  "start",
      +  "total_characters",
      +  "body_characters",
      +  "pdf_url",
      +  "abstract_url"
      +]
  7. Changed4 schema fields changed
    • addedOutput schema / properties / body_characters
      Added value: +{
      +  "description": "Character count of the cleaned body HTML — what fits into max_characters. Typically 3-4× smaller than total_characters for math-heavy papers.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / content / description
      Previous value: -"Raw HTML content of the paper."New value: +"Cleaned paper body HTML, truncated to max_characters."
    • changedOutput schema / properties / total_characters / description
      Previous value: -"Total character count of the full (untruncated) content."New value: +"Character count of the original unprocessed HTML body."
    • changedOutput schema / required
      Previous value: -[
      -  "paper_id",
      -  "title",
      -  "content",
      -  "source",
      -  "truncated",
      -  "total_characters",
      -  "pdf_url",
      -  "abstract_url"
      -]New value: +[
      +  "paper_id",
      +  "title",
      +  "content",
      +  "source",
      +  "truncated",
      +  "total_characters",
      +  "body_characters",
      +  "pdf_url",
      +  "abstract_url"
      +]
  8. Changed3 schema fields changed
    • addedInput schema / properties / max_characters / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / max_characters / minimum
      Added value: +1
    • changedInput schema / properties / max_characters / type
      Previous value: -"number"New value: +"integer"
  9. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.