| name | grounded-citations |
| description | Use when inserting a new citation into academic prose, attributing a finding to a source, or summarising what a paper says. Trigger phrases "cite this", "add a citation for X", "what does Smith (2019) say", "summarise this paper", "attribute this finding". Do NOT use for Zotero library housekeeping — use `zotero-operations`. Do NOT use for auditing an existing draft's citations or for verifying that a cited paper actually supports the claim — use `fact-check`. |
Grounded citations
Glossary: unfamiliar with BBT, MCP, DOI? See skills/_glossary.md for one-line definitions of every acronym this skill uses.
Insertion vs verification. This skill governs inserting a citation during drafting — it can drop a claim if no source supports it. The audit-time counterpart is
verifying-citations(loaded byfact-checkand bycritic-loop's evidence critic), which decides whether an existing@citekeyin a manuscript is honestly supported by its source. Both demand externalised consultation; their escalation triggers differ: grounded-citations escalates on recency / context staling (a Zotero child note beats a faded context-window memory); verifying-citations escalates on claim type (a quoted passage or specific β always requires the full text, regardless of how the abstract reads). Same goal, different decision axis.
Bootstrap (first run in this project)
Before applying the rules below, check that this skill's regression tests are installed in the project:
python3 "${CLAUDE_PLUGIN_ROOT:-.}/scripts/setup/check_project_scaffold.py" \
scripts/test_common.py scripts/test_citations.py
If the output lists missing files, install them:
python3 "${CLAUDE_PLUGIN_ROOT:-.}/scripts/setup/install_templates.py" \
test_common.py:scripts/test_common.py \
test_citations.py:scripts/test_citations.py
Then tell the user what was installed and flag that the top of
scripts/test_citations.py has project-specific paths (manuscript,
references.bib, optional coded_papers.csv) they should review.
Core rule
Every citation the agent inserts into academic prose must satisfy all four of these requirements. They are conjunctive — failing any one means the citation may not be made.
- In Zotero. The paper is in the project's Zotero library. If not,
add it via
mcp__zotero__zotero_add_by_doi(ormcp__zotero__zotero_add_by_urlwhen no DOI exists) before the citation is written. - BBT key. The
[@citekey]in prose is the Better BibTeX key fetched from Zotero viamcp__zotero__zotero_get_item_metadatawithformat="bibtex". Never hand-craft keys (Smith2019-style); never fabricate; never write to Zotero's Extra field to pin a key. - Externalised consultation. At citation time, the paper's content
is available either as a fresh MCP response (abstract, notes, or
full-text retrieved in the current turn or an adjacent recent turn) or
as a Zotero child note read via
mcp__zotero__zotero_get_notes. Context-window recall alone is not sufficient: remembering an abstract read 500K tokens ago is not grounding — either re-fetch it or read the note. Operational rule: if the abstract or fulltext was read more than ~5 conversational turns ago, or if context has been compacted in between, re-fetch via MCP or read the stored Zotero note. The boundary is "could the same words still be in your working context"; when in doubt, re-fetch. - Claim support. The consulted content visibly supports the attributed claim. If nothing you have consulted supports the claim, drop the claim. Do not paper over; do not flag for later; do not keep a speculative citation. Remove it from prose, or replace the attribution with a source that does support the claim.
What counts as externalised consultation
Ranked by strength:
- Zotero full-text via
mcp__zotero__zotero_get_item_fulltext— the paper's own words, strongest grounding. - Zotero child notes via
mcp__zotero__zotero_get_notes— durable, survives context compaction. Preferred when re-citing a paper multiple times across a long session. - Fresh abstract via
mcp__openalex__get_work,mcp__semantic-scholar__get-paper-abstract, ormcp__zotero__zotero_get_item_metadata— minimum acceptable.
Recommended pattern for papers cited repeatedly: the first time
the agent reads the paper, write a Zotero child note summarising the
relevant passage via mcp__zotero__zotero_create_note. That note
becomes the durable consultation artifact for every subsequent citation
— no re-fetch needed, no context-recall gamble.
Available search APIs
| Tool | MCP server | Python library | Best for |
|---|---|---|---|
| OpenAlex | mcp__openalex__* |
— | Open metadata, citation graphs, journal/author profiles |
| Semantic Scholar | mcp__semantic-scholar__* |
— | Abstracts, citation networks, ArXiv |
| Scopus | mcp__scopus__* |
pybliometrics (Python 3.14, config at ~/.config/pybliometrics.cfg) |
Comprehensive citation database, AJG/ABS journal coverage |
| Web of Science | — (not yet implemented) | — | Citation database, journal impact factors; institutional access available |
| Zotero | mcp__zotero__* |
— | Reference management, full-text retrieval |
Procedures for adding papers to Zotero, fixing BBT keys, and
generating references.bib live in the zotero-operations skill and
in scripts/pipelines/generate_bib.py. Bulk citation workflows for
systematic reviews live in systematic-review. Auditing citations in an
existing draft is fact-check's job.
Regression backstop
scripts/test_citations.py (installed by Bootstrap above; source at
${CLAUDE_PLUGIN_ROOT:-.}/templates/test_citations.py) is the recurring
test that catches violations of the rules above: unresolved
@citekeys, bare Author (YYYY) mentions without a governing @key,
and BBT-key uniqueness. Runs in the critic-loop test gate alongside
test_empirical_integrity.py and (for SR projects)
test_systematic_review.py.
Grow the suite with the project. When you discover a new citation
failure mode this skill's rule would prevent — a new
reference-manager key format, a new prose pattern that smuggles in
uncited author-year mentions, a DOI-resolution check the project
needs — add the test to scripts/test_citations.py before closing
out the task. The failure becomes the sentinel so the same class of
mistake can't silently return.
Red flags
- You are about to cite a paper that is not yet in Zotero — add it first.
- You are hand-crafting a citation key (
Smith2019) instead of fetching the BBT key from Zotero. - You are citing from context-window recall when the abstract was read many turns ago — re-fetch the abstract or read the Zotero note.
- The consulted content does not actually support the claim and you are keeping the claim anyway — drop the claim, don't paper over.
- You are citing a paper based only on a title match in a search result, without having read its abstract.
- OpenAlex and Semantic Scholar return conflicting metadata — resolve before citing.
- A DOI search returns no result for a paper you "know" exists — do not cite it.