Scholar Sidekick

Catch AI-fabricated citations (real DOI + fake title). Retraction, open-access, 10,000+ CSL styles.

Should I use this

Quality & Safety

B
Description quality
100%
Schema completeness
99%
Naming quality
97%
Poisoning risk
0%
Permission match
100%
Protocol compliance
100%

Findings (8)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin verifyCitation
  • MEDIUMTool description contains URL to non-standard domainin auditBibliography
  • MEDIUMTool description contains URL to non-standard domainin checkRetraction
  • MEDIUMTool description contains URL to non-standard domainin checkOpenAccess
  • MEDIUMTool description contains URL to non-standard domainin resolveIdentifier
  • MEDIUMTool description contains URL to non-standard domainin formatCitation
  • MEDIUMTool description contains URL to non-standard domainin exportCitation

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~6,798Tokens (tool definitions)
~6.0 KBTypical response size
Significant attention impact (5.31% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "scholar-sidekick-mcp": {
      "command": "npx",
      "args": [
        "scholar-sidekick-mcp"
      ]
    }
  }
}

Runnable packages

npmscholar-sidekick-mcp0.8.11stdio

Remote endpoints

https://scholar-sidekick.com/api/mcpstreamable-http

What it can do

Tool inventory

Tools (7)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢verifyCitation(title, doi, pmid, pmcid, isbn, ...)

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: <resolved record or null>, 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.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "doi": {
      "description": "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.",
      "type": "string",
      "maxLength": 200
    },
    "pmid": {
      "description": "PubMed ID as cited (digits only, or with 'PMID:' prefix).",
      "type": "string",
      "maxLength": 50
    },
    "pmcid": {
      "description": "PubMed Central ID (e.g. 'PMC1234567' or 'PMCID:1234567').",
      "type": "string",
      "maxLength": 50
    },
    "isbn": {
      "description": "ISBN (10- or 13-digit, hyphens tolerated).",
      "type": "string",
      "maxLength": 50
    },
    "arxiv": {
      "description": "arXiv ID (e.g. '2301.08745' or 'arXiv:2301.08745'; old-style 'hep-ph/0501023' accepted).",
      "type": "string",
      "maxLength": 50
    },
    "issn": {
      "description": "ISSN for journal-level resolution.",
      "type": "string",
      "maxLength": 50
    },
    "ads": {
      "description": "NASA ADS bibcode (19 chars).",
      "type": "string",
      "maxLength": 50
    },
    "whoIrisUrl": {
      "description": "WHO IRIS URL (https://iris.who.int/...).",
      "type": "string",
      "maxLength": 2000
    },
    "author": {
      "description": "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').",
      "type": "string",
      "maxLength": 200
    },
    "year": {
      "description": "Publication year as cited. Wrong year alone does not flip the verdict, but >=2-year gap from the resolved record lowers confidence.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9999
    },
    "container": {
      "description": "Journal or container name as cited (e.g. 'The Lancet', 'Neuroscience'). Soft signal — surfaced as a mismatch field but does not gate the verdict.",
      "type": "string",
      "maxLength": 500
    },
    "screenWithLlm": {
      "description": "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.",
      "type": "boolean"
    }
  },
  "required": [
    "title"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "verdict": {
      "type": "string",
      "enum": [
        "matched",
        "mismatch",
        "not_found",
        "ambiguous"
      ]
    },
    "confidence": {
      "type": "string",
      "enum": [
        "high",
        "medium",
        "low"
      ]
    },
    "matched": {
      "description": "The resolved record at the identifier, or null on not_found.",
      "anyOf": [
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        {
          "type": "null"
        }
      ]
    },
    "mismatches": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "_provenance": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢auditBibliography(bibliography, format, claims, checks, screenWithLlm)

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, errored, retracted } }. 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

{
  "type": "object",
  "properties": {
    "bibliography": {
      "description": "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`).",
      "type": "string",
      "maxLength": 131072
    },
    "format": {
      "description": "Override format auto-detection for `bibliography`.",
      "type": "string",
      "enum": [
        "bibtex",
        "ris",
        "csl-json"
      ]
    },
    "claims": {
      "description": "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.",
      "maxItems": 25,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "title": {
            "description": "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.",
            "type": "string",
            "maxLength": 2000
          },
          "doi": {
            "description": "DOI as cited, with or without a prefix ('10.1038/nphys1170' or a doi.org URL).",
            "type": "string",
            "maxLength": 200
          },
          "pmid": {
            "description": "PubMed ID, digits only or 'PMID:' prefixed.",
            "type": "string",
            "maxLength": 50
          },
          "pmcid": {
            "description": "PubMed Central ID, e.g. 'PMC1234567'.",
            "type": "string",
            "maxLength": 50
          },
          "isbn": {
            "description": "ISBN-10 or ISBN-13; hyphens are tolerated.",
            "type": "string",
            "maxLength": 50
          },
          "arxiv": {
            "description": "arXiv ID, e.g. '2301.00001' or 'arXiv:2301.00001'.",
            "type": "string",
            "maxLength": 50
          },
          "issn": {
            "description": "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.",
            "type": "string",
            "maxLength": 50
          },
          "ads": {
            "description": "NASA ADS bibcode, e.g. '2019A&A...625A.135L'.",
            "type": "string",
            "maxLength": 50
          },
          "whoIrisUrl": {
            "description": "WHO IRIS publication URL.",
            "type": "string",
            "maxLength": 2000
          },
          "author": {
            "description": "First-author family name as cited. Refines the comparison; a disagreement here can downgrade a verdict to 'ambiguous'.",
            "type": "string",
            "maxLength": 200
          },
          "year": {
            "description": "Publication year as cited. Refinement only — it never decides a verdict alone.",
            "type": "integer",
            "minimum": 0,
            "maximum": 9999
          },
          "container": {
            "description": "Journal or book title as cited. Refinement only, same role as `year`.",
            "type": "string",
            "maxLength": 500
          }
        },
        "required": [
          "title"
        ]
      }
    },
    "checks": {
      "description": "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.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "retraction"
        ]
      }
    },
    "screenWithLlm": {
      "description": "Opt-in Stage 3 LLM screen applied per entry (same gating as verifyCitation: authenticated first-party key or paid RapidAPI tier). Default false.",
      "type": "boolean"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "format": {
      "description": "Detected input format ('bibtex' | 'ris' | 'csl-json'), or null for the claims[] path.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "entries": {
      "description": "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.",
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "parseErrors": {
      "description": "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.",
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "truncated": {
      "description": "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.",
      "type": "number"
    },
    "summary": {
      "description": "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.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢checkRetraction(id)

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). For multi-paper bibliography audits (clinical guidelines, systematic reviews), loop one call per identifier — the tool intentionally rejects batch input to keep retraction-status results unambiguous per work. 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; loop one call per identifier for multiple papers. 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'). No sibling tool overlaps this — resolveIdentifier returns metadata but not retraction 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; Crossref is queried server-side with its own caching.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "id"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "doi": {
      "description": "Resolved DOI, or null when none could be derived.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "resolvedFrom": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "value": {
          "type": "string"
        }
      },
      "required": [
        "type",
        "value"
      ],
      "additionalProperties": false
    },
    "reason": {
      "description": "Why result is null (e.g. 'no_doi').",
      "type": "string"
    },
    "result": {
      "description": "Retraction status, or null when no DOI resolved.",
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "isRetracted": {
              "type": "boolean"
            },
            "hasCorrections": {
              "type": "boolean"
            },
            "hasConcern": {
              "type": "boolean"
            },
            "notices": {
              "type": "array",
              "items": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              }
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "doi",
    "result"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢checkOpenAccess(id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "description": "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).",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "id"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "doi": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "resolvedFrom": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "value": {
          "type": "string"
        }
      },
      "required": [
        "type",
        "value"
      ],
      "additionalProperties": false
    },
    "reason": {
      "type": "string"
    },
    "result": {
      "description": "Open-access status, or null when no DOI resolved.",
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "isOa": {
              "type": "boolean"
            },
            "oaStatus": {
              "type": "string",
              "enum": [
                "gold",
                "green",
                "hybrid",
                "bronze",
                "closed"
              ]
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "bestLocation": {
              "anyOf": [
                {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                },
                {
                  "type": "null"
                }
              ]
            },
            "locations": {
              "type": "array",
              "items": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              }
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "doi",
    "result"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢resolveIdentifier(text)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "text": {
      "description": "One or more identifiers to resolve (DOIs, PMIDs, PMCIDs, ISBNs, arXiv IDs, ISSNs, ADS bibcodes) separated by newlines or commas",
      "type": "string"
    }
  },
  "required": [
    "text"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "items": {
      "description": "Resolved CSL JSON items, one per identifier.",
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    }
  },
  "required": [
    "items"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢formatCitation(text, style, lang, footnote, output)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "text": {
      "description": "One or more identifiers (DOIs, PMIDs, ISBNs, arXiv IDs, etc.) separated by newlines or commas",
      "type": "string"
    },
    "style": {
      "description": "Citation style: vancouver (default), ama, apa, ieee, cse, or any CSL style ID",
      "type": "string"
    },
    "lang": {
      "description": "Locale for formatting (e.g. en-US, en-GB, fr-FR)",
      "type": "string"
    },
    "footnote": {
      "description": "Format as footnotes instead of bibliography entries",
      "type": "boolean"
    },
    "output": {
      "description": "Output format (default: text)",
      "type": "string",
      "enum": [
        "text",
        "html",
        "json"
      ]
    }
  },
  "required": [
    "text"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "text": {
      "description": "Formatted citation text (when output=text).",
      "type": "string"
    },
    "html": {
      "description": "Formatted citation HTML (when output=html).",
      "type": "string"
    },
    "items": {
      "description": "Structured CSL items (when output=json).",
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "formatter": {
      "description": "Which engine formatted: 'builtin' or 'csl'.",
      "type": "string"
    },
    "styleUsed": {
      "description": "Canonical style ID after alias/dependent-style resolution.",
      "type": "string"
    },
    "lang": {
      "description": "Locale used for formatting.",
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢exportCitation(text, format, style, lang)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "text": {
      "description": "One or more identifiers (DOIs, PMIDs, ISBNs, etc.) separated by newlines or commas",
      "type": "string"
    },
    "format": {
      "description": "Export format",
      "type": "string",
      "enum": [
        "bib",
        "ris",
        "csv",
        "csl",
        "endnote-refer",
        "endnote-xml",
        "refworks",
        "medline",
        "zotero-rdf",
        "txt"
      ]
    },
    "style": {
      "description": "Citation style (used only for txt export)",
      "type": "string"
    },
    "lang": {
      "description": "Locale for formatting (e.g. en-US)",
      "type": "string"
    }
  },
  "required": [
    "text",
    "format"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "content": {
      "description": "The entire bibliography in the requested format, as one string.",
      "type": "string"
    },
    "format": {
      "description": "The export format that was produced.",
      "type": "string"
    }
  },
  "required": [
    "content",
    "format"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded7 tools
verifiedversion not recorded7 tools