| name | verify-citations |
| description | Use when the user wants to check whether references / citations are real — "are these citations real", "check this bibliography", "did the AI make up these references", "verify the references in this paper", "真假文献", "核对参考文献", "这些引用是不是编的". Cross-checks each reference against an authoritative source and flags entries that cannot be confirmed (a common LLM-hallucination failure mode). Does NOT fabricate confirmations. |
| license | MIT |
| metadata | {"category":"zotero-research","primary-interface":"zot MCP + academic lookup MCP"} |
| triggers | ["citation","reference","bibliography","fake reference","hallucinated citation","参考文献","引用","真假文献","核对文献","文献核对"] |
Verify Citations
The user wants to know whether a set of references is real — i.e. catch citations
an LLM (or a careless author) fabricated: plausible-looking title + authors + venue
that resolve to no actual paper. This is a defensive, integrity-focused task. The
cardinal rule: never report a reference as verified unless an authoritative source
actually returned a match. A fabricated confirmation is worse than no answer.
Where the references come from
- "Check the references in this paper / what I'm reading" — first call
zotero_get_open_reader_state (else zotero_get_selected_items) to identify the
focused item, then read its reference list / full text via zot (full-text
extraction). Do not guess which paper they mean.
- A pasted list — the user pastes a bibliography or a chunk of "References".
Parse it into individual entries (title, authors, year, venue, DOI if present).
Where verification happens (you do NOT have your own database)
This skill checks each reference against an external authority. Use sources in this
order, falling back when one isn't wired:
- zot (preferred — first-party data layer). If zot exposes a citation /
literature lookup (search by title, DOI, or author+year, CrossRef / Semantic
Scholar backed), use it. Keeps verification in the local-first data layer.
- An academic lookup MCP, if the user has one wired into pi — e.g. Semantic
Scholar / asta, PubMed, CrossRef. Search each reference by title, then by
author+year, then by DOI.
- None available — say so plainly: "No citation-lookup source is wired (zot
search or an academic MCP). I can't verify these without one." Do not fall
back to guessing from memory — your own recall is exactly what produces fake
citations.
Per-reference verdict
For each entry, match on title (fuzzy) + first author + year + venue, and report one of:
- ✅ Verified — an authoritative source returned a clear match. Include the
canonical title and a stable identifier (DOI / S2 / PubMed ID) from the source, not
one you invented.
- ⚠️ Mismatch — a paper exists but a field is off (wrong year, wrong venue,
author mismatch, title drift). Show the reference vs. the real record so the user
can fix it. This is the classic "half-hallucinated" citation.
- ❓ Unverifiable — no match found. Say "could not confirm", not "fake":
obscure, very recent, paywalled, non-indexed, or book/grey-literature items may be
real yet unfound. Note the closest near-match if there is one.
Lead the report with a one-line tally (e.g. "12 refs: 9 verified, 1 mismatch, 2
unverifiable") then the per-entry detail. Keep it scannable.
Writing the result back (optional)
If the user wants the audit saved, offer to write it:
- as a child note on the focused paper →
zotero_add_note_to_current_item, or
- as a standalone note (e.g. when auditing a pasted list not tied to one item) →
zotero_create_standalone_note.
Confirm in ~1 line; don't re-paste the whole report into chat after writing it.
Anti-patterns (do NOT do these)
- Confirming from memory. Never mark a reference verified without a real lookup
hit. If no source is wired, stop and say so.
- Inventing identifiers. DOIs / IDs must come from the lookup result. Never
synthesize a DOI to make a citation look checked.
- Calling "not found" = "fake". Distinguish unverifiable from fabricated.
Only call something likely fabricated when a thorough search across the available
sources returns nothing close.
- Reimplementing zot. Searching / full-text extraction is zot's job; this skill
orchestrates it, it does not re-do it.
- Silent truncation. If you only checked the first N of a long list (rate/time),
say which were skipped — never imply full coverage you didn't do.