| name | reference-workbench |
| description | Academic citation toolkit โ verify reference authenticity or write literature reviews with auto-generated bibliographies. Checks paper existence, metadata accuracy, and whether cited claims are actually supported. Supports PDF, DOCX, TXT, Markdown, LaTeX. Use when user asks to: "check citations", "verify references", "audit citations", "validate my references", "are these citations real", "write introduction", "write literature review", "review my lit review", "generate bibliography", "format references", "check my paper's citations", "citation audit", "fact-check references", "proofread citations", "verify my bibliography", "ๅธฎๆๆฅๅผ็จ", "ๆฃๆฅ่ฎบๆๅผ็จ", "ๅๆ็ฎ็ปผ่ฟฐ", "้ช่ฏๅ่ๆ็ฎ", "ๅผ็จๆฅ่ฏ". Merges former citation-check and introduction-review skills.
|
| user-invocable | true |
| allowed-tools | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, AskUserQuestion, Agent, TaskCreate, TaskUpdate, TaskList |
| compatibility | Search MCPs (paper lookup): arxiv, scholar, paper-search, crossref. Tool MCPs (file reading): pdf-reader. Python package: rich.
|
| version | 2.0.0 |
| license | MIT |
| metadata | {"author":"haiyichen001","version":"2.0.0","category":"academic-writing","language":"bilingual (ไธญๆ / English)","tags":["citation-verification","citation-check","literature-review","reference-management","reference-validation","academic-writing","bibliography","paper-check","citation-audit","introduction-writing","lit-review","academic-publishing","research-writing"],"supported-formats":["PDF","DOCX","TXT","Markdown","LaTeX"],"sources":["agentskills.io specification","Semantic Scholar API (via scholar MCP)","arXiv API (via arxiv MCP)","Google Scholar (via paper-search MCP)","PubMed / bioRxiv / medRxiv (via paper-search MCP)","Crossref + OpenAlex (via crossref MCP)"],"replaces":["citation-check-skill (https://github.com/haiyichen001/citation-check-skill)","introduction-review-skill (https://github.com/haiyichen001/introduction-review-skill)"],"created":"2026-05-14","modified":"2026-05-14"} |
| mcp-categories | {"search":["arxiv (arXiv API)","scholar (Semantic Scholar)","paper-search (PubMed / bioRxiv / Google Scholar)","crossref (Crossref DOI + OpenAlex + Semantic Scholar)"],"tool":["pdf-reader (PDF extraction)"],"optional":["zotero (reference library integration โ local API, no key needed)","deepl (academic translation / rephrasing โ free API key)"]} |
Reference Workbench
Single pipeline: Write โ Self-Audit โ Auto Quick Check โ (when done) Offer Deep Check.
- After every write operation, run a silent quick check โ no user prompt needed.
- When the user is done with all changes, ask once whether to upgrade to normal or deep.
Phase 0 โ MCP Dependency Check
Scan MCP tools. Output two lines โ search first, then tools:
Search: arxiv โ
| scholar โ
| paper-search โ
| crossref โ
Tool: pdf-reader โ
If any required MCP is missing, stop and output install commands. Also run python ${CLAUDE_SKILL_DIR}/scripts/setup.py to check Python and rich.
Phase 1 โ Determine Task
Auto-detect from user input. Do NOT ask "which mode?".
| User says (keywords) | Action |
|---|
| write, draft, rewrite, review, literature, intro, ๅ, ็ปผ่ฟฐ, ๅผ่จ, ่็จฟ | โ Phase 2 (Writing) |
| check, verify, audit, validate, ๆฅ, ้ช, ๆฃๆต | โ Phase 3 (Verification directly) |
| Provides a file | Read file โ go directly to Phase 3 (Verification) |
If ambiguous ("ๅธฎๆ็็่ฟ็ฏ่ฎบๆ") and no file given, default to Writing.
Phase 2 โ Writing & Self-Audit
Core loop: normalize โ run cite_table.py โ relay table โ self-audit.
- LLM normalizes: convert ANY citation format (
[REF01], \cite{key}, [@key], bare [1], etc) to [CITE:descriptiveKey]
- Script verifies:
cite_table.py only reads [CITE:key]. Hard-coded, deterministic.
- Table proves: every normalized citation appears in output โ nothing missed or invented.
When NOT to Use
Single-paper summary, pure grammar polishing, non-academic writing, format conversion only.
Five Scenarios
| User says | Agent does |
|---|
| New review | Draft with [CITE:xxx] โ script โ table |
| Rewrite draft | Normalize existing citations to [CITE:xxx] โ script โ table |
| Add citation | Insert [CITE:xxx] โ re-run script โ table |
| Remove citation | Remove [CITE:xxx] โ re-run script โ table |
| Audit | Re-run script โ checks โ table |
Every scenario ends: cite_table.py โ Read cite_output.txt โ paste table + checks. Then proceed to silent quick check below.
The draft always uses [CITE:descriptiveKey] placeholders. The script numbers them and outputs the table โ but the source of truth is the draft itself. Self-audit checks are always performed against the draft with [CITE:xxx] placeholders, never against the numbered output alone.
Always-On Checks
After every citation change, re-run cite_table.py and walk through:
- Stacking โ >3 in one bracket? Warn. >5? Block.
- Format โ venue mismatch? Load
references/citation-formats.md (on-demand) when user specifies a venue. Re-check after ref generation.
- Order โ gaps or jumps? Script catches this.
- Orphan โ in-text count != reference count? Report.
- Tone โ
references/diplomatic-critique.md (loaded at startup). Never "fails to", "ignores", "fundamentally flawed".
- Citation depth โ most citations: who + did what + found what +
[CITE:xxx]. Opening/transition sentences can be broad. Body paragraphs: each cited paper gets its own sentence.
- Two valid positions: sentence-end (
...reduced errors by 23% [CITE:smith2023].) or natural pause (...as shown in prior work [CITE:jones2021;CITE:lee2022], the trend...).
- NEVER:
, [CITE:xxx], (comma sandwich) or Smith [CITE:smith2023] proposed (author-attached). Script flags these as โ ๏ธ.
Report: one line per check, โ
or โ ๏ธ. Then full re-scan (never fix one and skip the rest). Then read all [CITE:xxx] aloud from the draft to catch awkward flow.
Table Protocol (Mandatory)
Auto-detect .bib file in project dir. If found, use --bib mode.
python ${CLAUDE_SKILL_DIR}/scripts/cite_table.py <draft> [--bib <bib_file>]
Read: ${CLAUDE_SKILL_DIR}/scripts/cite_output.txt
โ Paste table + audit. Then: "Need to add, remove, or change any citations?"
Without --bib: 5 columns (# | Author | Body Context | Reference | Status). With --bib: 6 columns comparing body order, bib key, bib position, and reference list order. Bilingual (ไธญๆ/English auto-detected). Repeated citations get โณ sub-rows.
Reference Files
anti-laziness-protocol.md โ loaded at startup. Mandatory 5-step verification gate. Itemized only, no batching.
citation-placement-rules.md โ loaded on-demand during self-audit checks. Citation position rules (sentence-end / comma sandwich / author-attached).
diplomatic-critique.md โ loaded at startup. Mandatory tone guard.
citation-formats.md โ loaded on-demand when user specifies a venue. IEEE/SCI/EI/GB7714/APA/MLA/Chicago/ACM rules.
citation-fields.md โ loaded on-demand for metadata cross-checking by citation type.
Script
cite_table.py โ single core engine. Scan, number, table, position check, bilingual, --bib mode.
Phase 3 โ Auto Quick Check (Silent, Small Drafts Only)
After every write scenario completes, count unique [CITE:xxx] placeholders:
| Unique citations | Action |
|---|
| < 5 | Run silent quick check |
| โฅ 5 | Skip โ defer to Phase 5 (too many citations for per-edit checking) |
When the threshold is met (< 5 refs):
- Extract all unique
[CITE:xxx] placeholders from the draft
- For each, run a quick existence check only (no metadata/content layers):
- Try DOI lookup โ arXiv lookup โ title search. Stop at first hit.
- If all fail โ flag as โ unchecked
- Output a one-line summary:
Quick check: 3 refs โ 3 found โ
No AskUserQuestion. If all found โ no extra output beyond the summary line. If any unchecked โ flag it and note that Phase 5 will offer a deeper check.
Phase 4 โ Deep Citation Verification (On Request)
Reachable via two paths:
- Direct: user provides a file and says "check citations" โ start here after Phase 0
- Upgrade: after completing all writing, Phase 5 offers this โ jump here
4.1 โ Ask Scope & Depth
Call AskUserQuestion with two questions:
Question 1 โ Scope (single-select)
- header: "Scope"
- options:
all / "Verify all (M unique papers)"
selected / "Manual selection (e.g. 1,3,5-8)"
- multiSelect: false
Question 2 โ Depth (single-select)
- header: "Depth"
- options:
quick / "Quick โ Abstract/TLDR only (~10-15k tokens/citation)"
normal / "Normal โ Abstract+Intro+Conclusion (~20-50k tokens/citation) [Recommended]"
deep / "Deep โ Full-text section-by-section (~50-150k tokens/citation) [Token-heavy]"
- multiSelect: false
Wait for user response before Phase 4.2.
4.2 โ Read File
| Format | Method |
|---|
| PDF | mcp__pdf-reader__read_pdf |
| DOCX | python-docx via Bash |
| TXT/MD | Read |
| LaTeX | Read + parse \cite{} \bibitem{} |
4.3 โ Extract Citations
Output raw list:
File: paper.pdf (5 pages) | Found N citations | Type: journal/conference/...
[1] journal | Vaswani et al. (2017) "Attention Is All You Need"
Location: ยงI, "code-centric automation..."
[2] ...
4.4 โ Deduplicate
Normalize by title + first author (title: strip punctuation, lowercase; first author: last name). Same paper cited multiple times โ merge, keep all locations.
Dedup: N raw โ M unique papers (N-M duplicates removed)
[1,7] journal | Vaswani et al. (2017) "Attention Is All You Need"
Locations: ยงI "code-centric..." / ยงIII "self-attention enables..."
[2] conference | ...
[3,5,9] preprint | ...
4.5 โ Parallel Verification (10 per round)
Rules
- Strictly 10 unique papers per round, overflow auto-continues
- Each paper gets one independent general-purpose sub-agent, all launched in parallel
- Agents update status via TaskUpdate
- Round completes โ auto-advance to next round
Single-paper agent task
Each agent receives: original number list (e.g. [1,7]), title, authors, year, DOI/ArXiv ID (if available), context around each citation location (ยฑ3 sentences).
Three-layer check:
Layer A โ Existence (with fallback chain)
Try each step in order. Any success โ stop. Max 1 retry per step (timeout/network). Failure โ next step.
| Priority | Condition | Tool | On failure |
|---|
| 1 | Has DOI | mcp__scholar__get_paper | โ Priority 2 |
| 2 | Has ArXiv ID | mcp__arxiv__get_abstract | โ Priority 3 |
| 3 | Has title | mcp__scholar__search_papers (full title) | โ Priority 4 |
| 4 | Title search failed | Strip punctuation, quote core phrase, keep 5-8 words, retry mcp__scholar__search_papers | โ Priority 5 |
| 5 | Title search still failed | mcp__arxiv__search_papers | โ Priority 6 |
| 6 | Previous two failed | mcp__paper-search__search_google_scholar | โ Priority 7 |
| 7 | Only author+year+keywords | mcp__scholar__search_papers (author + 2-3 core keywords) | โ Priority 8 |
| 8 | All above failed | WebSearch (paper title + "paper" / "pdf") | โ Unverifiable |
Record every fallback path. Final report shows actual data sources used.
Layer B โ Metadata
Cross-check against references/citation-fields.md. Author, title, journal, year, volume/issue/pages are mandatory match fields.
Layer C โ Content support (depth set by user in Phase 4.1)
| Depth | Scope |
|---|
| quick | Abstract + TLDR |
| normal | Abstract + Introduction + Conclusion |
| deep | Full-text section by section |
Extract the claim at each citation location, compare with actual paper content: supports / exaggerates / unrelated / contradicts.
Progress display
Round start:
โโ Round 1/3 โ [1]-[10] โ Depth: normal โโโโโโโโโโโโโโโโโโโโ
โณ Launching 10 agents in parallel...
Agent completion (real-time):
โ
[1] Vaswani 2017 โ passed
โ ๏ธ [4] Yao 2022 โ year mismatch
โณ [5] Daareyni 2025 โ checking...
Round complete:
โโ Round 1/3 done โ โ
8 โ ๏ธ1 โ0 ๐0 ๐1 โ 11 remaining, entering Round 2...
4.6 โ Summary Report
# Citation Verification Report
File: xxx.pdf | Total citations: N
โ
Verified: N | โ ๏ธ Metadata mismatch: N | โ Fabricated: N | ๐ Unverifiable: N | ๐ Content mismatch: N
[1,7] โ
Author (Year) "Title"
Type: journal | Locations: ยงI Line 42, ยงIII Line 128
Metadata: all match
Content: ยงI claim "xxx" โ supported โ / ยงIII claim "yyy" โ supported โ
Evidence: DOI/arXiv link
[2] โ ๏ธ Author (Year) "Title"
Type: conference | Location: ยง2.1 Line 56
Metadata mismatch: year 2019 โ actual 2018
...
[3] โ Author (Year) "Title"
Result: paper does not exist, journal does not exist
...
Judgment criteria
Exists? โNoโ โ Fabricated
โYesโ Metadata matches?
โNoโ โ ๏ธ Metadata mismatch
โYesโ Content supports claim?
โNoโ ๐ Content mismatch
โYesโ โ
Verified
โUncertainโ ๐ Unverifiable
Phase 5 โ Final Deep Check Offer
When the user indicates they are done with all writing (session ending, "looks good", "done", "submit", etc.), call AskUserQuestion with one question:
Question โ Upgrade to deeper check? (single-select)
- header: "Final Check"
- options:
normal / "Normal โ re-verify with Abstract+Intro+Conclusion (~20-50k tokens/citation) [Recommended]"
deep / "Deep โ full-text section-by-section (~50-150k tokens/citation) [Token-heavy]"
no / "No โ quick checks were sufficient"
- multiSelect: false
Context: mention how many quick checks ran and how many refs passed ("We ran 3 quick checks on 15 refs โ all found. Upgrade to a deeper verification?").
If user chooses normal or deep โ jump to Phase 4 with that depth and all scope.
If user chooses no โ output: "Done. Run /reference-workbench check <file> anytime to re-verify."
Optional MCPs (Not Required)
These enhance the skill but are not mandatory. If missing, the skill runs normally.
| MCP | What it adds | Install |
|---|
| Zotero | Search your Zotero library, import papers, read PDF annotations, write Word docs with live citations | npx smithery install @alisoroushmd/zotero-mcp |
| DeepL | Academic translation (ไธญๆ โ English), glossary-locked terminology, rephrase for clarity | npm install deepl-mcp-server (needs free API key) |
If installed, the agent can use them automatically during write sessions for reference management and translation tasks.