Help us improve
Share bugs, ideas, or general feedback.
From academic-research
Inserts citations into academic prose by fetching paper metadata from Zotero via MCP and enforcing Better BibTeX keys. Use when drafting a manuscript and need to attribute a finding to a source.
npx claudepluginhub mronkko/claude-academic-research --plugin academic-researchHow this skill is triggered — by the user, by Claude, or both
Slash command
/academic-research:grounded-citationsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Glossary:** unfamiliar with **BBT**, **MCP**, **DOI**? See
Verifies that a citation in a manuscript is honestly supported by its source, using a staged abstract-then-fulltext rule and classification scheme. Sub-skill for fact-check and critic-loop.
Provides reference guidance for citation verification in academic writing, including verification principles and common error patterns. Helps prevent fake citations and ensure citation accuracy.
Verifies every citation in LaTeX manuscripts by fetching arXiv papers and sources to detect ghost papers, wrong metadata, inverted claims, and dead links. Suggests bib fixes and prose rewrites.
Share bugs, ideas, or general feedback.
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.
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.
Every citation Claude inserts into academic prose must satisfy all four of these requirements. They are conjunctive — failing any one means the citation may not be made.
mcp__zotero__zotero_add_by_doi (or
mcp__zotero__zotero_add_by_url when no DOI exists) before the
citation is written.[@citekey] in prose is the Better BibTeX key fetched
from Zotero via mcp__zotero__zotero_get_item_metadata with
format="bibtex". Never hand-craft keys (Smith2019-style); never
fabricate; never write to Zotero's Extra field to pin a key.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.Ranked by strength:
mcp__zotero__zotero_get_item_fulltext — the
paper's own words, strongest grounding.mcp__zotero__zotero_get_notes — durable,
survives context compaction. Preferred when re-citing a paper multiple
times across a long session.mcp__openalex__get_work,
mcp__semantic-scholar__get-paper-abstract, or
mcp__zotero__zotero_get_item_metadata — minimum acceptable.Recommended pattern for papers cited repeatedly: the first time
Claude 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.
| 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.
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.
Smith2019) instead of fetching
the BBT key from Zotero.