MCP Bridge for Zotero

Servidor MCP que permite a asistentes de IA construir, probar y depurar plugins de Zotero mediante 26 herramientas para inspección de interfaz, ejecución de JS, registro y más.

Documentación

Servidor MCP Zotero Dev

Dale superpoderes a tu asistente de IA para el desarrollo de plugins de Zotero

License: MIT Zotero 7+

Arquitectura · Primeros pasos · Herramientas disponibles

MCP Server Zotero Dev in action

Un servidor de Protocolo de Contexto de Modelo (MCP) que permite a asistentes de IA como Claude, Cursor y Windsurf crear, probar y depurar plugins de Zotero 7, 8, 9 y 10. Capturas de pantalla, estado del DOM, registros de depuración y ejecución de JavaScript brindan al asistente de IA un contexto rico para comprender lo que está sucediendo, además de herramientas para ayudarte a solucionarlo.

✨ Características

CategoríaCapacidades
🎯 Inspección de interfazCapturas de pantalla, árbol DOM, búsqueda de elementos, estilos calculados
🖱️ Interacción con la interfazHacer clic en elementos y escribir texto (compatible con shadow DOM)
💻 Ejecución de JavaScriptEjecutar código en el contexto de Zotero, inspeccionar APIs, probar fragmentos
🔧 Herramientas de compilaciónIntegración de andamiaje para compilar, servir y recargar en caliente
📋 Registros y erroresTransmitir salida de depuración, consola de errores, monitorear problemas
🗃️ Base de datosAcceso de solo lectura a zotero.sqlite para depuración
🔌 Gestión de pluginsInstalar, recargar y listar plugins

🚀 Inicio rápido

Requisitos previos

  • Node.js 20+ y npm
  • Zotero 7+ — Funciona en todas las versiones de Zotero 7, 8, 9 y 10 (release, beta, dev)
  • Para desarrollo de plugins: zotero-plugin-scaffold

1. Instalar el servidor MCP

Usa install-mcp para agregar el servidor a tu asistente de IA:

npx -y install-mcp @introfini/mcp-server-zotero-dev --client claude-code

Clientes compatibles: claude-code, cursor, windsurf, vscode, cline, roo-cline, claude, zed, goose, warp, codex

Claude Code
npx -y install-mcp @introfini/mcp-server-zotero-dev --client claude-code
Cursor
npx -y install-mcp @introfini/mcp-server-zotero-dev --client cursor
VS Code / Copilot
npx -y install-mcp @introfini/mcp-server-zotero-dev --client vscode
Windsurf
npx -y install-mcp @introfini/mcp-server-zotero-dev --client windsurf
Configuración manual

Agrega esto a la configuración de tu cliente MCP:

{
  "mcpServers": {
    "zotero-dev": {
      "command": "npx",
      "args": ["-y", "@introfini/mcp-server-zotero-dev@1.1.1"],
      "env": {
        "ZOTERO_RDP_PORT": "6100"
      }
    }
  }
}

Versión y actualizaciones: fija una versión exacta como se muestra arriba. Un npx <pkg> sin versión (sin número de versión) seguirá ejecutando lo que npx haya almacenado en caché y no recogerá nuevas versiones, así que incluye siempre una versión y -y (sin -y, npx se queda esperando un aviso de instalación). Aumenta la versión fijada para actualizar, o usa @latest para obtener siempre la más reciente al iniciar (actualizaciones automáticas, pero una versión defectuosa se ejecutaría automáticamente y añade una comprobación del registro en cada inicio). Ten en cuenta que install-mcp puede escribir una configuración sin -y o sin versión, por lo que la configuración manual anterior es la ruta más robusta.

Reinicia tu asistente de IA después de agregar la configuración.

2. Instalar el plugin MCP Bridge en Zotero

Descarga zotero-mcp-bridge.xpi e instálalo:

  1. En Zotero: Herramientas → Plugins
  2. Haz clic en ⚙️ → Instalar plugin desde archivo
  3. Selecciona el archivo .xpi descargado
  4. Reinicia Zotero

Este plugin ligero habilita el Protocolo de Depuración Remota cuando Zotero se inicia. Solo necesita instalarse una vez y funciona en todas las versiones de Zotero 7+ (release, beta y dev).

3. ¡Empieza a desarrollar!

Simplemente abre Zotero normalmente y pídele a tu asistente de IA:

"Toma una captura de pantalla de Zotero y lista los plugins instalados"

¡Eso es todo! Sin indicadores de inicio especiales, sin configuración. 🎉


🧰 Herramientas disponibles (28 en total)

Inspección de interfaz — Capturas de pantalla, DOM, estilos
HerramientaDescripción
zotero_screenshotCapturar capturas de pantalla de ventanas, elementos o regiones
zotero_inspect_elementBuscar elementos por selector CSS
zotero_get_dom_treeObtener la estructura DOM de una ventana/panel
zotero_get_stylesObtener estilos CSS calculados para un elemento
zotero_list_windowsListar todas las ventanas abiertas de Zotero

Objetivos de captura: ventana principal, preferencias, lector de PDF, diálogos o cualquier elemento mediante selector. Usa highlightSelector para agregar un borde rojo antes de la captura.

Interacción con la interfaz — Hacer clic y escribir en la interfaz de Zotero
HerramientaDescripción
zotero_click_elementHacer clic en un elemento mediante selector CSS (botón de barra de herramientas/menú, control de preferencias, fila de lista). Atraviesa el shadow DOM; index elige entre múltiples coincidencias; mouseEvents sintetiza una secuencia completa de ratón.
zotero_send_keysEscribir texto en un campo de entrada/área de texto/contenido editable (lo enfoca primero, dispara eventos de entrada/cambio). clear y pressEnter opcionales.

La resolución intenta primero con el DOM claro y luego atraviesa las raíces shadow abiertas (los elementos personalizados XUL de Zotero mantienen los internos en el shadow DOM). Limitación: no puede cerrar un diálogo modal nativo bloqueante (Services.prompt.confirmEx) — su bucle modal anidado bloquea el hilo de evaluación en el que se ejecutan estas herramientas.

Ejecución de JavaScript — Ejecutar código en el contexto de Zotero
HerramientaDescripción
zotero_execute_jsEjecutar JavaScript en el contexto privilegiado de Zotero. Envuelve automáticamente el código con declaraciones return de nivel superior en una IIFE.
zotero_inspect_objectExplorar APIs de Zotero: lista métodos y propiedades de cualquier objeto (por ejemplo, Zotero.Items)
zotero_open_preferencesAbrir la ventana de configuración de Zotero, opcionalmente en un panel específico (integrado o de plugin)
zotero_search_prefsBuscar/descubrir preferencias por patrón (por ejemplo, encontrar todas las preferencias que contengan "debug")
zotero_get_prefObtener el valor de una preferencia
zotero_set_prefEstablecer el valor de una preferencia

Ejemplos: Zotero.Items.getAll(1), Zotero.Prefs.get('export.quickCopy.setting'), ZoteroPane.getSelectedItems()

Consejo: usa zotero_inspect_object para explorar APIs antes de escribir código. Usa zotero_search_prefs para descubrir claves de preferencias.

Compilación y andamiaje — Integración con zotero-plugin-scaffold
HerramientaDescripción
zotero_scaffold_buildCompilar plugin (modo desarrollo o producción)
zotero_scaffold_serveIniciar servidor de desarrollo con recarga en caliente
zotero_scaffold_lintEjecutar ESLint en el código fuente del plugin
zotero_scaffold_typecheckEjecutar verificación de tipos de TypeScript
Registros y depuración — Consola de errores y salida de depuración
HerramientaDescripción
zotero_read_logsLeer salida de depuración (Zotero.debug)
zotero_read_errorsLeer entradas de la consola de errores
zotero_watch_logsTransmitir registros en tiempo real
zotero_clear_logsLimpiar el búfer de registros
Gestión de plugins — Instalar, recargar, inspeccionar
HerramientaDescripción
zotero_plugin_reloadRecargar en caliente tu plugin de desarrollo
zotero_plugin_installInstalar plugin desde ruta XPI
zotero_plugin_listListar plugins instalados con versión/estado
Acceso a base de datos — Acceso SQLite de solo lectura
HerramientaDescripción
zotero_db_queryEjecutar consulta SELECT en zotero.sqlite
zotero_db_schemaObtener información del esquema de tablas
zotero_db_statsObtener estadísticas de la base de datos (elementos, archivos adjuntos, colecciones, tamaño)

Nota: el acceso a la base de datos es de solo lectura y requiere que Zotero esté cerrado, o utiliza una copia de la base de datos.


🏗️ Arquitectura

┌─────────────────────────────────────────────────────────────────┐
│                        AI Assistant                             │
│                  (Claude, Cursor, Windsurf)                     │
└─────────────────────────┬───────────────────────────────────────┘
                          │ MCP Protocol (stdio)
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                  MCP Server (Node.js/TypeScript)                │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐   │
│  │   Scaffold   │  │     RDP      │  │      Database        │   │
│  │  Integration │  │    Client    │  │      Reader          │   │
│  └──────────────┘  └──────┬───────┘  └──────────────────────┘   │
└─────────────────────────────┼───────────────────────────────────┘
                              │ Firefox RDP (port 6100)
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                      Zotero Application                         │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │            MCP Bridge for Zotero                         │   │
│  │         Starts DevToolsServer on launch                  │   │
│  └──────────────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │              Firefox DevTools Server (built-in)          │   │
│  │           JS Execution • DOM • Console • Screenshots     │   │
│  └──────────────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │                   Your Plugin (dev)                      │   │
│  └──────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

¿Por qué este enfoque?

  • Plugin ligero — Solo habilita RDP, Firefox DevTools hace el resto
  • Cero configuración después de la instalación — Solo abre Zotero normalmente, sin indicadores especiales
  • Contexto rico para la IA — Las capturas de pantalla, el DOM y los registros ayudan a la IA a comprender el estado de tu plugin
  • Recarga en caliente — Se integra con zotero-plugin-scaffold para retroalimentación instantánea
  • Acceso completo a Zotero — Ejecuta cualquier API de Zotero en el contexto privilegiado
  • Multiplataforma — Funciona en Linux, Windows y macOS

🔧 Variables de entorno

VariableDescripciónPredeterminado
ZOTERO_RDP_PORTPuerto de depuración remota6100
ZOTERO_RDP_HOSTHost de depuración127.0.0.1
ZOTERO_DATA_DIRRuta al directorio de datos de ZoteroDetección automática
ZOTERO_PROFILE_PATHRuta al perfil de ZoteroDetección automática

🔌 Cambiar el puerto RDP

El puente escucha en el puerto 6100 de forma predeterminada. Solo necesitas cambiarlo si ejecutas dos instancias de Zotero al mismo tiempo (un perfil normal y uno de desarrollo, por ejemplo), o si otro proceso ya ocupa el 6100.

El puerto vive en ambos lados del puente, y ambos deben coincidir.

1. Lado de Zotero — establece la preferencia del plugin:

  1. Configuración → Avanzado → Editor de configuración y acepta la advertencia
  2. Busca extensions.mcp-rdp.port
  3. Si no existe, créala: selecciona Número, nómbrala extensions.mcp-rdp.port e ingresa tu puerto
  4. Reinicia Zotero — el listener solo se abre al inicio

Cuidado con el tipo. El Editor de configuración preselecciona Booleano. Crear la preferencia sin cambiar a Número almacena true en lugar de un puerto, y Zotero entonces abre el puente en una tubería local en lugar de un puerto TCP — el registro de depuración informa éxito mientras ningún cliente MCP puede conectarse.

2. Lado del cliente — establece ZOTERO_RDP_PORT al mismo valor en la configuración de tu cliente MCP:

{
  "mcpServers": {
    "zotero-dev": {
      "command": "npx",
      "args": ["-y", "@introfini/mcp-server-zotero-dev@1.1.2"],
      "env": {
        "ZOTERO_RDP_PORT": "6101"
      }
    }
  }
}

Cambia ambos o ninguno. Mover solo un lado desconecta el puente: Zotero escucha en un puerto mientras el cliente sigue marcando el otro.

Ejecutar dos instancias realmente

Iniciar Zotero por segunda vez te entrega la ventana que ya tienes — como Firefox, reenvía a la instancia en ejecución en lugar de iniciar otra. Una segunda instancia necesita su propio perfil y -no-remote:

# macOS; adjust the binary path on Windows/Linux
MOZ_NO_REMOTE=1 "/Applications/Zotero.app/Contents/MacOS/zotero" -P <profile-name> -no-remote

Dale a ese perfil su propio extensions.mcp-rdp.port y los dos puentes no interferirán entre sí. Verificado con 9.0.6 en el 6100 y 10.0-beta.22 en el 6101 al mismo tiempo.

Requiere el plugin MCP Bridge 1.0.5 o posterior. En 1.0.4 y anteriores, extensions.mcp-rdp.port se leía bajo la rama de preferencias incorrecta y se ignoraba silenciosamente, por lo que el puente permanecía en el 6100 sin importar lo que configuraras. Si configuraste un puerto personalizado contra una versión anterior, se almacena como extensions.zotero.extensions.mcp-rdp.port — ese nombre sigue funcionando, pero prefiere el anterior.

Deshabilitar el puente

Establece extensions.mcp-rdp.enabled en false (Booleano) en el Editor de configuración y reinicia Zotero. El plugin permanece instalado pero no abre ningún listener, y ningún cliente MCP puede alcanzar Zotero hasta que lo vuelvas a establecer en true.


📸 Ejemplos de capturas de pantalla

// Capture main Zotero window
await zotero_screenshot({ target: 'main-window' });

// Capture your plugin's panel with highlight
await zotero_screenshot({
  target: 'element',
  selector: '#my-plugin-panel',
  highlightSelector: '#my-plugin-button'
});

// Capture a specific window by ID (use zotero_list_windows to find IDs)
await zotero_screenshot({
  target: 'window',
  windowId: 12345
});

// Capture element after triggering UI action
await zotero_execute_js({ code: 'document.querySelector("#menu").click()' });
await zotero_screenshot({ target: 'element', selector: 'menupopup[state="open"]' });

🧑‍💻 Desarrollo

# Clone and install
git clone https://github.com/introfini/mcp-server-zotero-dev.git
cd mcp-server-zotero-dev
npm install

# Build everything
npm run build

# Build individual packages
npm run build:server
npm run build:plugin

# Run tests
npm test

# Development mode (watch)
npm run dev
Estructura del proyecto
mcp-server-zotero-dev/
├── packages/
│   ├── mcp-server/               # MCP server (npm package)
│   │   ├── src/
│   │   │   ├── index.ts          # MCP server entry
│   │   │   ├── rdp/              # RDP client
│   │   │   ├── tools/            # Tool implementations
│   │   │   └── prompts/          # Slash commands
│   │   └── package.json
│   │
│   └── zotero-plugin-mcp-rdp/    # Tiny Zotero plugin (.xpi)
│       ├── src/
│       │   └── bootstrap.js      # Starts RDP server (shipped verbatim)
│       ├── addon/
│       │   └── manifest.json
│       └── package.json
│
├── docs/                         # Documentation
└── package.json                  # Monorepo root

📚 Recursos


🤝 Contribuciones

¡Las contribuciones son bienvenidas! Por favor:

  1. Sigue los patrones de código existentes
  2. Añade pruebas para nuevas funcionalidades
  3. Actualiza la documentación
  4. Asegúrate de que npm test y npm run lint pasen

📄 Licencia

MIT © introfini


Agradecimientos