Skip to main content
Glama
introfini

MCP Server Zotero Dev

by introfini

MCP Server Zotero Dev

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

License: MIT Zotero 7+

Arquitectura · Primeros pasos · Herramientas disponibles


Un servidor Model Context Protocol (MCP) que permite a asistentes de IA como Claude, Cursor y Windsurf crear, probar y depurar plugins de Zotero 7, 8, 9 y 10. Las capturas de pantalla, el estado del DOM, los registros de depuración y la ejecución de JavaScript dan a la IA un contexto rico para entender lo que está sucediendo, y herramientas para ayudarte a solucionarlo.

✨ Características

Categoría

Capacidades

🎯 Inspección de UI

Capturas de pantalla, árbol DOM, búsqueda de elementos, estilos calculados

🖱️ Interacción con la UI

Haz clic en elementos y escribe texto (compatible con shadow-DOM)

💻 Ejecución de JS

Ejecuta código en el contexto de Zotero, inspecciona APIs, prueba fragmentos

🔧 Herramientas de compilación

Integración de scaffold para build, serve, recarga en caliente

📋 Registros y errores

Transmite salida de depuración, consola de errores, vigila problemas

🗃️ Base de datos

Acceso de solo lectura a zotero.sqlite para depuración

🔌 Gestión de plugins

Instala, recarga, lista plugins


Related MCP server: Kaboom Browser AI Devtools MCP

🚀 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. Instala el servidor MCP

Usa install-mcp para añadir 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

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

Añade 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 seguirá ejecutando lo que npx haya cacheado y no recogerá las nuevas versiones, así que incluye siempre una versión y -y (sin -y, npx se queda esperando un aviso de instalación). Sube la versión fijada para actualizar, o usa @latest para obtener siempre la más reciente al inicio (se actualiza automáticamente, pero una versión mala se ejecutaría automáticamente y añade una comprobación de registro en cada inicio). Ten en cuenta que install-mcp puede escribir una configuración sin -y o sin versión, así que la configuración manual de arriba es la vía más robusta.

Reinicia tu asistente de IA después de añadir la configuración.

2. Instala 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 pide a tu asistente de IA:

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

¡Eso es todo! Sin banderas de lanzamiento especiales, sin configuración. 🎉


🧰 Herramientas disponibles (28 en total)

Herramienta

Descripción

zotero_screenshot

Captura capturas de pantalla de ventana, elemento o región

zotero_inspect_element

Encuentra elementos por selector CSS

zotero_get_dom_tree

Obtén la estructura DOM de una ventana/panel

zotero_get_styles

Obtén los estilos CSS calculados para un elemento

zotero_list_windows

Lista todas las ventanas abiertas de Zotero

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

Herramienta

Descripción

zotero_click_element

Haz clic en un elemento por selector CSS (botón de barra de herramientas/menú, control de preferencias, fila de lista). Atraviesa el shadow DOM; index elige entre varias coincidencias; mouseEvents sintetiza una secuencia completa de ratón.

zotero_send_keys

Escribe texto en un input/textarea/contenteditable (lo enfoca primero, dispara input/change). clear y pressEnter opcionales.

La resolución intenta primero el DOM ligero, luego atraviesa las shadow roots abiertas (los elementos personalizados XUL de Zotero mantienen los internos en el shadow DOM). Limitación: no puede descartar 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.

Herramienta

Descripción

zotero_execute_js

Ejecuta JavaScript en el contexto privilegiado de Zotero. Envuelve automáticamente el código con sentencias return de nivel superior en IIFE.

zotero_inspect_object

Explora las APIs de Zotero: lista métodos y propiedades de cualquier objeto (p. ej., Zotero.Items)

zotero_open_preferences

Abre la ventana de configuración de Zotero, opcionalmente a un panel específico (integrado o plugin)

zotero_search_prefs

Busca/descubre preferencias por patrón (p. ej., encuentra todas las preferencias que contengan "debug")

zotero_get_pref

Obtén el valor de una preferencia

zotero_set_pref

Establece 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 las APIs antes de escribir código. Usa zotero_search_prefs para descubrir claves de preferencias.

Herramienta

Descripción

zotero_scaffold_build

Compila el plugin (modo dev o producción)

zotero_scaffold_serve

Inicia el servidor de desarrollo con recarga en caliente

zotero_scaffold_lint

Ejecuta ESLint en el código fuente del plugin

zotero_scaffold_typecheck

Ejecuta la comprobación de tipos de TypeScript

Herramienta

Descripción

zotero_read_logs

Lee la salida de depuración (Zotero.debug)

zotero_read_errors

Lee las entradas de la consola de errores

zotero_watch_logs

Transmite registros en tiempo real

zotero_clear_logs

Limpia el búfer de registros

Herramienta

Descripción

zotero_plugin_reload

Recarga en caliente tu plugin de desarrollo

zotero_plugin_install

Instala el plugin desde la ruta XPI

zotero_plugin_list

Lista los plugins instalados con versión/estado

Herramienta

Descripción

zotero_db_query

Ejecuta consultas SELECT en zotero.sqlite

zotero_db_schema

Obtén información del esquema de tablas

zotero_db_stats

Obtén estadísticas de la base de datos (elementos, adjuntos, colecciones, tamaño)

Nota: el acceso a la base de datos es de solo lectura y requiere que Zotero esté cerrado, o usa 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 tras la instalación — Solo abre Zotero normalmente, sin banderas especiales

  • Contexto rico para la IA — Las capturas de pantalla, el DOM y los registros ayudan a la IA a entender 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, macOS


🔧 Variables de entorno

Variable

Descripción

Valor por defecto

ZOTERO_RDP_PORT

Puerto de depuración remota

6100

ZOTERO_RDP_HOST

Host de depuración

127.0.0.1

ZOTERO_DATA_DIR

Ruta al directorio de datos de Zotero

Detección automática

ZOTERO_PROFILE_PATH

Ruta al perfil de Zotero

Detección automática


🔌 Cambiar el puerto RDP

El puente escucha en el puerto 6100 por defecto. 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 tienen que estar de acuerdo.

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 introduce 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 un pipe local en lugar de un puerto TCP — el registro de depuración informa de é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. Si solo cambias un lado, el puente se desconecta: Zotero escucha en un puerto mientras el cliente sigue marcando el otro.

Ejecutar realmente dos instancias

Al iniciar Zotero por segunda vez, obtienes 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 se estorbarán. Verificado con 9.0.6 en 6100 y 10.0-beta.22 en 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 en la rama de preferencias incorrecta y se ignoraba silenciosamente, por lo que el puente permanecía en 6100 sin importar lo que configuraras. Si configuraste un puerto personalizado con 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 acceder a Zotero hasta que lo vuelvas a poner 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
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. Consulta CONTRIBUTING.md para la configuración, las convenciones de prueba y las reglas específicas del código que vale la pena conocer antes de empezar.

La versión corta:

  1. Sigue los patrones de código existentes

  2. Añade pruebas para nuevas funciones, y omite en lugar de fallar cuando Zotero no está en ejecución

  3. Actualiza la documentación

  4. No hay CI, así que ejecuta npm run build, npm run typecheck, npm run lint y npm test tú mismo, y menciona en el PR contra qué versión de Zotero lo verificaste


📄 Licencia

MIT © introfini


Agradecimientos

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
4hResponse time
5wRelease cycle
6Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Live browser debugging for AI assistants — DOM, console, network via MCP.

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

  • MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/introfini/mcp-server-zotero-dev'

If you have feedback or need assistance with the MCP directory API, please join our Discord server