Skip to main content
Glama

Scholar Sidekick

Audit Bibliography

auditBibliography
Read-onlyIdempotent

Verify a WHOLE bibliography in one call — the batch counterpart to verifyCitation. Each entry runs the same fabrication check (real, resolvable identifier paired with a title that does NOT match the resolved paper; Topaz et al., Lancet 2026) plus a retraction lookup, and the tool returns a per-entry verdict table and a corpus summary. Use when the user pastes a reference list, a .bib / .ris file, or asks to 'check all these citations at once' / 'audit my bibliography' / 'which of these references are fake or retracted'. Input: EITHER bibliography (raw BibTeX / RIS / CSL-JSON text — format auto-detected) OR claims (an array of pre-parsed {title + identifier} objects), not both. Capped at 25 entries per call; excess is dropped and reported via truncated. checks defaults to ['retraction'] (pass [] to skip); screenWithLlm opt-in per entry (same auth gating as verifyCitation). Returns: { format, entries: [{ index, sourceKey?, status: 'ok'|'error', verdict: 'matched' | 'mismatch' | 'not_found' | 'ambiguous', confidence, matched, mismatches, retraction: { checked, doi, isRetracted, hasCorrections, hasConcern, notices } | null, provenance }], parseErrors: [{ index, error, message }], truncated, summary: { total, matched, mismatch, ambiguous, not_found, not_checked, errored, retracted } }. not_checked counts entries declined before a verdict (no identifier, container-only identifier, too sparse) — report them as unverified, never as suspect. Reading the result: index is 1-BASED (entry 1 is the first reference) — do not add 1 again when reporting it. sourceKey is the entry's own key in the source file (BibTeX cite key, RIS ID, CSL-JSON id) and is the reliable way to point a user at the offending reference; it is absent on the claims[] path. entries and parseErrors share one index space, so a given input position appears in exactly one of them — report parseErrors as UNCHECKED, never as clean. summary.total counts verifiable entries only, excluding parseErrors and anything past the cap; summary.retracted is a separate axis from the verdict counts (an entry can be both matched and retracted), so never sum those fields. A non-zero truncated means the audit is incomplete — split the bibliography and call again. Per-entry leniency: one entry that fails to resolve becomes status:'error' without failing the batch. This audits citation IDENTITY (does each identifier resolve to the claimed work, and is it retracted) — it does NOT check whether a source supports the claim it is cited for. Read-only and idempotent. Works anonymously for the non-LLM path; SCHOLAR_API_KEY (a free ssk key from https://scholar-sidekick.com/account) or a paid RapidAPI tier raises rate limits and enables the optional LLM screen.

Input Schema

NameRequiredDescriptionDefault
checksNoPer-entry enrichment checks. Defaults to ['retraction'] (flags retracted / corrected / expression-of-concern works via Crossref + Retraction Watch, keyed on each resolved DOI). Pass [] to skip the retraction lookup.
claimsNoPre-parsed citations to audit — an alternative to `bibliography` for agents that already hold structured references. Each needs a `title` plus whatever identifiers the citation carries.
formatNoOverride format auto-detection for `bibliography`.
bibliographyNoRaw bibliography text to parse and audit — BibTeX, RIS, CSL-JSON, or a plain-text reference list (one reference per line, numbered, or blank-line separated). Provide EITHER this or `claims`, not both. Format is auto-detected from the content; override with `format`. Plain text is split into one entry per reference and each is checked against the record its identifier resolves to; a reference without an identifier is reported as not checked. Capped at 25 entries per call (excess is dropped and reported via `truncated`).
screenWithLlmNoOpt-in Stage 3 LLM screen applied per entry (same gating as verifyCitation: authenticated first-party key or paid RapidAPI tier). Default false.
semanticTitleNoOpt-in semantic title check applied per entry (any tier; see verifyCitation). Default false.

Output Schema

NameRequiredDescriptionDefault
formatNoDetected input format ('bibtex' | 'ris' | 'csl-json'), or null for the claims[] path and for plain-text input.
entriesNoOne result per verifiable entry: { index, sourceKey?, status: 'ok'|'error', verdict, confidence, matched, mismatches, retraction, _provenance }. `index` is 1-BASED and counts position in the submitted input, so entry 1 is the first reference — do not add 1 again when you report it to a user. `sourceKey` is the entry's own key in the source file (BibTeX cite key, RIS `ID`, or CSL-JSON `id`) and is the reliable way to map a verdict back to the user's bibliography; it is absent on the claims[] path and on formats that carry no key. `status:'error'` means that one entry failed to verify, not that the batch failed. Entries appear in input order.
summaryNoCorpus roll-up: { total, matched, mismatch, ambiguous, not_found, not_checked, errored, retracted }. `total` counts verifiable entries only, so it excludes `parseErrors` and anything past the cap. `not_found` = looked up and nothing exists; `not_checked` = declined before a verdict (no identifier in the reference, a container-only identifier, or too sparse to check) — tell the user those were NOT verified rather than treating them as suspect. `retracted` is a separate axis from the verdict counts, and an entry can be both matched and retracted — never add the fields together.
truncatedNoCount of entries dropped beyond the 25-entry cap. Non-zero means the audit is incomplete — split the bibliography and call again for the rest.
parseErrorsNoEntries that could not be parsed or lacked a title: { index, error, message }. Same 1-based `index` space as `entries`, so the two arrays never collide: a given input position appears in exactly one of them. Report these to the user as unchecked, NOT as clean.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / bibliography / description
      Previous value: -"Raw bibliography text to parse and audit — BibTeX, RIS, or CSL-JSON. Provide EITHER this or `claims`, not both. Format is auto-detected from the content; override with `format`. Capped at 25 entries per call (excess is dropped and reported via `truncated`)."New value: +"Raw bibliography text to parse and audit — BibTeX, RIS, CSL-JSON, or a plain-text reference list (one reference per line, numbered, or blank-line separated). Provide EITHER this or `claims`, not both. Format is auto-detected from the content; override with `format`. Plain text is split into one entry per reference and each is checked against the record its identifier resolves to; a reference without an identifier is reported as not checked. Capped at 25 entries per call (excess is dropped and reported via `truncated`)."
    • changedOutput schema / properties / format / description
      Previous value: -"Detected input format ('bibtex' | 'ris' | 'csl-json'), or null for the claims[] path."New value: +"Detected input format ('bibtex' | 'ris' | 'csl-json'), or null for the claims[] path and for plain-text input."
  2. Changed1 schema field changed
    • changedOutput schema / properties / summary / description
      Previous value: -"Corpus roll-up: { total, matched, mismatch, ambiguous, not_found, errored, retracted }. `total` counts verifiable entries only, so it excludes `parseErrors` and anything past the cap. `retracted` is a separate axis from the verdict counts, and an entry can be both matched and retracted — never add the fields together."New value: +"Corpus roll-up: { total, matched, mismatch, ambiguous, not_found, not_checked, errored, retracted }. `total` counts verifiable entries only, so it excludes `parseErrors` and anything past the cap. `not_found` = looked up and nothing exists; `not_checked` = declined before a verdict (no identifier in the reference, a container-only identifier, or too sparse to check) — tell the user those were NOT verified rather than treating them as suspect. `retracted` is a separate axis from the verdict counts, and an entry can be both matched and retracted — never add the fields together."
  3. Changed1 schema field changed
    • addedInput schema / properties / semanticTitle
      Added value: +{
      +  "description": "Opt-in semantic title check applied per entry (any tier; see verifyCitation). Default false.",
      +  "type": "boolean"
      +}
  4. Changed16 schema fields changed
    • addedInput schema / properties / claims / items / properties / ads / description
      Added value: +"NASA ADS bibcode, e.g. '2019A&A...625A.135L'."
    • addedInput schema / properties / claims / items / properties / arxiv / description
      Added value: +"arXiv ID, e.g. '2301.00001' or 'arXiv:2301.00001'."
    • changedInput schema / properties / claims / items / properties / author / description
      Previous value: -"First-author family name as cited."New value: +"First-author family name as cited. Refines the comparison; a disagreement here can downgrade a verdict to 'ambiguous'."
    • addedInput schema / properties / claims / items / properties / container / description
      Added value: +"Journal or book title as cited. Refinement only, same role as `year`."
    • addedInput schema / properties / claims / items / properties / doi / description
      Added value: +"DOI as cited, with or without a prefix ('10.1038/nphys1170' or a doi.org URL)."
    • addedInput schema / properties / claims / items / properties / isbn / description
      Added value: +"ISBN-10 or ISBN-13; hyphens are tolerated."
    • addedInput schema / properties / claims / items / properties / issn / description
      Added value: +"ISSN of the containing journal. Identifies a container, not a paper, so it cannot resolve an entry on its own — supply it alongside another identifier."
    • addedInput schema / properties / claims / items / properties / pmcid / description
      Added value: +"PubMed Central ID, e.g. 'PMC1234567'."
    • addedInput schema / properties / claims / items / properties / pmid / description
      Added value: +"PubMed ID, digits only or 'PMID:' prefixed."
    • changedInput schema / properties / claims / items / properties / title / description
      Previous value: -"Title as cited. Required for each claim."New value: +"Title exactly as the citation claims it. Required — the audit compares this against the title of the record the identifier actually resolves to, and that comparison is the fabrication check."
    • addedInput schema / properties / claims / items / properties / whoIrisUrl / description
      Added value: +"WHO IRIS publication URL."
    • addedInput schema / properties / claims / items / properties / year / description
      Added value: +"Publication year as cited. Refinement only — it never decides a verdict alone."
    • changedOutput schema / properties / entries / description
      Previous value: -"One result per verifiable entry: { index, sourceKey?, status: 'ok'|'error', verdict, confidence, matched, mismatches, retraction, _provenance }."New value: +"One result per verifiable entry: { index, sourceKey?, status: 'ok'|'error', verdict, confidence, matched, mismatches, retraction, _provenance }. `index` is 1-BASED and counts position in the submitted input, so entry 1 is the first reference — do not add 1 again when you report it to a user. `sourceKey` is the entry's own key in the source file (BibTeX cite key, RIS `ID`, or CSL-JSON `id`) and is the reliable way to map a verdict back to the user's bibliography; it is absent on the claims[] path and on formats that carry no key. `status:'error'` means that one entry failed to verify, not that the batch failed. Entries appear in input order."
    • changedOutput schema / properties / parseErrors / description
      Previous value: -"Entries that could not be parsed or lacked a title: { index, error, message }."New value: +"Entries that could not be parsed or lacked a title: { index, error, message }. Same 1-based `index` space as `entries`, so the two arrays never collide: a given input position appears in exactly one of them. Report these to the user as unchecked, NOT as clean."
    • changedOutput schema / properties / summary / description
      Previous value: -"Corpus roll-up: { total, matched, mismatch, ambiguous, not_found, errored, retracted }."New value: +"Corpus roll-up: { total, matched, mismatch, ambiguous, not_found, errored, retracted }. `total` counts verifiable entries only, so it excludes `parseErrors` and anything past the cap. `retracted` is a separate axis from the verdict counts, and an entry can be both matched and retracted — never add the fields together."
    • changedOutput schema / properties / truncated / description
      Previous value: -"Count of entries dropped beyond the 25-entry cap."New value: +"Count of entries dropped beyond the 25-entry cap. Non-zero means the audit is incomplete — split the bibliography and call again for the rest."
  5. First observed

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety and repeatability profile is covered structurally. The description goes well beyond that by disclosing the 25-entry cap and `truncated`, per-entry error isolation that does not fail the batch, the `not_checked` category, auth/rate-limit behavior, and the identity-vs-support scope limit. That is substantive added context, but the bar is lower because annotations already carry the mutation/safety profile.

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 the one-line purpose and sibling contrast, and the remaining sentences are dense with operational facts rather than filler. It is long and reads as a single wall of text, so some of the return-shape and reporting guidance could be trimmed or segmented, but almost every clause carries information an agent needs.

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?

Covers everything an agent needs to call it and interpret results: input alternatives, cap and truncation, defaults, auth tiers, and how to report not_checked and parseErrors (never as suspect or clean). The output schema exists, yet the description's explanations of 1-based `index`, `sourceKey`, and the independence of `summary.retracted` from verdict counts address specific reporting pitfalls rather than restating field types.

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 description coverage is 100%, so the baseline is 3; the description still adds decision-relevant meaning by stating the either/or exclusivity of `bibliography` vs `claims`, that `checks` defaults to ['retraction'] and [] skips it, and that `screenWithLlm` is gated to authenticated or paid tiers. It omits any mention of `semanticTitle`, leaving one parameter to the schema alone.

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 ('verify a WHOLE bibliography') and immediately positions it as 'the batch counterpart to verifyCitation', which lets an agent pick it apart from the single-citation sibling without opening either schema. It also names the fabrication check and retraction lookup it performs, so the scope is unmistakable.

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?

Gives concrete trigger conditions ('user pastes a reference list, a .bib / .ris file', 'audit my bibliography'), names the alternative (verifyCitation) for the single-reference case, and spells out the input choice between `bibliography` and `claims` with the 'not both' exclusion. Exclusions and prerequisites are explicit rather than inferred.

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.