From researcher
Manage bibliography, sync Zotero/Mendeley, validate DOIs, convert citation formats. Triggers: add citation, manage bibliography, sync zotero, import references, check citations, validate bib, convert citations.
How this skill is triggered — by the user, by Claude, or both
Slash command
/researcher:citation-managementThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Maintains a validated, consistent bibliography in `library.bib` with full lifecycle management: import, validate, convert, audit.
Maintains a validated, consistent bibliography in library.bib with full lifecycle management: import, validate, convert, audit.
NEVER fabricate or hallucinate bibliography entries. Every BibTeX entry must originate from a real source: a user-provided reference, a DOI lookup, a Zotero/Mendeley import, or a literature-search result. If a DOI cannot be resolved, flag the entry rather than guessing metadata.
Validation and any "clean" declaration route through the researcher_core evidence kernel, which resolves and verifies each entry deterministically instead of asking the model to judge whether a citation is real. Full command and JSON reference: references/core-cli.md.
Run before ANY bibliography is declared clean:
uv run --project "${CLAUDE_PLUGIN_ROOT}/core" python -m researcher_core verify-bib manuscript/references/library.bib --json
Default sources: openalex,crossref,datacite. The report is {schema_version, protocol_version, versions{}, input{}, thresholds{}, sources_queried[], entries[], summary{}}. Consume, per entries[]:
verdict (axis a, identity): verified | mismatch | unresolvable | inconclusiverefusal_grade (bool): the kernel's own refusal decision. Trust it; never re-derive it.reason, source_outcomes[] (each confirmed | negative | source_error), tally, best_matchstatus{} (axis b): current | corrected | retracted | expression-of-concern, or checked: falseaccessibility{} (axis d): full-text | abstract-only | unavailableA focused publication-status sweep over the same library. verify-bib already carries a per-entry status block; run status when you want a standalone re-check (e.g. months after the last verify):
uv run --project "${CLAUDE_PLUGIN_ROOT}/core" python -m researcher_core status manuscript/references/library.bib --json
Default sources: crossref,openalex. Report shape {... entries[], summary{}}, each entry carrying the axis (b) verdict above. status.checked: false is an absence of evidence, NOT a clean bill of health: do not read it as current.
Consume the FOUR-STATE identity verdict, never a boolean. Refusal-grade behavior (withholding an entry, telling the user a citation looks fabricated or wrong) fires ONLY on:
unresolvable or mismatchretractedcontradictedinconclusive is NEVER refusal-grade: it means a source errored or only one index holds the paper, so a clean negative could not be asserted. Acting on it would accuse an honest author of fabricating a real citation, the worst failure this skill can make. Surface it as an open item and move on. insufficient-passage (axis c) and corrected / expression-of-concern (axis b) are likewise surfaced for human review, never refusal-grade on their own.
A bibliography is declared CLEAN only when verify-bib reports ZERO refusal-grade entries:
unresolvable, zero mismatch (axis a), zero retracted (axis b).inconclusive entries are LISTED for human review and do NOT block the clean declaration.corrected and expression-of-concern are surfaced as mandatory checkpoints (a retraction or concern is a disclosure decision, never a silent drop) but do not, by themselves, block clean.State the count of each surfaced-but-non-blocking class in the report so nothing is hidden.
Core is optional; the plugin never hard-fails without it. Prefer core, then degrade, and STATE in the output which backend produced the report:
verify-bib / status (above) when uv and core/ are present, or via the pip install -e core/ fallback (researcher-core verify-bib ... --json).scripts/bib-validator.py (the M1 stdlib validator) when core is absent: python scripts/bib-validator.py manuscript/references/library.bib --check-doi --check-retracted --check-fields. It resolves DOIs and checks retraction/fields without core, but returns coarser signals (no four-state axis verdicts); map its failures conservatively and never manufacture a refusal-grade verdict from a network error.manuscript/references/library.bib. If it does not exist, create it with a header comment block.Generate keys in authorYear style:
smith2024smithJones2024smithEtAl2024smith2024a, smith2024b)When a key collision is detected, append a disambiguating keyword from the title: smith2024attention.
10.1234/example)https://api.crossref.org/works/{doi}library.bibhttps://api.crossref.org/works?query.bibliographic={title}&rows=3% UNVERIFIED: no DOI resolvedlibrary.bibRequires Zotero MCP connector.
library.bib entries (match by DOI, then by title similarity)Requires Mendeley MCP connector.
library.bib entries.bib filelibrary.biblibrary.bibRun validation on all entries in library.bib or on a specific subset.
For each entry with a doi field:
https://doi.org/{doi} (expect HTTP 302)% WARNING: DOI does not resolveFlag entries missing required fields:
@article: author, title, journal, year, volume@inproceedings: author, title, booktitle, year@book: author/editor, title, publisher, year@phdthesis / @mastersthesis: author, title, school, year@misc / @online: author, title, year, url or doiCheck journal name against known predatory journal indicators:
% WARNING: Potential predatory journal, verify manuallyPublication status is axis (b) of the Deterministic backend: core verify-bib carries a per-entry status block and status runs a focused sweep. Verdicts: current, corrected, retracted, expression-of-concern.
retracted verdict is refusal-grade and blocks a clean declaration. Flag it prominently: % RETRACTED: do not cite without disclosure, and report the retraction reason when available.corrected and expression-of-concern are surfaced as checkpoints (a disclosure decision), never silent drops, and do not block clean on their own.update-to via python scripts/bib-validator.py manuscript/references/library.bib --check-retracted.Route full-library validation through the Deterministic backend: run core verify-bib (and, for a standalone status re-check, status) and read the per-entry verdict, refusal_grade, status, and accessibility fields. Apply the Clean-declaration gate: the library is clean only with ZERO refusal-grade entries (unresolvable, mismatch, retracted); inconclusive, corrected, and expression-of-concern entries are surfaced for human review and do NOT block a clean declaration.
When core is unavailable, fall back to the M1 stdlib validator (same D3 degradation path) and say so in the output:
python scripts/bib-validator.py manuscript/references/library.bib --check-doi --check-retracted --check-fields
Present a summary table of issues, keeping refusal-grade blockers separate from surfaced-for-review items and stating the count of each class.
Convert citation style for in-text citations and reference list formatting. This does NOT change library.bib (which is always BibTeX). It changes how citations render in the manuscript.
| Format | In-text example | Config |
|---|---|---|
| APA 7 | (Smith et al., 2024) | biblatex with style=apa |
| IEEE | [1] | biblatex with style=ieee |
| Chicago | (Smith 2024) | biblatex with style=chicago-authordate |
| Vancouver | (1) | biblatex with style=vancouver |
| MLA | (Smith et al. 42) | biblatex with style=mla |
manuscript/config.yaml or main.tex preamble\usepackage[style=...]{biblatex} in main.tex\citep, \citet, \parencite, \textcite) to match target style packageScan all .tex files in manuscript/ for \cite{...}, \citep{...}, \citet{...}, \parencite{...}, \textcite{...} commands. Extract all referenced keys. Compare against keys in library.bib.
.tex but absent from .bib: missing citationCompare all keys defined in library.bib against all keys referenced across .tex files.
.bib but never referenced: unused entryScan manuscript text for factual statements (sentences containing quantitative claims, comparisons, or assertions about prior work) that lack a nearby \cite{} command. Flag these as potentially unsupported. This is a heuristic check: present results as suggestions, not errors.
Citation Audit Report
=====================
Total .bib entries: 47
Total \cite keys in manuscript: 42
Missing citations (in .tex but not in .bib): 3
- \cite{wang2023transformer} in introduction.tex:14
- \cite{liuEtAl2024} in methods.tex:87
- \cite{chen2022benchmark} in results.tex:31
Unused entries (in .bib but not in .tex): 8
- zhang2020survey
- patel2019deep
- ...
Validation issues: 2
- smith2024: DOI does not resolve
- globalJournal2023: Potential predatory journal
Potentially unsupported claims: 4
- introduction.tex:22: "Transformers have achieved state-of-the-art..."
- discussion.tex:15: "Previous studies show a 30% improvement..."
- ...
Triggered by: "citation integrity", "verify citations", "check citation accuracy", "are my citations correct"
Goes beyond checking whether citations exist: it verifies whether each citation is used honestly and accurately in the manuscript.
Claim-source alignment anchors on the Deterministic backend's M2 passages, not on the model's memory. Index the cited paper, then score the claim with core:
uv run --project "${CLAUDE_PLUGIN_ROOT}/core" python -m researcher_core passages index <doi> --json
uv run --project "${CLAUDE_PLUGIN_ROOT}/core" python -m researcher_core faithfulness "<claim>" --doc <doc-id> --json
Axis (c) verdicts are supported, partial, contradicted, insufficient-passage. Rules:
full-text or abstract-only. When OA full text is unavailable, the verdict is insufficient-passage (never "clean" or "faithful"): it is an abstention with clean: false and no passage anchors, surfaced as an open item, never refusal-grade.contradicted is refusal-grade: flag the citation as a likely misrepresentation.supported and miss subtle scope inflation. Present its verdicts as evidence for human review, not as proof, and defer to Scite context when connected.Degradation (D3): without core, use Scite MCP smart citations for claim context; without Scite, fall back to abstracts and metadata, and lower confidence accordingly.
For each \cite{} in the manuscript, perform the following checks:
Citation Integrity Audit
========================
Total citations analyzed: 34
Verified (high confidence): 28
Uncertain (needs manual check): 4
Flagged (potential misrepresentation): 2
Detailed Findings:
[HIGH CONFIDENCE] \cite{smith2024} in introduction.tex:15
Claim: "Transformers outperform RNNs on long-range dependencies"
Source says: Confirmed, paper's main finding
Confidence: 95%
[FLAGGED] \cite{jones2023} in discussion.tex:42
Claim: "Previous work confirms our approach is optimal"
Source says: Paper actually presents a competing approach with better results
Confidence: 82%
Action: Review this citation, may be misrepresenting the source
[UNCERTAIN] \cite{chen2022} in methods.tex:28
Claim: "Standard preprocessing pipeline (Chen et al., 2022)"
Source says: Could not retrieve full text to verify preprocessing details
Confidence: 40%
Action: Manually verify that your pipeline matches what Chen et al. describe
When the Scite MCP server is connected, the integrity audit is significantly more powerful:
library.bib to extract all entries with their keys, types, and fieldslibrary.bib.tex fileOn request, sort library.bib entries by:
.bib entry creationlibrary.bib is created by manuscript-setup; citation-management maintains it thereafterverify-bib / status: the deterministic validation backend; citation-management routes clean declarations through it and reads the four-state verdicts (see Deterministic backend)Check which connectors are available before attempting imports. If a connector is unavailable, inform the user and suggest manual alternatives (DOI entry, .bib file import).
Resolve DOI: GET https://api.crossref.org/works/{doi}
Search by title: GET https://api.crossref.org/works?query.bibliographic={title}&rows=5
Include mailto parameter for polite pool: [email protected]
Use Zotero MCP connector tools to list collections and fetch items. Convert Zotero JSON to BibTeX fields.
Use Mendeley MCP connector tools to authenticate, list folders, and fetch documents. Convert Mendeley JSON to BibTeX fields.
Canonical copy: references/integrity-constraints.md.
npx claudepluginhub sokolmarek/researcherPlans, audits, and formats academic references. Checks citation authenticity, relevance, retractions, and coverage. Generates BibTeX, GB/T 7714, APA, IEEE, etc.
Compares reference managers Zotero, Mendeley, EndNote, Paperpile; covers APA/Vancouver/ACS/Nature styles, DOI management, citation tracking, and integrations with Word/Google Docs/LaTeX. Useful for scientific writing workflows.
Verifies every citation in a manuscript by fetching cited works to detect ghost papers, wrong IDs, inverted claims, and dead links. Includes optional fix mode for bib corrections and claim rewrites.