Skip to main content
Glama

Check references

check_references
Read-only

Use this when the user wants to check references or citations from any source: a manuscript, a bibliography, a literature review, or citations an AI assistant gave earlier in the conversation. It reports whether each one exists, points to the right paper, or has been retracted, corrected or flagged, for questions like "are these references real?", "is this paper retracted?" or "is this DOI right?". Send citations from earlier in the conversation exactly as given, without correcting them first. Send every reference in the list as its own item, with or without a DOI (one without a DOI is matched by title and first author), with the full text as written, plus its DOI and title when you can read them, and any authors, journal, link, identifier or cite key you can read (the title lets a broken DOI be told apart from a missing work); up to 100 per call. For a whole reference list, such as the References section of an attached paper or a bibliography, send it as written, one reference per line, in reference_list instead of items: every reference in it is checked, in parts when it is long; call again with start_at as the result says until the whole list is done. When the whole original list's count is known, send it as expected_reference_count on every part; do not send a sample or reduce that count to fit a shortened input. Results come from Crossref, the DOI registry and Retraction Watch, and for references without a DOI also Semantic Scholar, PubMed, arXiv and, for books, Open Library; the manuscript itself is not sent. Do not use it to find new sources, to format citations, or to judge whether a source supports a claim. Report as the result's how_to_report says: each status as returned (for example "resolves" or "not found"), explained with the row detail; do not describe results as verified, fabricated or safe to cite. A reference with a DOI is compared by DOI and title only; one without a DOI must match a work by title and author.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "check_references"
  }
}

Input Schema

NameRequiredDescriptionDefault
start_atNoFor reference_list only: the list position to continue from, as the previous result's progress.next_start_at says.
referencesNoThe references to check, one item each. Leave out when sending reference_list.
reference_listNoA whole reference list as written, one reference per line, keeping any numbers: numbered, author-year, BibTeX, RIS or CSL-JSON, for example a paper's whole References section.
expected_reference_countNoThe number of references in the whole original list, when known, not the current part. A differing parsed count stops the check before lookup; resend the complete input rather than lowering this count.

Output Schema

NameRequiredDescriptionDefault
rowsYes
countsYes
progressNo
checked_atYes
licensed_byYes
how_to_reportNo
retraction_data_as_ofYes
retraction_data_completeYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed17 schema fields changed
    • removedOutput schema / properties / licensed_by / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / licensed_by / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / progress / properties / next_start_at / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / progress / properties / next_start_at / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / retraction_data_as_of / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / retraction_data_as_of / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / cite_key / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / cite_key / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / differences / items / properties / cited / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / differences / items / properties / cited / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / differences / items / properties / record / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / differences / items / properties / record / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / doi / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / doi / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / rows / items / properties / notice / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "notice_doi": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "reason": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "type": {
      -        "enum": [
      -          "retraction",
      -          "expression_of_concern",
      -          "correction"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "date",
      -      "reason",
      -      "notice_doi"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "date": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "notice_doi": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "reason": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "enum": [
      +          "retraction",
      +          "expression_of_concern",
      +          "correction"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "date",
      +      "reason",
      +      "notice_doi"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / rows / items / properties / record / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "first_author": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "journal": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "title": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "year": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "title",
      -      "first_author",
      -      "year",
      -      "journal"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "first_author": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "journal": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "title": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "year": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "title",
      +      "first_author",
      +      "year",
      +      "journal"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / rows / items / properties / suggested_record / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "authors": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "citation": {
      -        "type": "string"
      -      },
      -      "doi": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "journal": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "source": {
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "year": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "title",
      -      "authors",
      -      "year",
      -      "journal",
      -      "doi",
      -      "url",
      -      "citation",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "authors": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "citation": {
      +        "type": "string"
      +      },
      +      "doi": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "journal": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "source": {
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "year": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "title",
      +      "authors",
      +      "year",
      +      "journal",
      +      "doi",
      +      "url",
      +      "citation",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare read-only/open-world/non-destructive; the description goes far beyond by naming the lookup backends (Crossref, DOI registry, Retraction Watch, Semantic Scholar, PubMed, arXiv, Open Library) and disclosing that 'the manuscript itself is not sent'. It also states the matching rule (DOI compared by DOI and title only; no-DOI references must match title and author), the 100-per-call limit, the paging contract via start_at, and a reporting constraint ('do not describe results as verified, fabricated or safe to cite').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and trigger phrases, and nearly every sentence carries actionable instruction. The weakness is form: it is a single dense block with instructions, limits, matching rules and reporting rules interleaved, which makes the pagination and reporting guidance harder to locate than a short bulleted layout would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be enumerated, yet the description still tells the agent to follow the result's how_to_report and to re-call with start_at while a list is incomplete. Coverage of privacy, data sources, matching rules, batch limits and reporting obligations leaves no material gap for a zero-required-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, yet the description adds operational meaning the schema cannot: send citations exactly as given without pre-correction, one reference per item, why title matters ('the title lets a broken DOI be told apart from a missing work'), and how to use the interchangeable items/reference_list modes. It also clarifies expected_reference_count semantics ('not the current part ... do not send a sample or reduce that count') and that start_at continues a partial list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('check references or citations') plus the source range (manuscript, bibliography, literature review, earlier AI output) and the outcome reported ('exists, points to the right paper, or has been retracted, corrected or flagged'). It is plainly distinguishable from the sibling review tools, which evaluate manuscripts rather than resolve citations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use with example user questions ('are these references real?', 'is this paper retracted?', 'is this DOI right?') and explicit when-not-to-use ('Do not use it to find new sources, to format citations, or to judge whether a source supports a claim'). It also routes between its own two modes: items for scattered citations, reference_list for a whole References section.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.