Skip to main content
Glama

Check cited links or quotations in supplied source text, without AI

checkCitations
Read-only

Check cited links or quotations in supplied source text, without AI. Use this to check 1-10 cited public HTTPS links before relying on them, in one call. Send urls to check links, or citations to also check a quotation per link: each quote is matched against the same retrieval with Quote Checker's literal rules (case, punctuation, and word boundaries preserved; whitespace normalized) and returns up to three original passages with offsets and, for PDFs, page numbers. Returns, per link, the final URL, redirects, HTTP status, content type, title, content hash, and a specific failure reason. Readable means the reader got extractable text; it does not show the page is accurate or supports a claim. A quote match means the words appear, not that they support the claim. Failed means this reader could not read it, which can mean a dead link or a site that refuses automated requests, needs JavaScript or a login, or disallows BOZOSReader in robots.txt; its quotation is then unchecked (quote_check null). Uses the guarded Source Reader. Content is not retained. Repeat a URL for multiple quotations: each distinct requested URL is read once per batch (fragments ignored, query strings preserved, redirect aliases kept separate). Sources are retrieved again in later requests. Optional unique citation ids are echoed on success and failure. Results explain offsets, matching rules, checked text representation and lengths, and distinguish matches_truncated from source_truncated. Inspect individual results even when HTTP or MCP reports a successful batch. For text your agent already has, send sources [{id,source_text,source_truncated?}] and citations [{source_id,quote,id?}]. Several citations can share a source_id. These checks make no source-fetch requests and return status supplied_text, null URL/HTTP/retrieval metadata, and a checked_text_sha256; they do not verify origin or authenticity. Mixed URL and supplied-text batches are allowed. summary.supplied counts supplied-text entries separately from readable URLs. Set source_truncated true for excerpts or incomplete input so missing quotations remain inconclusive. All supplied text is checked literally, including markup. Use POST or MCP for text; encoded GET bodies are also supported. Entire requests, including JSON/MCP overhead, are limited to 64 KiB. Failed URL entries carry upstream metadata (including robots-versus-source stage and Retry-After seconds) and a recovery hint. Delays belong to individual entries; a mixed batch never sets a whole-response Retry-After or retries sources automatically. To read a page before choosing quotations, call readSource with include_quote_source:true, then supply its quote_source.source_text and source_truncated without refetching. Retain the original reader response for URL provenance; submitted text is still labeled supplied_text. Same as POST https://bozos.si/api/v1/citation-check.

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": "checkCitations"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlsNoPublic HTTPS URLs to check, 1-10, in order, without quotations. Each uses the guarded Source Reader: robots.txt is respected, at most three redirects are followed, and scripts are not run.
sourcesNoOptional caller-supplied sources, only with citations. Refer to each by source_id. No URL provenance is accepted or verified. The entire request must fit within 64 KiB.
citationsNo1–10 citations in result order. Use url with optional quote, or source_id with required quote. Repeated URLs share a retrieval; source_id references reuse the supplied text. Optional citation ids must be unique.

Output Schema

NameRequiredDescriptionDefault
safetyYes
resultsYes
summaryYesCounts citation entries, including repeats. total = readable + failed + supplied (treat omitted supplied as 0). Supplied text is not counted as a readable URL.
interpretationYes
schema_versionYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / results / items / properties / recovery
      Added value: +{
      +  "description": "Suggested next step after a source failure. BOZOS does not retry or wait automatically. retry_later may succeed but is not guaranteed; honor upstream delay and client budgets. use_supplied_text refers only to text the caller is authorized to supply.",
      +  "enum": [
      +    "check_request",
      +    "check_url",
      +    "respect_robots",
      +    "retry_later",
      +    "use_supplied_text",
      +    "review_source"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / upstream
      Added value: +{
      +  "description": "Present for failed source checks; null if no failing HTTP response was recorded. A robots response is not the page status.",
      +  "properties": {
      +    "http_status": {
      +      "maximum": 599,
      +      "minimum": 100,
      +      "type": "integer"
      +    },
      +    "retry_after_seconds": {
      +      "description": "Parsed upstream Retry-After: nonnegative seconds or an HTTP-date converted to seconds at receipt, rounded up. Null for missing, malformed, or unrepresentable values; zero is a known elapsed/zero delay.",
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "stage": {
      +      "enum": [
      +        "robots",
      +        "source"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "stage",
      +    "http_status",
      +    "retry_after_seconds"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  2. Changed18 schema fields changed
    • addedInput schema / description
      Added value: +"Supply exactly one of urls or citations. Optional sources requires citations; source_id references must exist and supplied-text citations require quote. Source IDs and citation IDs must each be unique in their own list."
    • addedInput schema / properties / citations
      Added value: +{
      +  "description": "1–10 citations in result order. Use url with optional quote, or source_id with required quote. Repeated URLs share a retrieval; source_id references reuse the supplied text. Optional citation ids must be unique.",
      +  "items": {
      +    "additionalProperties": false,
      +    "oneOf": [
      +      {
      +        "not": {
      +          "required": [
      +            "source_id"
      +          ]
      +        },
      +        "required": [
      +          "url"
      +        ]
      +      },
      +      {
      +        "not": {
      +          "required": [
      +            "url"
      +          ]
      +        },
      +        "required": [
      +          "source_id",
      +          "quote"
      +        ]
      +      }
      +    ],
      +    "properties": {
      +      "id": {
      +        "description": "Optional non-blank citation identifier, unique within the batch; echoed unchanged on success and failure.",
      +        "maxLength": 128,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "quote": {
      +        "description": "The exact words attributed to this source.",
      +        "maxLength": 4000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "source_id": {
      +        "description": "References an id in sources. Use exactly one of url or source_id; source_id requires quote. No URL is fetched for this entry.",
      +        "maxLength": 128,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "url": {
      +        "format": "uri",
      +        "maxLength": 4096,
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / sources
      Added value: +{
      +  "description": "Optional caller-supplied sources, only with citations. Refer to each by source_id. No URL provenance is accepted or verified. The entire request must fit within 64 KiB.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "description": "Non-blank source identifier, unique in sources.",
      +        "maxLength": 128,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "source_text": {
      +        "description": "Non-blank text checked literally, preserving original whitespace and offsets. Share it across citations instead of repeating the text. No markup removal, fetching, or code execution.",
      +        "maxLength": 100000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "source_truncated": {
      +        "default": false,
      +        "description": "Set true for an excerpt or incomplete source. A missing quotation is then inconclusive for the complete source.",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "source_text"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / urls / description
      Previous value: -"Public HTTPS URLs to check, 1-10, in order. Each uses the guarded Source Reader: robots.txt is respected, at most three redirects are followed, and scripts are not run."New value: +"Public HTTPS URLs to check, 1-10, in order, without quotations. Each uses the guarded Source Reader: robots.txt is respected, at most three redirects are followed, and scripts are not run."
    • removedInput schema / required
      Removed value: -[
      -  "urls"
      -]
    • addedOutput schema / properties / results / items / properties / id
      Added value: +{
      +  "description": "Optional non-blank citation identifier, unique within the batch; echoed unchanged on success and failure.",
      +  "maxLength": 128,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / quote
      Added value: +{
      +  "description": "The quotation as supplied, when one was sent.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / quote_check
      Added value: +{
      +  "description": "Present when a quote was sent; null when the link could not be read.",
      +  "properties": {
      +    "checked_text_sha256": {
      +      "pattern": "^[a-f0-9]{64}$",
      +      "type": "string"
      +    },
      +    "match_counts": {
      +      "properties": {
      +        "exact": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "normalized": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "total": {
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "total",
      +        "exact",
      +        "normalized"
      +      ],
      +      "type": "object"
      +    },
      +    "matched": {
      +      "description": "Null when the source was truncated and the quote was not found in the checked part.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "matches": {
      +      "items": {
      +        "properties": {
      +          "after": {
      +            "type": "string"
      +          },
      +          "before": {
      +            "type": "string"
      +          },
      +          "end": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "kind": {
      +            "enum": [
      +              "exact_match",
      +              "normalized_match"
      +            ],
      +            "type": "string"
      +          },
      +          "line_end": {
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "line_start": {
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "page_end": {
      +            "description": "PDF sources only: one-based page where the match ends.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "page_start": {
      +            "description": "PDF sources only: one-based page where the match starts.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "start": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "text": {
      +            "type": "string"
      +          },
      +          "utf16_end": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "utf16_start": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "start",
      +          "end",
      +          "utf16_start",
      +          "utf16_end",
      +          "line_start",
      +          "line_end",
      +          "text",
      +          "before",
      +          "after",
      +          "kind"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 3,
      +      "type": "array"
      +    },
      +    "matches_truncated": {
      +      "description": "More passages matched than the three returned; this does not indicate an incomplete source.",
      +      "type": "boolean"
      +    },
      +    "matching": {
      +      "properties": {
      +        "case_sensitive": {
      +          "const": true,
      +          "type": "boolean"
      +        },
      +        "fuzzy_matching": {
      +          "const": false,
      +          "type": "boolean"
      +        },
      +        "normalize_whitespace": {
      +          "const": true,
      +          "type": "boolean"
      +        },
      +        "punctuation_sensitive": {
      +          "const": true,
      +          "type": "boolean"
      +        },
      +        "word_boundaries": {
      +          "const": true,
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "normalize_whitespace",
      +        "case_sensitive",
      +        "punctuation_sensitive",
      +        "word_boundaries",
      +        "fuzzy_matching"
      +      ],
      +      "type": "object"
      +    },
      +    "offsets": {
      +      "properties": {
      +        "end": {
      +          "type": "string"
      +        },
      +        "lines": {
      +          "type": "string"
      +        },
      +        "pages": {
      +          "type": "string"
      +        },
      +        "relative_to": {
      +          "type": "string"
      +        },
      +        "start": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "utf16": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "unit",
      +        "start",
      +        "end",
      +        "utf16",
      +        "lines",
      +        "relative_to"
      +      ],
      +      "type": "object"
      +    },
      +    "source": {
      +      "properties": {
      +        "characters": {
      +          "description": "Unicode code points checked.",
      +          "maximum": 100000,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "full_characters": {
      +          "description": "Code points in the full extraction or submitted text before any checker output limit; for incomplete supplied text the original document length is unknown.",
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "representation": {
      +          "enum": [
      +            "extracted_html_text",
      +            "literal_text",
      +            "pdf_text_layer",
      +            "supplied_text"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "representation",
      +        "characters",
      +        "full_characters"
      +      ],
      +      "type": "object"
      +    },
      +    "source_truncated": {
      +      "description": "Only part of the original source is represented: a fetched extraction exceeded the limit, or the caller declared supplied text incomplete. Missing quotations are inconclusive.",
      +      "type": "boolean"
      +    },
      +    "status": {
      +      "enum": [
      +        "exact_match",
      +        "normalized_match",
      +        "not_found",
      +        "source_truncated"
      +      ],
      +      "type": "string"
      +    },
      +    "warnings": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "matched",
      +    "match_counts",
      +    "matches",
      +    "checked_text_sha256",
      +    "source_truncated",
      +    "warnings",
      +    "matches_truncated",
      +    "matching",
      +    "offsets",
      +    "source"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / source_id
      Added value: +{
      +  "description": "Supplied source identifier, present only for supplied-text results.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / status / description
      Added value: +"readable: URL was fetched and text extracted; supplied_text: caller-provided text was checked without a fetch; failed: URL could not be read."
    • changedOutput schema / properties / results / items / properties / status / enum
      Previous value: -[
      -  "readable",
      -  "failed"
      -]New value: +[
      +  "readable",
      +  "failed",
      +  "supplied_text"
      +]
    • changedOutput schema / properties / results / items / properties / url / description
      Previous value: -"The URL as supplied."New value: +"URL as supplied for URL citations; null for supplied-text citations."
    • changedOutput schema / properties / results / items / properties / url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / maxItems
      Added value: +10
    • addedOutput schema / properties / results / minItems
      Added value: +1
    • addedOutput schema / properties / summary / description
      Added value: +"Counts citation entries, including repeats. total = readable + failed + supplied (treat omitted supplied as 0). Supplied text is not counted as a readable URL."
    • addedOutput schema / properties / summary / properties / quotes
      Added value: +{
      +  "description": "Present when citations were sent with quotes.",
      +  "properties": {
      +    "checked": {
      +      "type": "integer"
      +    },
      +    "found": {
      +      "type": "integer"
      +    },
      +    "inconclusive": {
      +      "type": "integer"
      +    },
      +    "not_found": {
      +      "type": "integer"
      +    },
      +    "unchecked": {
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / summary / properties / supplied
      Added value: +{
      +  "description": "Present only when supplied-text citations were checked; counts these entries separately from fetched readable URLs.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
  3. Added

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavior: robots.txt is respected, redirects are limited, scripts are not run, content is not retained, request size is capped at 64 KiB, failed entries may be due to JavaScript/login/robots blocking, and failed URLs leave quotations unchecked. It also explains quote matching semantics and inconclusive supplied-text cases, which is unusually rich behavioral context.

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

Conciseness3/5

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

The description is front-loaded with purpose and usage, but it becomes a very dense single paragraph with many closely packed caveats and edge cases. Most details are useful for this complex tool, yet the structure is hard to scan and some information could be organized more cleanly.

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?

Given the tool's complexity, annotations, full schema coverage, and output schema, the description is complete enough to call correctly. It covers batch shape, URL versus supplied-text modes, failure modes, quote-check limitations, request size, and how to interpret readable or matching results.

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

Parameters4/5

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

Schema coverage is already 100%, but the description adds meaningful batch semantics not fully captured there: repeated URLs share one retrieval per batch, fragments are ignored, query strings are preserved, redirect aliases are kept separate, and mixed URL/supplied-text batches are allowed. It also clarifies source_truncated and id echoing behavior, adding real value beyond the schema.

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?

The definition states a specific verb and resource: checking cited links or quotations in supplied source text, without AI. It also clarifies batch scope (1-10 public HTTPS links) and distinguishes URL checks from supplied-text citation checks, so an agent can identify the tool's role without opening the schema.

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

Usage Guidelines4/5

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

It gives clear usage conditions: check cited public HTTPS links before relying on them, send urls for link checks or citations for quotations, and use sources/citations for text the agent already has. It also points to readSource as an alternative for reading a page before choosing quotations, though it does not explicitly name when to prefer the sibling checkQuote or when not to use this tool.

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.

Resources