NRT Agentic AI Michigan State University

DEMO 12 · ADVANCED — THE JOIN

Zotero + Obsidian + Claude Code

Both halves are folders, so the setup takes one cd. Keeping them in step is the hard part — and it is the part no workflow post covers.

Download Demo 12  ↓ ← Demo 11 All demos

← Back to all demos

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

Two owners, one folder

PathOwnerThe agent may
zotero/Zoteroread only
vault/papers/me, with helpread, write
vault/topics/meread, link — never write
vault/proposals/the agentwrite

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 10The vault. Are the notes right?
Demo 11The library. Can you cite what you have?
Demo 12The 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.