zotero-mcp
AGENTS.md1 starsChanged 12 days agoMITView on GitHub
Servidor MCP por stdio (Node ≥ 18, ESM, JavaScript sin compilar) para la biblioteca local de Zotero, empaquetado como plugin de Antigravity (plugin.json, mcp_config.json, skills/). Lee de la API local de Zotero, guarda items nuevos a través del conector de Zotero y edita documentos .md/.docx del usuario. Uso, herramientas y configuración para el usuario: README.md.
- Reads credentials
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,439 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository2 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- zotero-researchSkill
The file
We split this AGENTS.md into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 42
No hay linter, formatter ni typecheck.
- Very specific: line 57
No commitees .env. El servidor no lee .env: las variables llegan del cliente MCP vía mcp_config.json.
- Distinctive: line 78
Commit y push solo cuando el dueño lo pida.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
zotero-mcp — instrucciones para agentes
Servidor MCP por stdio (Node ≥ 18, ESM, JavaScript sin compilar) para la biblioteca
local de Zotero, empaquetado como plugin de Antigravity (plugin.json,
mcp_config.json, skills/). Lee de la API local de Zotero, guarda items nuevos a
través del conector de Zotero y edita documentos .md/.docx del usuario.
Uso, herramientas y configuración para el usuario: README.md.
Mapa del repositorio
src/server.js: entrada stdio.src/app.js:createServer(ctx)registra todas las herramientas (los tests lo usan en memoria).src/context.js: variables de entorno →configy clientes compartidos (ToolContext).src/tools/: registro de herramientas por área (library,citations= Markdown,word=.docx,external);shared.jstieneok/fail/run.src/zotero-client.js(API local, lectura),src/zotero-connector.js(conector, guardar),src/external-search.js(OpenAlex/Crossref).src/cite.js(citeproc y registro de citas en memoria),src/bib-section.js(sección de referencias en Markdown),src/docx.js(OOXML y camposZOTERO_ITEM/ZOTERO_BIBL),src/file-io.js(escritura segura),src/workspace.js(carpetas permitidas).src/csl/,src/locales/: estilos y locales CSL de terceros (CC-BY-SA 3.0); no editarlos a mano.skills/zotero-research/SKILL.md: instrucciones para el agente que usa el MCP.estructura-skills-mcp-plugins-antigravity.md: guía genérica de plugins de Antigravity con ejemplos ficticios (SQL, SAP); no describe este proyecto.
Límites de arquitectura
- Solo
src/server.js,src/app.jsysrc/tools/importan@modelcontextprotocol/sdkozod. Los clientes y la lógica de documentos no dependen de MCP. - Las herramientas reciben sus dependencias por
ctx; no crean clientes ni leenprocess.env. Una variable nueva se lee enloadConfigconenvValue(que ignora${VAR}sin expandir) y se añade a.env.example,mcp_config.jsony la tabla de configuración de ambos README. - Los handlers envuelven la lógica en
run(...)y responden conok(payload)/fail(mensaje); los errores son mensajes en español que dicen qué hacer. - stdout es el canal JSON-RPC: nada de
console.logensrc/; diagnóstico solo conconsole.error. - Toda ruta de documento pasa por
workspace.resolve(filePath, { extensions })antes de leerla. - Toda escritura de documento va dentro de
withFileLock, lee conreadFileForEdit/openDocxy escribe conwriteFileAtomic/saveDocx(huella mtime/tamaño,.bak, renombrado atómico). Nuncafs.writeFiledirecto sobre un documento. - Las herramientas que escriben solo lo hacen con
apply: true; sin él devuelven vista previa. - Biblioteca de Zotero: solo lectura por la API local; la única escritura es
zotero_add_item(conector,apply: true). No añadir operaciones que editen o borren items. src/docx.jsparsea conpreserveOrdery sin procesar entidades para que abrir → guardar reproduzca el documento: decodificar condecodeXmlal leer y codificar conencodeXmlal crear nodos. No cambiarXML_OPTSsin pruebas de ida y vuelta entests/docx.test.js.- Las citas
.docxsiguen el formato del plugin de Word (URI del item,citationIDaleatorio,noteIndex0) yensureDocumentPrefsnunca pisa preferencias existentes. - Estilos y locales:
AVAILABLE_STYLESyLOCALESensrc/cite.jsse leen desrc/csl/<nombre>.cslysrc/locales/locales-<código>.xmlal arrancar; no hay listas fijas que mantener. - La versión sale solo de
package.json(src/version.js).
Comandos
- Instalar:
npm install(CI usanpm ci). - Pruebas:
npm test(node --test, descubretests/*.test.js; no necesita Zotero ni red). - Smoke:
node scripts/smoke.mjs; debe acabar enOK: todas las herramientas esperadas están presentes. - Arrancar:
npm start(stdio; se queda esperando JSON-RPC). - Dependencias:
npm audit --omit=dev --audit-level=high(igual que CI). - No hay linter, formatter ni typecheck. Sigue el estilo existente: ESM, comillas simples, punto y coma, 2 espacios, JSDoc en funciones exportadas.
Pruebas
- Herramientas MCP:
tests/server.test.jsconfakeContext()+InMemoryTransport. Clientes HTTP: stub deglobalThis.fetch, restaurado al terminar. - Archivos de prueba en
mkdtempSync(path.join(tmpdir(), ...)), borrados al terminar. - Cada bug corregido lleva su prueba de regresión.
- CI (
.github/workflows/ci.yml): Node 18, 20, 22 y 24 en Linux y Node 22 en Windows. No uses APIs que no existan en Node 18 y cuida rutas y bloqueos de archivos en Windows.
Datos del usuario y seguridad
- Nunca modifiques documentos reales del usuario: prueba con copias en una carpeta temporal.
- Contra el Zotero real no ejecutes nada que escriba (
zotero_add_itemconapply: true) ni herramientas de documentos conapply: truesobre documentos del usuario, salvo que el dueño lo pida. scripts/e2e.mjsllama al servidor contra el Zotero real: úsalo solo con herramientas de lectura (rechazaapply: truesalvo con--allow-write; no lo pases sin que el dueño lo pida). En Windows, ejecútalo desde Git Bash o PowerShell 7 (pwsh); Windows PowerShell 5.1 quita las comillas del JSON.- A OpenAlex/Crossref solo se envían la consulta o el DOI (y
OPENALEX_API_KEY/ZOTERO_MCP_CONTACT_EMAILsi están). No envíes contenido de documentos ni de la biblioteca. - No commitees
.env. El servidor no lee.env: las variables llegan del cliente MCP víamcp_config.json.
Al cambiar herramientas MCP
Si añades, renombras o cambias parámetros de una herramienta, actualiza en el mismo cambio:
EXPECTEDenscripts/smoke.mjs(si cambia la lista);- los comentarios de cabecera de
src/server.jsysrc/app.js; - la tabla de herramientas y los ejemplos de ambos README;
skills/zotero-research/SKILL.md, si cambia el flujo del agente;CHANGELOG.md.
Idioma y documentación
- Código, comentarios, mensajes de error, descripciones de herramientas, CHANGELOG y commits: en español.
README.md(inglés) yREADME-SPANISH.md(español) son espejo: mismas secciones, tablas y ejemplos. Un cambio en uno se hace en el otro en el mismo commit.CHANGELOG.mdsigue Keep a Changelog: las entradas nuevas van en## [Sin publicar], en Añadido / Cambiado / Corregido / Seguridad.- Release: versión en
package.jsonypackage-lock.json, mover[Sin publicar]a## [X.Y.Z] - AAAA-MM-DD, actualizar los enlaces de comparación al final del CHANGELOG; commitchore(release): versión X.Y.Z. Las versiones publicadas tienen tagvX.Y.Z.
Git
- Commit y push solo cuando el dueño lo pida.
- Rama desde
maincon prefijo de tipo (feat/,fix/,docs/,chore/,ci/,refactor/,release/) y PR haciamain; no commitees directamente enmain. Nunca force push. - Mensajes:
tipo(ámbito): descripciónen español y en minúscula; el cuerpo explica qué cambia y por qué. - Los commits van a nombre de Roberto Aguilar con la identidad git local del repo; no la cambies.
- Nunca añadas
Co-Authored-By: Claudeni "Generated with Claude Code" en commits ni PRs.
Antes de terminar
npm testnode scripts/smoke.mjs- Si cambiaron dependencias:
npm audit --omit=dev --audit-level=high - Si el cambio es visible al usuario: ambos README y
CHANGELOG.mdactualizados.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

