arxiv-mcp-server
Server Details
Search arXiv, fetch paper metadata, and read full-text content.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/arxiv-mcp-server
- GitHub Stars
- 4
- Server Listing
- arxiv-mcp-server
Available Tools
4 toolsarxiv_get_metadataArxiv Get MetadataARead-onlyInspect
Get full metadata for one or more arXiv papers by ID. Use when you have known IDs from citations, prior search results, or memory.
| Name | Required | Description | Default |
|---|---|---|---|
| paper_ids | Yes | arXiv paper ID or array of up to 10 IDs. Format: "2401.12345" or "2401.12345v2" (with version). Also accepts legacy IDs like "hep-th/9901001". |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| papers | No | Papers found. May be fewer than requested if some IDs are invalid. |
| not_found | No | Per-input explanations for inputs that could not be returned. Absent when nothing failed. |
| totalSucceeded | No | Number of successful items in 'papers' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already signals that the operation is read-only, so the description doesn't need to repeat safety. The description adds context about the input (known IDs) but doesn't disclose any additional behavioral traits, such as whether the tool returns partial results for invalid IDs, rate limiting, or error handling behavior. Given the annotation coverage, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no waste. The primary purpose is front-loaded, and the usage guidance is compact and specific. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 parameter, no nested objects), and it has an output schema that defines the return structure. The description covers the key input context (known IDs) and the output is handled by the schema. An agent has enough to call the tool correctly. Missing minor details like error cases, but these are not critical for simple tools with annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameter descriptions, including format examples and array constraints. The description itself does not add new semantic information beyond what's in the schema. Since the schema is exhaustive, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get') and resource ('full metadata for one or more arXiv papers by ID'). It distinguishes itself from sibling tools like arxiv_search (which finds papers) and arxiv_read_paper (which reads content) by focusing on metadata retrieval. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Use when you have known IDs from citations, prior search results, or memory.' This tells the agent when to use this tool versus searching. However, it does not explicitly mention when NOT to use it or mention alternative tools (like arxiv_search) by name, which would help further differentiate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arxiv_list_categoriesArxiv List CategoriesARead-onlyInspect
List arXiv category codes and names. Useful for discovering valid category filters for arxiv_search. Lists subject classes only; arxiv_search also accepts a bare archive code (the part before the dot, e.g. "astro-ph" or "cs") to search a whole archive at once.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Filter by top-level group (e.g., "cs", "math", "physics"). Returns all categories if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when the group filter returns no categories. |
| categories | No | arXiv categories matching the filter. |
| totalCount | No | Total number of categories returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses a meaningful behavioral constraint: it lists subject classes only, not full archive codes, and clarifies that arxiv_search accepts bare archive codes. This helps an agent understand the tool's output scope without needing to infer it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose is front-loaded, and the second sentence earns its place by clarifying the relationship between this tool and arxiv_search's archive-code behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter catalog tool with full schema coverage, an output schema, and a readOnly annotation, the description is complete. It explains what is returned, why the tool is useful, and how it relates to the main sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the 'group' parameter fully documented including enum values and the default behavior when omitted. The description adds no parameter-level meaning, which is acceptable given the schema already carries the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'List arXiv category codes and names.' It also explicitly differentiates the tool from arxiv_search by noting this lists subject classes only, giving an agent a clear basis to select it over siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case ('discovering valid category filters for arxiv_search') and explains a relevant boundary: this tool lists subject classes only, while arxiv_search also accepts bare archive codes. It does not explicitly state 'do not use this when...' for other siblings, but the context is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arxiv_read_paperArxiv Read PaperARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| start | No | 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. | |
| paper_id | Yes | arXiv paper ID (e.g., "2401.12345" or "2401.12345v2"). | |
| max_characters | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| start | No | Character offset of the first character in content within the cleaned body. |
| title | No | Paper title (from metadata, not parsed from HTML). |
| source | No | 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. |
| content | No | 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. |
| pdf_url | No | Direct PDF download URL. |
| paper_id | No | arXiv paper ID. |
| truncated | No | True when more body content exists past this slice (start + content.length < body_characters). |
| abstract_url | No | arXiv abstract page URL for attribution. |
| body_characters | No | 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. |
| total_characters | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks the operation as read-only; the description adds material context: the multi-source fallback order, the source field to identify which source answered, and the paging/truncation behavior. These details go well beyond what the annotation provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then fallback behavior, then paging. Every sentence earns its place, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and a readOnlyHint annotation, the description covers all essential behaviors: fallback sources, source field, and paging vs. whole-body options. Remaining details like parameter bounds are in the schema, so nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the paging semantics and the null option, but adds little beyond what the schema's start and max_characters descriptions already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch the full text of an arXiv paper,' naming a specific verb and resource. It clearly distinguishes itself from siblings by focusing on full-text retrieval with a concrete fallback chain, so an agent can tell it apart from search or metadata tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames its role—full-text fetching—and gives concrete guidance on paging with start and max_characters, and on requesting the entire body via max_characters=null. It does not explicitly contrast with sibling tools, but the purpose statement plus sibling names make the context clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arxiv_searchArxiv SearchCRead-onlyInspect
Search arXiv papers by query with category and sort filters. Returns paper metadata including title, authors, abstract, categories, and links.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query. Field prefixes: ti: (title), au: (author — token-based; quote multi-token names like au:"hinton g" or pair with a topical clause to disambiguate common surnames), abs: (abstract), cat: (category — a leaf code matches exactly, a bare archive code such as cat:astro-ph matches its whole subtree), co: (comment), jr: (journal ref), all: (all fields). Boolean operators: AND, OR, ANDNOT. Examples: "au:bengio AND ti:attention", "all:transformer AND cat:cs.CL". | |
| start | No | Pagination offset (0-10000). Use with max_results to page through results. E.g., start=10 with max_results=10 returns results 11-20. Matches beyond offset 10000 + max_results are unreachable by paging — carve the search into submitted_from/submitted_to windows and page within each. | |
| sort_by | No | Sort criterion. Use "submitted" for newest papers, "relevance" for best query matches. | relevance |
| category | No | Restrict results to an arXiv category. A leaf code ("cs.CL", "math.AG") matches exactly. A bare archive code ("astro-ph", "cond-mat", "cs", "math") matches the whole archive — its subject classes plus the legacy flat papers filed before the archive was subdivided. Note "physics" is the general-physics archive (physics.*), not the wider physics group: astro-ph, cond-mat, hep-*, quant-ph and the rest are separate archive codes. Use arxiv_list_categories to discover subject classes. | |
| sort_order | No | Sort direction. "descending" returns newest/most relevant first. | descending |
| max_results | No | Maximum results to return (1-50). Default 10. Each result includes title, authors, abstract, and metadata — keep low to limit response size. | |
| submitted_to | No | Latest submission date to include, inclusive, as a UTC YYYY-MM-DD date. Omit for no upper bound. Both bounds are inclusive, so consecutive windows ("2024-01-01".."2024-01-15" then "2024-01-16".."2024-01-31") cover the matches with no gap; a paper submitted at exactly the midnight seam between two windows appears in both, so de-duplicate collected results by paper id. That is the way to reach matches past the start ceiling: split the date range, then page within each window. | |
| submitted_from | No | Earliest submission date to include, inclusive, as a UTC YYYY-MM-DD date. Omit for no lower bound. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The max_results limit applied to this page. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Papers returned on this page. |
| notice | No | Recovery guidance when results are empty or paging overshot. Absent on successful pages. |
| papers | No | Matching papers with full metadata. |
| pageStart | No | Pagination offset of this result page. |
| truncated | No | True when more matching papers exist beyond this page (totalFound > start + shown). |
| totalFound | No | Total matching papers reported by arXiv (before pagination). |
| effectiveQuery | No | The query as actually searched, carrying every filter applied — the category subtree and submitted-date window folded into arXiv syntax alongside the supplied terms. Replaying it as `query` with no other filters reproduces this exact result set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds no behavioral context beyond that—no rate limits, pagination caveats, or side-effect disclosures. The statement about returning metadata is output-focused, not behavioral.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler and front-loads the core action. The second sentence listing return fields is slightly redundant given the output schema, but the overall structure is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (8 parameters, query syntax, pagination, date windows), but the schema carries that detail and an output schema exists. The description itself is thin on context like when to choose this tool or how search relates to the sibling tools, so it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all eight parameters. The description's mention of 'category and sort filters' adds no meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search arXiv papers') and resource, with scope ('by query with category and sort filters'). It is clear and distinct from sibling tools like arxiv_read_paper, though it does not explicitly name alternatives or contrast with arxiv_get_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus arxiv_get_metadata, arxiv_read_paper, or arxiv_list_categories. There is only an implied use case for searching, with no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
- Changed
arxiv_get_metadata6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "papers", + "totalSucceeded" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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`: None of the requested IDs returned data from arXiv. `version_unavailable`: Every requested ID pinned a version the local mirror does not hold, and live arXiv fallback is disabled. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the request (HTTP 4xx other than 429), e.g. malformed ID syntax. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_match", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "papers", - "totalSucceeded" -]
- Changed
arxiv_list_categories6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "categories", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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.", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "categories", - "totalCount" -]
- Changed
arxiv_read_paper6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "paper_id", + "title", + "content", + "source", + "truncated", + "start", + "total_characters", + "body_characters", + "pdf_url", + "abstract_url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "paper_id", - "title", - "content", - "source", - "truncated", - "start", - "total_characters", - "body_characters", - "pdf_url", - "abstract_url" -]
- Changed
arxiv_search6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "papers", + "effectiveQuery", + "totalFound", + "pageStart" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `unknown_category`: Provided category code is not part of the arXiv taxonomy. `rate_limited`: arXiv has throttled requests (HTTP 429 or \"Rate exceeded.\" body). `invalid_request`: arXiv rejected the request (HTTP 4xx other than 429), typically malformed query syntax. `unsupported_query_syntax`: Query translates to a mirror FTS5 expression the search engine cannot parse, typically two operands juxtaposed across a parenthesized group without an explicit operator. `invalid_date_range`: submitted_from or submitted_to is not a real UTC calendar date, or the window starts after it ends. Other values are possible when a failure originates below the handler.", + "examples": [ + "unknown_category", + "rate_limited", + "invalid_request", + "unsupported_query_syntax", + "invalid_date_range" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "papers", - "effectiveQuery", - "totalFound", - "pageStart" -]
2 tool updates
- Changed
arxiv_read_paper10 fields changed- added
Input schema / properties / max_characters / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / max_characters / descriptionPrevious 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." - removed
Input schema / properties / max_characters / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / max_characters / minimumRemoved value: -1 - removed
Input schema / properties / max_characters / typeRemoved value: -"integer" - changed
Output schema / properties / body_characters / descriptionPrevious 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." - changed
Output schema / properties / content / descriptionPrevious 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." - changed
Output schema / properties / source / descriptionPrevious 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." - changed
Output schema / properties / source / enumPrevious value: -[ - "arxiv_html", - "ar5iv" -]New value: +[ + "arxiv_html", + "ar5iv", + "pdf_text" +] - changed
Output schema / properties / total_characters / descriptionPrevious 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."
- Changed
arxiv_search6 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter results to a specific arXiv category (e.g., \"cs.CL\", \"math.AG\"). Use arxiv_list_categories to discover valid codes."New value: +"Restrict results to an arXiv category. A leaf code (\"cs.CL\", \"math.AG\") matches exactly. A bare archive code (\"astro-ph\", \"cond-mat\", \"cs\", \"math\") matches the whole archive — its subject classes plus the legacy flat papers filed before the archive was subdivided. Note \"physics\" is the general-physics archive (physics.*), not the wider physics group: astro-ph, cond-mat, hep-*, quant-ph and the rest are separate archive codes. Use arxiv_list_categories to discover subject classes." - changed
Input schema / properties / query / descriptionPrevious value: -"Search query. Field prefixes: ti: (title), au: (author — token-based; quote multi-token names like au:\"hinton g\" or pair with a topical clause to disambiguate common surnames), abs: (abstract), cat: (category — exact code match, not fuzzy), co: (comment), jr: (journal ref), all: (all fields). Boolean operators: AND, OR, ANDNOT. Examples: \"au:bengio AND ti:attention\", \"all:transformer AND cat:cs.CL\"."New value: +"Search query. Field prefixes: ti: (title), au: (author — token-based; quote multi-token names like au:\"hinton g\" or pair with a topical clause to disambiguate common surnames), abs: (abstract), cat: (category — a leaf code matches exactly, a bare archive code such as cat:astro-ph matches its whole subtree), co: (comment), jr: (journal ref), all: (all fields). Boolean operators: AND, OR, ANDNOT. Examples: \"au:bengio AND ti:attention\", \"all:transformer AND cat:cs.CL\"." - changed
Input schema / properties / start / descriptionPrevious value: -"Pagination offset (0-10000). Use with max_results to page through results. E.g., start=10 with max_results=10 returns results 11-20."New value: +"Pagination offset (0-10000). Use with max_results to page through results. E.g., start=10 with max_results=10 returns results 11-20. Matches beyond offset 10000 + max_results are unreachable by paging — carve the search into submitted_from/submitted_to windows and page within each." - added
Input schema / properties / submitted_fromAdded value: +{ + "description": "Earliest submission date to include, inclusive, as a UTC YYYY-MM-DD date. Omit for no lower bound.", + "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$", + "type": "string" +} - added
Input schema / properties / submitted_toAdded value: +{ + "description": "Latest submission date to include, inclusive, as a UTC YYYY-MM-DD date. Omit for no upper bound. Both bounds are inclusive, so consecutive windows (\"2024-01-01\"..\"2024-01-15\" then \"2024-01-16\"..\"2024-01-31\") cover the matches with no gap; a paper submitted at exactly the midnight seam between two windows appears in both, so de-duplicate collected results by paper id. That is the way to reach matches past the start ceiling: split the date range, then page within each window.", + "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$", + "type": "string" +} - changed
Output schema / properties / effectiveQuery / descriptionPrevious value: -"The query as sent to arXiv after input normalization."New value: +"The query as actually searched, carrying every filter applied — the category subtree and submitted-date window folded into arXiv syntax alongside the supplied terms. Replaying it as `query` with no other filters reproduces this exact result set."
1 tool update
- Changed
arxiv_get_metadata2 fields changed- changed
Output schema / properties / not_found / items / descriptionPrevious value: -"A requested ID that arXiv did not return."New value: +"A requested ID that could not be returned, with the reason it was missed." - changed
Output schema / properties / not_found / items / properties / reason / enumPrevious value: -[ - "not_in_arxiv" -]New value: +[ + "not_in_arxiv", + "version_not_in_mirror" +]
1 tool update
- Changed
arxiv_search3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The max_results limit applied to this page.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Papers returned on this page.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when more matching papers exist beyond this page (totalFound > start + shown).", + "type": "boolean" +}
2 tool updates
- Changed
arxiv_list_categories3 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when the group filter returns no categories.", + "type": "string" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total number of categories returned.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "categories" -]New value: +[ + "categories", + "totalCount" +]
- Changed
arxiv_search7 fields changed- added
Output schema / properties / effectiveQueryAdded value: +{ + "description": "The query as sent to arXiv after input normalization.", + "type": "string" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance when results are empty or paging overshot. Absent on successful pages.", + "type": "string" +} - added
Output schema / properties / pageStartAdded value: +{ + "description": "Pagination offset of this result page.", + "type": "number" +} - removed
Output schema / properties / startRemoved value: -{ - "description": "Pagination offset of this result set.", - "type": "number" -} - added
Output schema / properties / totalFoundAdded value: +{ + "description": "Total matching papers reported by arXiv (before pagination).", + "type": "number" +} - removed
Output schema / properties / total_resultsRemoved value: -{ - "description": "Total matching papers (may exceed returned count due to pagination).", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "total_results", - "start", - "papers" -]New value: +[ + "papers", + "effectiveQuery", + "totalFound", + "pageStart" +]
1 tool update
- Changed
arxiv_search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query. Supports field prefixes: ti: (title), au: (author), abs: (abstract), cat: (category), co: (comment), jr: (journal ref), all: (all fields). Boolean operators: AND, OR, ANDNOT. Examples: \"au:bengio AND ti:attention\", \"all:transformer AND cat:cs.CL\"."New value: +"Search query. Field prefixes: ti: (title), au: (author — token-based; quote multi-token names like au:\"hinton g\" or pair with a topical clause to disambiguate common surnames), abs: (abstract), cat: (category — exact code match, not fuzzy), co: (comment), jr: (journal ref), all: (all fields). Boolean operators: AND, OR, ANDNOT. Examples: \"au:bengio AND ti:attention\", \"all:transformer AND cat:cs.CL\"."
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Search and download academic papers from arXiv, PubMed, bioRxiv, medRxiv, Google Scholar, Semantic…
Academic research search across PubMed and arXiv
ArXiv preprints + Google Scholar papers, with citation counts in one query.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables searching and retrieving academic papers from arXiv by various criteria including title, author, and category, with support for extracting full text content from PDFs.4MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to search arXiv papers, retrieve metadata, browse categories, and read paper text.4MIT
- AlicenseBqualityDmaintenanceEnables searching academic papers on arXiv and retrieving detailed information such as title, authors, summary, and PDF link.16MIT
- AlicenseNot gradedqualityFmaintenanceEnables searching arXiv papers and retrieving full paper content as Markdown, with smart sorting, category filtering, and pagination.10MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool targets a distinct operation: searching, retrieving metadata by ID, reading full text, and listing categories. There is no overlap between these actions, and even search vs. get_metadata is clearly differentiated by known vs. unknown IDs.
All tools follow a consistent 'arxiv_' prefix with verb-first names in snake_case: arxiv_get_metadata, arxiv_list_categories, arxiv_read_paper, arxiv_search. The pattern is uniform and predictable.
Four tools is a compact set that fully covers the core arXiv workflows without excess. Each tool earns its place, and the count is well within the ideal 3–15 range.
The tool surface covers the essential lifecycle for arXiv: discovery (search), metadata retrieval (get_metadata), content access (read_paper), and category discovery (list_categories). Since arXiv is a read-only service, no update/delete operations are needed, making the set complete.