Scholar Sidekick
Server Details
Catch AI-fabricated citations (real DOI + fake title). Retraction, open-access, 10,000+ CSL styles.
- Status
- Healthy
- Uptime
- 100.0% over 75 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- mlava/scholar-sidekick-mcp
- GitHub Stars
- 11
- Server Listing
- Scholar Sidekick
TDQS
Scored across 7 tools
Each tool maps to a distinct action+scope: single vs. batch verification (verifyCitation vs. auditBibliography), OA lookup vs. retraction lookup, and metadata vs. in-line citation vs. bibliography file (resolveIdentifier / formatCitation / exportCitation). Descriptions explicitly state 'use X instead when...' and call out the only partial overlap (checkRetraction is a sub-check of auditBibliography), so an agent can pick correctly without guessing.
All seven names are camelCase verb_noun pairs (auditBibliography, checkOpenAccess, checkRetraction, exportCitation, formatCitation, resolveIdentifier, verifyCitation). The verbs are also semantically precise and non-redundant, which is more than most servers achieve.
Seven tools sit comfortably in the well-scoped range, and each covers a genuinely different step of the citation workflow (resolve, format, export, verify, audit, OA, retraction). Nothing looks like filler or a redundant variant.
The surface covers the citation lifecycle well: resolve → format/export → verify → audit → OA/retraction status. Minor gaps remain for batch OA/retraction checks (explicitly single-identifier only, requiring loops) and for identifier-less discovery, i.e. there is no search-by-title tool to obtain an identifier from scratch, though verifyCitation partially compensates internally.
Available Tools
7 toolsauditBibliographyAudit BibliographyARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| checks | No | Per-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. | |
| claims | No | Pre-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. | |
| format | No | Override format auto-detection for `bibliography`. | |
| bibliography | No | 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`). | |
| screenWithLlm | No | Opt-in Stage 3 LLM screen applied per entry (same gating as verifyCitation: authenticated first-party key or paid RapidAPI tier). Default false. | |
| semanticTitle | No | Opt-in semantic title check applied per entry (any tier; see verifyCitation). Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | No | Detected input format ('bibtex' | 'ris' | 'csl-json'), or null for the claims[] path and for plain-text input. |
| entries | No | 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. |
| summary | No | 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. |
| truncated | No | 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. |
| parseErrors | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
checkOpenAccessCheck Open AccessARead-onlyIdempotentInspect
Check whether a single scholarly work is openly accessible and where to find the best legal version. Use when the user asks 'is this open access?', 'where can I read this for free?', or wants the OA license/version before reusing or redistributing. Sourced from Unpaywall. Resolves DOI/PMID/PMCID/arXiv/ISBN/ADS inputs to a DOI before lookup; inputs that don't map to a DOI return doi=null and reason='no_doi'. arXiv inputs check the linked published-journal DOI when arXiv records one; a preprint without one returns doi=null and reason='no_doi' (Unpaywall does not index arXiv preprints, which are freely readable on arXiv regardless). Single identifier per call — does NOT accept comma/newline batches; loop one call per identifier for multiple papers. Returns: { doi, resolvedFrom?, reason?, result } where result has isOa (boolean), oaStatus ('gold' | 'green' | 'hybrid' | 'bronze' | 'closed'), title, bestLocation ({url, hostType: 'publisher' | 'repository', license, version: 'submittedVersion' | 'acceptedVersion' | 'publishedVersion'} or null), and locations (array of the same shape); result is null when no DOI could be resolved and reason explains why ('no_doi'). No sibling tool overlaps this — resolveIdentifier returns metadata but not OA status. Read-only and idempotent — safe to retry. Works anonymously against the public Scholar Sidekick API (rate-limited free tier); set SCHOLAR_API_KEY (a free ssk_ key from https://scholar-sidekick.com/account) for higher limits, or RAPIDAPI_KEY for paid RapidAPI tiers. Rate limits follow your tier; Unpaywall is queried server-side with its own caching.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A single scholarly identifier to check. 1–500 characters. Non-DOI inputs are resolved to a DOI server-side before the lookup; if no DOI can be derived, the tool returns doi=null with reason='no_doi'. Pass exactly one identifier — comma/newline batches are NOT accepted by this tool; loop one call per identifier for multiple papers. Accepted: DOI, PMID, PMCID, arXiv ID, ISBN, or NASA ADS bibcode (with or without prefixes). |
Output Schema
| Name | Required | Description |
|---|---|---|
| doi | Yes | |
| reason | No | |
| result | Yes | Open-access status, or null when no DOI resolved. |
| resolvedFrom | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by explaining DOI resolution behavior, doi=null/no_doi cases, arXiv preprint semantics, idempotence, server-side Unpaywall caching, and API tier/rate-limit behavior. It also clarifies that the tool is read-only and safe to retry, reinforcing the annotations.
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 long but every section earns its place: purpose, trigger queries, input rules, edge cases, return shape, sibling differentiation, and authentication/rate limits. It is front-loaded with the core purpose before diving into implementation details, though some phrasing could be tightened.
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?
Given the tool's one parameter, rich output schema, and annotations, this description is fully complete for an agent to select and invoke it correctly. It covers input constraints, edge cases, return shape, error-like behavior, authentication needs, rate limits, and relationship to sibling tools.
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 input schema already covers the id parameter thoroughly, so the baseline is 3. The description adds value beyond the schema with the arXiv edge case: arXiv inputs check the linked published-journal DOI, and preprints without one return no_doi because Unpaywall does not index arXiv separately. It also reinforces the single-identifier and looping behavior.
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?
Description names a specific verb and resource: 'Check whether a single scholarly work is openly accessible and where to find the best legal version.' It clearly distinguishes itself from siblings by explicitly stating that no sibling tool overlaps it and that resolveIdentifier does not provide OA status.
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?
Provides explicit when-to-use triggers: exact user phrasings like 'is this open access?' and 'where can I read this for free?', as well as reuse/license scenarios. It also names the closest sibling, resolveIdentifier, and explains why it is not an alternative for this task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checkRetractionCheck RetractionARead-onlyIdempotentInspect
Check whether a single scholarly work has been retracted, corrected, or had an expression of concern raised. Use when the user asks 'has this paper been retracted?' or wants to verify a paper's standing before citing it (clinical, regulatory, evidence-synthesis contexts). To check a WHOLE reference list for retractions (e.g. 'check all these citations for retractions' at the end of a literature review, a guideline or a systematic review), use auditBibliography instead — one call runs the retraction check plus the fabrication check on up to 25 entries. Sourced from Crossref updated-by (which mirrors Retraction Watch). Resolves DOI/PMID/PMCID/arXiv/ADS inputs to a DOI before lookup; ISBN inputs always return doi=null and reason='no_doi' since books are not in the retraction graph. arXiv inputs check the linked published-journal DOI when arXiv records one; a preprint without one returns doi=null and reason='no_doi' (preprints are outside the Crossref retraction graph — arXiv marks withdrawals on the abstract page instead). Single identifier per call — does NOT accept comma/newline batches; for a handful of papers loop one call per identifier, for a bibliography use auditBibliography. Returns: { doi, resolvedFrom?, reason?, result } where result has isRetracted, hasCorrections, hasConcern (booleans), notices (array of {type, label, doi, date, source} where type is a raw Crossref update type such as 'retraction', 'correction', 'erratum' or 'expression_of_concern'), and title; result is null when no DOI could be resolved and reason explains why ('no_doi'). resolveIdentifier returns metadata but not retraction status; auditBibliography includes this check for every entry of a bibliography. Read-only and idempotent — safe to retry. Works anonymously against the public Scholar Sidekick API (rate-limited free tier); set SCHOLAR_API_KEY (a free ssk_ key from https://scholar-sidekick.com/account) for higher limits, or RAPIDAPI_KEY for paid RapidAPI tiers. Rate limits follow your tier; Crossref is queried server-side with its own caching.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A single scholarly identifier to check. 1–500 characters. Non-DOI inputs are resolved to a DOI server-side before the lookup; if no DOI can be derived, the tool returns doi=null with reason='no_doi'. Pass exactly one identifier — comma/newline batches are NOT accepted by this tool; loop one call per identifier for multiple papers. Accepted: DOI, PMID, PMCID, arXiv ID, or NASA ADS bibcode (with or without prefixes). ISBN inputs are accepted but always return doi=null since books are not in the retraction graph. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doi | Yes | Resolved DOI, or null when none could be derived. |
| reason | No | Why result is null (e.g. 'no_doi'). |
| result | Yes | Retraction status, or null when no DOI resolved. |
| resolvedFrom | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/open-world, and the description adds substantial context beyond them: data provenance (Crossref `updated-by`, mirroring Retraction Watch), server-side DOI resolution, ISBN and arXiv-preprint edge cases returning reason='no_doi', free-tier rate limiting, and auth options (SCHOLAR_API_KEY / RAPIDAPI_KEY). No contradiction with the read-only, idempotent annotations.
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?
Front-loaded with purpose and the key sibling routing, then progressively narrows to resolution behavior, return shape, and auth. It is dense and long, but nearly every sentence carries operative detail; the return-shape enumeration is the one section that runs long given an output schema exists.
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?
Given a single-parameter, read-only lookup with an output schema, the description covers everything an agent needs: input types, resolution fallbacks, batch limitations, auth/rate-limit expectations, and the sibling to use for bibliographies. Nothing required to invoke it correctly is missing.
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 coverage is 100%, so the baseline is 3, and the description largely restates the accepted identifier types and single-identifier rule already in the schema. It does add marginal practical value by explaining the loop-one-call-per-identifier workaround and the ISBN/arXiv resolution outcomes, which go slightly beyond the schema wording.
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?
States a specific verb+resource+scope: checking whether a single scholarly work has been retracted, corrected, or flagged with an expression of concern. It explicitly distinguishes itself from siblings by naming auditBibliography for batch/reference-list checks and noting that resolveIdentifier returns metadata but not retraction status.
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?
Gives explicit trigger phrasing ('has this paper been retracted?', verify standing before citing) and a clear when-not/alternative rule: for whole reference lists use auditBibliography, which runs this check plus fabrication across up to 25 entries. Also clarifies that batches are not accepted and that looping is the alternative for a handful of papers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportCitationExport CitationARead-onlyIdempotentInspect
Export scholarly identifiers to a bibliography file format ready to write to disk or paste into a reference manager. Use when the user wants a file (.bib, .ris, .nbib, .xml, .rdf, .csv) for Zotero, Mendeley, EndNote, RefWorks, BibTeX/LaTeX, Pandoc, or Excel. Format parameter is required: bib (BibTeX — LaTeX), ris (RIS — most widely supported by reference managers), csl (CSL JSON — Pandoc/Quarto), endnote-xml, endnote-refer, refworks, medline (NBIB — PubMed round-trips, clinical workflows), zotero-rdf, csv (spreadsheet-friendly), or txt (plain-text bibliography rendered with the optional style parameter — txt is the only format that uses style; the others have their own structured shape and ignore it). Accepts the same identifier formats as resolveIdentifier (DOI/PMID/PMCID/ISBN/arXiv/ISSN/ADS/WHO IRIS, prefixes tolerated), single or comma/newline-separated batch — one round trip per call. Returns: { content: string, format: string } where content is the entire bibliography in the requested format as a single string — write it to a file (.bib/.ris/.nbib/etc.) or paste it directly into the target tool. Use formatCitation instead when the user wants in-line citation text (manuscript, slide); use resolveIdentifier when they want raw structured metadata. Read-only and idempotent — safe to retry. Works anonymously against the public Scholar Sidekick API (rate-limited free tier); set SCHOLAR_API_KEY (a free ssk_ key from https://scholar-sidekick.com/account) for higher limits, or RAPIDAPI_KEY for paid RapidAPI tiers. Rate limits follow your tier.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Locale for formatting (e.g. en-US) | |
| text | Yes | One or more identifiers (DOIs, PMIDs, ISBNs, etc.) separated by newlines or commas | |
| style | No | Citation style (used only for txt export) | |
| format | Yes | Export format |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | Yes | The export format that was produced. |
| content | Yes | The entire bibliography in the requested format, as one string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds substantial context: auth requirements (SCHOLAR_API_KEY, RAPIDAPI_KEY), rate limits, anonymous access, retry safety, and format-specific behavior (txt uses style; others ignore it). This goes well beyond the annotations.
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 long but every sentence provides necessary information: purpose, use cases, format semantics, identifier handling, return shape, alternatives, safety, auth, and rate limits. It is logically ordered and free of fluff, earning its length.
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?
Given the complexity (10 formats, 4 params, auth, alternatives), the description covers all bases: input formats, return shape, alternative tools, rate limits, and API keys. It is even self-contained enough to guide an agent without needing to inspect the schema or output schema.
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?
Although schema coverage is 100%, the description enriches each parameter. It explains every format enum value with use cases (BibTeX for LaTeX, RIS for reference managers, NBIB for PubMed), clarifies that style only applies to txt, and details the identifier formats accepted for the text parameter. This adds significant meaning beyond the schema.
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 a specific verb+resource: 'Export scholarly identifiers to a bibliography file format'. It clearly distinguishes from siblings by stating when to use exportCitation (file generation) vs. formatCitation (in-line text) and resolveIdentifier (raw 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?
Provides explicit when-to-use guidance: 'Use when the user wants a file (.bib, .ris, .nbib, .xml, .rdf, .csv) for Zotero, Mendeley, EndNote...'. Also explicitly names alternatives: 'Use formatCitation instead when the user wants in-line citation text; use resolveIdentifier when they want raw structured metadata.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
formatCitationFormat CitationARead-onlyIdempotentInspect
Format scholarly identifiers into a finished citation in a specific style. Use when the user wants a paste-ready citation string for a manuscript, slide, message, footnote, or in-line reference. Style defaults to vancouver if unspecified; ask the user before defaulting if any ambiguity exists (e.g. 'Harvard' and 'Chicago' have multiple variants — confirm which one). Supports five hand-tuned builtins (vancouver, ama, apa, ieee, cse) plus any of 10,000+ CSL style IDs (chicago-author-date, harvard-cite-them-right, modern-language-association, nature, bmj, the-lancet, etc.). Alias and dependent-style resolution apply, so 'harvard' resolves to 'harvard-cite-them-right' and the canonical ID is reported back as styleUsed. Output defaults to text; pass output=html for marked-up HTML or output=json for structured CSL items. Accepts the same identifier formats as resolveIdentifier (DOI/PMID/PMCID/ISBN/arXiv/ISSN/ADS/WHO IRIS, prefixes tolerated), single or comma/newline-separated batch — one round trip per call. Returns: one of { text, html, items } depending on the output parameter, followed by a metadata block ({formatter: 'builtin' | 'csl', styleUsed, requestId, warnings?}) appended as a second text content item — surface this to the user when they care about reproducibility. Use resolveIdentifier instead when the user wants raw metadata to inspect or transform; use exportCitation when they want a downloadable bibliography file. Read-only and idempotent — safe to retry. Works anonymously against the public Scholar Sidekick API (rate-limited free tier); set SCHOLAR_API_KEY (a free ssk_ key from https://scholar-sidekick.com/account) for higher limits, or RAPIDAPI_KEY for paid RapidAPI tiers. Rate limits follow your tier.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Locale for formatting (e.g. en-US, en-GB, fr-FR) | |
| text | Yes | One or more identifiers (DOIs, PMIDs, ISBNs, arXiv IDs, etc.) separated by newlines or commas | |
| style | No | Citation style: vancouver (default), ama, apa, ieee, cse, or any CSL style ID | |
| output | No | Output format (default: text) | |
| footnote | No | Format as footnotes instead of bibliography entries |
Output Schema
| Name | Required | Description |
|---|---|---|
| html | No | Formatted citation HTML (when output=html). |
| lang | No | Locale used for formatting. |
| text | No | Formatted citation text (when output=text). |
| items | No | Structured CSL items (when output=json). |
| warnings | No | |
| formatter | No | Which engine formatted: 'builtin' or 'csl'. |
| styleUsed | No | Canonical style ID after alias/dependent-style resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it details read-only/idempotent behavior, rate limits, API key requirements, output format semantics, metadata block structure, and style resolution (e.g., 'harvard' resolves to 'harvard-cite-them-right'). No contradictions with annotations.
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 lengthy but every sentence carries essential information, with the purpose and usage front-loaded. It avoids redundancy and organizes complex details (style resolution, output formats, rate limits) into a coherent flow without waste.
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?
Given the tool's complexity (5 parameters, output schema, many alternatives, and nuanced behavior), the description covers all aspects: return structure (text/html/items + metadata block), authentication tiers, rate limiting, style resolution, batch processing, and when-to-use alternatives. It is exceptionally 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?
Although the schema already covers all parameters at 100%, the description adds substantial meaning: style defaults, builtins vs. CSL, alias resolution, batch input format (newline/comma separated, one round trip), and the output parameter returning text/html/items. It enriches every parameter beyond schema definitions.
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 the tool formats scholarly identifiers into a finished citation with a specific style. It distinguishes from siblings by contrasting with resolveIdentifier (raw metadata) and exportCitation (bibliography file), making its unique purpose unambiguous.
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 provides explicit use cases ('paste-ready citation string for a manuscript, slide, message, footnote, or in-line reference'), explicit alternatives, and even warns about style ambiguity ('Harvard' and 'Chicago' variants) requiring user confirmation before defaulting. This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolveIdentifierResolve IdentifierARead-onlyIdempotentInspect
Resolve scholarly identifiers to structured CSL JSON metadata (title, authors, journal, year, identifiers). Use when the user wants raw bibliographic data to inspect, transform, or feed into another tool — not a formatted citation. Common single-shot conversions: PMID → PMCID, arXiv → DOI, ISBN → CSL JSON, WHO IRIS URL → structured metadata. Accepts DOI, PMID, PMCID, ISBN, arXiv ID, ISSN, NASA ADS bibcode, or WHO IRIS URL, with or without prefixes (PMID:, arXiv:, ISBN hyphens, https://doi.org/...). Pass a single identifier or a comma/newline-separated batch — one round trip per call. Returns: a JSON array of CSL items, each with id, type, title, author[], issued.date-parts, container-title, DOI/PMID/PMCID/ISBN/ISSN/URL when available. Use formatCitation instead when the user wants a finished citation string in a specific style; use exportCitation when they want a downloadable bibliography file. Read-only and idempotent — safe to retry. Works anonymously against the public Scholar Sidekick API (rate-limited free tier); set SCHOLAR_API_KEY (a free ssk_ key from https://scholar-sidekick.com/account) for higher limits, or RAPIDAPI_KEY for paid RapidAPI tiers. Rate limits follow your tier; the underlying REST API caches repeated identical requests and surfaces cache state in the x-scholar-cache response header.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | One or more identifiers to resolve (DOIs, PMIDs, PMCIDs, ISBNs, arXiv IDs, ISSNs, ADS bibcodes) separated by newlines or commas |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Resolved CSL JSON items, one per identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description discloses operationally significant behaviors: authentication options (SCHOLAR_API_KEY, RAPIDAPI_KEY), rate-limit tiers, REST API caching with x-scholar-cache response header, and the ability to batch requests in one round trip. This adds substantial value over the structured annotations.
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 dense but well-structured: purpose first, usage examples, output summary, alternatives, safety, and API details. Every sentence carries operational weight, and the front-loaded purpose sentence makes the tool's function immediately clear. Length is justified by the tool's complexity.
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?
Given the tool's breadth (multiple identifier types, batching, API keys, and output schema), the description is remarkably complete. It covers purpose, usage, alternatives, auth, rate limits, caching, and output format without redundant explanation of return values (output schema exists). It positions the tool well relative to its siblings.
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 input schema already covers the 'text' parameter with 100% coverage, but the description enriches it by enumerating additional identifier types (WHO IRIS URL), prefix handling (PMID:, arXiv:, ISBN hyphens, https://doi.org/...), and batch semantics (comma/newline-separated, one round trip per call). This goes beyond the schema's basic listing of identifier kinds.
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 verb+resource+output: 'Resolve scholarly identifiers to structured CSL JSON metadata (title, authors, journal, year, identifiers).' It also distinguishes from siblings by explicitly naming formatCitation and exportCitation as alternatives, making the tool's purpose unmistakable.
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 explicit use cases: 'Use when the user wants raw bibliographic data to inspect, transform, or feed into another tool — not a formatted citation.' It also gives clear exclusions and alternatives: 'Use formatCitation instead when the user wants a finished citation string in a specific style; use exportCitation when they want a downloadable bibliography file.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verifyCitationVerify CitationARead-onlyIdempotentInspect
Verify a claimed citation against the resolved record at its identifier. Detects the dominant AI-driven fabrication pattern documented by Topaz et al. (Lancet 2026): a real, resolvable identifier (DOI / PMID / PMCID / arXiv / etc.) paired with a title that does NOT correspond to the paper at that identifier. Use when the user pastes a citation and asks 'is this real?' or 'check this DOI' — most fabricated citations resolve cleanly under doi.org but their cited title and the resolved title disagree. Single citation per call. Required: title plus exactly one identifier (doi, pmid, pmcid, isbn, arxiv, issn, ads, or whoIrisUrl). Optional refinements: author (first-author family name), year, container (journal). Set screenWithLlm: true to invoke the Stage 3 LLM screen on low-confidence mismatches (catches informal-abbreviation false positives); LLM access is gated to authenticated first-party keys and paid RapidAPI tiers — anonymous callers get 400 LLM_SCREEN_FORBIDDEN. Returns: { verdict: 'matched' | 'mismatch' | 'not_found' | 'ambiguous', confidence: 'high' | 'medium' | 'low', matched: , mismatches: [{field, claimed, resolved, similarity}], candidates: [{item, registries, score}] (when title-search ran), provenance: {stages_run, resolved_via, registries_searched, llm_screen} }. Verdict semantics: 'matched' = claim agrees with resolved record; 'mismatch' = identifier resolves but title does not match (Topaz fabrication pattern); 'ambiguous' = identifier resolves to one paper but the claimed title matches a DIFFERENT paper found via title-search (CITADEL 'citation error' subtype — wrong identifier for a real paper); 'not_found' = neither the identifier nor the title resolves anywhere. No sibling tool overlaps: resolveIdentifier returns metadata for a known-good identifier; verifyCitation is the only tool that cross-checks claimed title vs resolved metadata. Read-only and idempotent — safe to retry. Works anonymously for the non-LLM path; the Stage 3 LLM screen requires authentication — set SCHOLAR_API_KEY (a free ssk key from https://scholar-sidekick.com/account) or use a paid RapidAPI tier. SCHOLAR_API_KEY also raises your rate limit.
| Name | Required | Description | Default |
|---|---|---|---|
| ads | No | NASA ADS bibcode (19 chars). | |
| doi | No | DOI as cited (with or without https://doi.org/ prefix). Provide whichever identifier(s) the cited reference carries; the verifier uses the first one in priority order doi > pmid > pmcid > arxiv > ads > isbn > issn > whoIrisUrl. | |
| isbn | No | ISBN (10- or 13-digit, hyphens tolerated). | |
| issn | No | ISSN for journal-level resolution. | |
| pmid | No | PubMed ID as cited (digits only, or with 'PMID:' prefix). | |
| year | No | Publication year as cited. Wrong year alone does not flip the verdict, but >=2-year gap from the resolved record lowers confidence. | |
| arxiv | No | arXiv ID (e.g. '2301.08745' or 'arXiv:2301.08745'; old-style 'hep-ph/0501023' accepted). | |
| pmcid | No | PubMed Central ID (e.g. 'PMC1234567' or 'PMCID:1234567'). | |
| title | Yes | The title as it appears in the cited reference. This is the field the verifier cross-checks against the resolved record at the supplied identifier. Required. | |
| author | No | First-author family name as cited. Refines the verdict — a title-vs-resolved-title match plus an author mismatch raises suspicion of fabrication. Pass only the family name (e.g. 'Topaz', not 'Topaz, Maxim'). | |
| container | No | Journal or container name as cited (e.g. 'The Lancet', 'Neuroscience'). Soft signal — surfaced as a mismatch field but does not gate the verdict. | |
| whoIrisUrl | No | WHO IRIS URL (https://iris.who.int/...). | |
| screenWithLlm | No | Opt-in Stage 3 LLM screen. Fires only when the pre-LLM verdict is mismatch with low confidence (the informal-abbreviation false-positive bucket). Gated: requires an authenticated first-party API key or a paid RapidAPI tier; anonymous / free callers receive 400 LLM_SCREEN_FORBIDDEN. Default false. | |
| semanticTitle | No | Opt-in semantic title check (any tier). On a string-level matched verdict, a calibrated model judgment of whether the claimed and resolved titles describe the same work; catches one-word swaps in long titles that string similarity misses. A flagged title moves matched → ambiguous (review), never mismatch. Not byte-deterministic — _provenance.semantic_title carries the probability. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| matched | No | The resolved record at the identifier, or null on not_found. |
| verdict | No | |
| candidates | No | |
| confidence | No | |
| mismatches | No | |
| _provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld, yet the description adds substantial extra context: the LLM-screen auth gate and its 400 LLM_SCREEN_FORBIDDEN failure, the anonymous-vs-keyed rate-limit behavior, the required-exactly-one-identifier constraint, and full verdict semantics. This is well beyond the annotation baseline.
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?
Front-loaded with purpose and trigger, then params, returns, verdict semantics, and auth. Nearly every sentence earns its place, though the returns block partially restates the existing output schema and the description runs long.
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 14-parameter verification tool with an output schema, the description is complete: trigger, identifier selection, opt-in screens with their auth constraints, verdict taxonomy, and retry safety are all present. Nothing needed to invoke or interpret it correctly is missing.
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 coverage is already 100%, so the baseline is 3, but the description adds real meaning: 'title plus exactly one identifier' with a documented priority order, plus when screenWithLlm and semanticTitle actually fire and what each can and cannot flip. It does not add new per-parameter syntax beyond the schema, so it stops short of a 5.
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?
States a precise verb+resource ('Verify a claimed citation against the resolved record at its identifier') and immediately names the distinguishing failure mode it targets. It explicitly differentiates itself from resolveIdentifier, so an agent can route without opening a schema.
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?
Gives concrete trigger conditions ('when the user pastes a citation and asks is this real? or check this DOI') and an explicit no-overlap statement contrasting with resolveIdentifier. It also bounds scope with 'Single citation per call'.
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.
1 tool update
- Changed
auditBibliography2 fields changed- changed
Input schema / properties / bibliography / descriptionPrevious 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`)." - changed
Output schema / properties / format / descriptionPrevious 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."
1 tool update
- Changed
auditBibliography1 field changed- changed
Output schema / properties / summary / descriptionPrevious 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."
2 tool updates
- Changed
auditBibliography1 field changed- added
Input schema / properties / semanticTitleAdded value: +{ + "description": "Opt-in semantic title check applied per entry (any tier; see verifyCitation). Default false.", + "type": "boolean" +}
- Changed
verifyCitation1 field changed- added
Input schema / properties / semanticTitleAdded value: +{ + "description": "Opt-in semantic title check (any tier). On a string-level matched verdict, a calibrated model judgment of whether the claimed and resolved titles describe the same work; catches one-word swaps in long titles that string similarity misses. A flagged title moves matched → ambiguous (review), never mismatch. Not byte-deterministic — _provenance.semantic_title carries the probability. Default false.", + "type": "boolean" +}
1 tool update
- Changed
auditBibliography16 fields changed- added
Input schema / properties / claims / items / properties / ads / descriptionAdded value: +"NASA ADS bibcode, e.g. '2019A&A...625A.135L'." - added
Input schema / properties / claims / items / properties / arxiv / descriptionAdded value: +"arXiv ID, e.g. '2301.00001' or 'arXiv:2301.00001'." - changed
Input schema / properties / claims / items / properties / author / descriptionPrevious 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'." - added
Input schema / properties / claims / items / properties / container / descriptionAdded value: +"Journal or book title as cited. Refinement only, same role as `year`." - added
Input schema / properties / claims / items / properties / doi / descriptionAdded value: +"DOI as cited, with or without a prefix ('10.1038/nphys1170' or a doi.org URL)." - added
Input schema / properties / claims / items / properties / isbn / descriptionAdded value: +"ISBN-10 or ISBN-13; hyphens are tolerated." - added
Input schema / properties / claims / items / properties / issn / descriptionAdded 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." - added
Input schema / properties / claims / items / properties / pmcid / descriptionAdded value: +"PubMed Central ID, e.g. 'PMC1234567'." - added
Input schema / properties / claims / items / properties / pmid / descriptionAdded value: +"PubMed ID, digits only or 'PMID:' prefixed." - changed
Input schema / properties / claims / items / properties / title / descriptionPrevious 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." - added
Input schema / properties / claims / items / properties / whoIrisUrl / descriptionAdded value: +"WHO IRIS publication URL." - added
Input schema / properties / claims / items / properties / year / descriptionAdded value: +"Publication year as cited. Refinement only — it never decides a verdict alone." - changed
Output schema / properties / entries / descriptionPrevious 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." - changed
Output schema / properties / parseErrors / descriptionPrevious 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." - changed
Output schema / properties / summary / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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."
7 tool updates
- First observed
auditBibliography - First observed
checkOpenAccess - First observed
checkRetraction - First observed
exportCitation - First observed
formatCitation - First observed
resolveIdentifier - First observed
verifyCitation
Related MCP Connectors
Check citations, catch fake/retracted papers, search OpenAlex & PubMed, format references.
Checks AI-written references against Crossref, PubMed and OpenAlex. Formats citations, PRISMA.
Check if references exist or were retracted, look up journal AI policies, and preview manuscripts.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceFabrication-free, DOI-backed citations for AI content and agents, using openAlex public-domain data with resolvable DOIs. Includes an API and planned MCP server for agent-native citation retrieval.-
- AlicenseAqualityBmaintenanceEnables verifying citations in reference lists and BibTeX by detecting fabricated or mismatched references and retractions, and returning corrected BibTeX.31MIT
- AlicenseAqualityAmaintenanceChecks whether a citation has been retracted, corrected, or flagged with an expression of concern by querying Crossref — including retractions that Crossref backfills from the Retraction Watch database, which publishers often never record in their own metadata. Lets an AI agent verify a DOI, or every DOI in a reference list, before using it in research or writing.21MIT
- AlicenseNot gradedqualityDmaintenanceVerifies citations in reference lists by checking DOIs against public registries to catch AI-hallucinated or mismatched citations.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.