Looking for the step-by-step? This page explains why the demo is shaped the way it is. The handbook is the manual — prerequisites with verification commands, the full annotated file map, what every file does, how information flows, and the daily, weekly and monthly routines for keeping it running. The package itself also ships SETUP.md (step by step) and MAINTENANCE.md (how to live with it).
Package:
Demo12_zotero_obsidian_claude.zip · 550 KB · 30–40 minutes
There is nothing to connect. A Zotero library on disk is a
.bib export, a .csv export and a storage/
folder. An Obsidian vault is a folder of Markdown. Put them side by side,
cd to the parent, run claude. That is the integration
— no MCP server, no API key, no Local REST API plugin, no
.mcp.json.
Every guide to this subject spends its first ten minutes on setup you do not need, and none of them spends any time on what actually breaks.
What actually breaks
Seven notes in vault/papers/, written between November 2025 and
August 2026. Nine items in the library. Every note was correct the day
it was written.
Since then: the library was corrected, a duplicate was typed in by hand, an
attachment was replaced with the published version, and a PDF appeared in
storage/ that no item claims. None of the notes know any of this.
The one field holding the two systems together:
zotero_key: 4J8KQW2M
Eight characters, stable, and the only thing in either system that is. Not the title, which gets retyped. Not the cite key, which Better BibTeX regenerates whenever you fix metadata. Not the filename, which carries a year that may turn out to be wrong.
In this workspace, two of the seven notes have a
zotero_key that resolves.
The five ways they came apart
- A dead key. Points at nothing. The paper is in the library under a different key, matchable by DOI. The easy one.
- No key at all. Written before the convention existed. Shows up from the other side as “this library item has no note” — one problem, two symptoms, and an agent checking one direction reports it twice.
- The wrong record of the right paper. The key
resolves, so a naive check passes it — but it resolves to a
hand-typed duplicate with the same DOI, the wrong year and no attachment.
linkershould refuse to fix this silently: two items share one DOI, and quietly picking one buries a library problem you needed to see. - Stale metadata that already left the building. A note says
2024 / bioRxiv; the library says the same; the attached PDF says 2025,
Methods in Protein Science, different DOI. The library’s own
Extrafield admits it: "replaced attachment with published version." Three artefacts now carry the wrong year — the frontmatter, the filename, and a line reading "cited in the group slides as Lindqvist 2024 preprint." - Two notes, one paper, opposite conclusions. March: 23% improvement, from the abstract. July: 7.5%, from the table, plus "my earlier note on this paper is wrong." They point at different keys, so the join does not reveal they are the same paper. The Zotero duplicate has propagated into the vault, and the vault no longer knows it is contradicting itself.
Two owners, one folder
| Path | Owner | The agent may |
|---|---|---|
zotero/ | Zotero | read only |
vault/papers/ | me, with help | read, write |
vault/topics/ | me | read, link — never write |
vault/proposals/ | the agent | write |
Both Edit and Write are denied on
zotero/ and on vault/topics/. The first protects the
system of record; the second protects your own thinking.
Bash(mv:./zotero/**) is denied too — one plausible
“tidy up” and every attachment path stops resolving.
And linker may change one field:
zotero_key. Not the prose, not the claims, not the years —
even the ones that are wrong. Those belong to drift, which has
no Write tool at all.
The note you cannot cite
One note holds the strongest evidence in the workspace — the
ThermoNet-2 authors’ own supplement, reporting 8.0 °C on
the 43 held-out records whose sequences were not in training, against
the 4.9 in their abstract. Its source sits in zotero/storage/ and
belongs to no library item.
So it will never appear in a bibliography, a citation manager, or a reference list. The note says so itself: “This is the most important number I have and I cannot cite it.”
The fix is not a vault fix. It is: open Zotero, add the file, give it metadata. An agent that offers to add it to the library is about to write to a denied path, and should say instead that this one is yours to do.
Where this sits
| Demo 10 | The vault. Are the notes right? |
| Demo 11 | The library. Can you cite what you have? |
| Demo 12 | The join. Do the two still agree? |
Same literature across all three, so this one spends its time on the connection rather than re-teaching the papers.
Nothing here was anyone’s mistake. Metadata got
corrected, a duplicate got typed in, an attachment got replaced, a file got
dropped in a folder. Every note was right when it was written. The drift is
simply what ordinary use does to two systems with no shared identifier —
which is why the one line that matters in this whole package is
zotero_key:.
Using it on your own work
From Zotero: select a collection → right-click → Export
Collection → Better BibTeX with Export Files ticked, and
again as CSV. Drop both next to your vault, copy CLAUDE.md and
.claude/ across, add zotero_key to your note template,
and start filling it in.
That one field is the entire integration, and it is worth more than any MCP server you could install — because it survives a Zotero update, a vault rename, a change of reference manager, and a laptop.
What is verified and what is not. Every planted divergence was checked mechanically against the files: which keys resolve, which DOIs collide, which attachment paths are broken, which storage folder no item claims, and that the note and its PDF really do disagree about the year. The agent’s behaviour was not measured — assembled without Claude Code available, so the expectations here are predictions. The library and the papers are synthetic; do not cite anything in the package.