io.github.introfini/mcp-server-zotero-dev
平台与服务by introfini
MCP server enabling AI assistants to build, test, and debug Zotero plugins
什么是 io.github.introfini/mcp-server-zotero-dev?
MCP server enabling AI assistants to build, test, and debug Zotero plugins
README
MCP Server Zotero Dev
Give your AI assistant superpowers for Zotero plugin development
Architecture · Getting Started · Available Tools
<img src="docs/images/demo.png" alt="MCP Server Zotero Dev in action" width="800"> </div>A Model Context Protocol (MCP) server that enables AI assistants like Claude, Cursor, and Windsurf to build, test, and debug Zotero 7, 8, 9, and 10 plugins. Screenshots, DOM state, debug logs, and JavaScript execution give the AI rich context to understand what's happening—and tools to help you fix it.
✨ Features
| Category | Capabilities |
|---|---|
| 🎯 UI Inspection | Screenshots, DOM tree, element finding, computed styles |
| 🖱️ UI Interaction | Click elements and type text (shadow-DOM aware) |
| 💻 JS Execution | Run code in Zotero context, inspect APIs, test snippets |
| 🔧 Build Tools | Scaffold integration for build, serve, hot reload |
| 📋 Logs & Errors | Stream debug output, error console, watch for issues |
| 🗃️ Database | Read-only access to zotero.sqlite for debugging |
| 🔌 Plugin Management | Install, reload, list plugins |
🚀 Quick Start
Prerequisites
- Node.js 20+ and npm
- Zotero 7+ — Works on all Zotero 7, 8, 9, and 10 builds (release, beta, dev)
- For plugin development: zotero-plugin-scaffold
1. Install MCP Server
Use install-mcp to add the server to your AI assistant:
npx -y install-mcp @introfini/mcp-server-zotero-dev --client claude-code
Supported clients: 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
Add to your MCP client config:
{
"mcpServers": {
"zotero-dev": {
"command": "npx",
"args": ["-y", "@introfini/mcp-server-zotero-dev@1.1.1"],
"env": {
"ZOTERO_RDP_PORT": "6100"
}
}
}
}
Version & updates: pin an exact version as shown above. A bare
npx <pkg>(no version) keeps running whatevernpxcached and won't pick up new releases, so always include a version and-y(without-y,npxhangs waiting for an install prompt). Bump the pinned version to upgrade, or use@latestto always fetch the newest at launch (auto-updates, but a bad release would run automatically and it adds a registry check on every start). Note thatinstall-mcpmay write a config without-yor a version, so the manual configuration above is the most robust path.
Restart your AI assistant after adding the configuration.
2. Install MCP Bridge Plugin in Zotero
Download zotero-mcp-bridge.xpi and install:
- In Zotero: Tools → Plugins
- Click ⚙️ → Install Plugin From File
- Select the downloaded
.xpifile - Restart Zotero
This lightweight plugin enables the Remote Debugging Protocol when Zotero starts. It only needs to be installed once and works on all Zotero 7+ builds (release, beta, and dev).
3. Start Developing!
Just open Zotero normally and ask your AI assistant:
"Take a screenshot of Zotero and list installed plugins"
That's it! No special launch flags, no configuration. 🎉
🧰 Available Tools (28 total)
<details> <summary><strong>UI Inspection</strong> — Screenshots, DOM, styles</summary>| Tool | Description |
|---|---|
zotero_screenshot | Capture window, element, or region screenshots |
zotero_inspect_element | Find elements by CSS selector |
zotero_get_dom_tree | Get DOM structure of a window/panel |
zotero_get_styles | Get computed CSS styles for element |
zotero_list_windows | List all open Zotero windows |
</details> <details> <summary><strong>UI Interaction</strong> — Click and type in the Zotero UI</summary>Screenshot Targets: Main window, preferences, PDF reader, dialogs, or any element by selector. Use
highlightSelectorto add a red border before capture.
| Tool | Description |
|---|---|
zotero_click_element | Click an element by CSS selector (toolbar/menu button, preference control, list row). Pierces shadow DOM; index picks among multiple matches; mouseEvents synthesizes a full mouse sequence. |
zotero_send_keys | Type text into an input/textarea/contenteditable (focuses it first, fires input/change). Optional clear and pressEnter. |
</details> <details> <summary><strong>JavaScript Execution</strong> — Run code in Zotero context</summary>Resolution tries light DOM first, then pierces open shadow roots (Zotero's XUL custom elements keep internals in shadow DOM). Limitation: cannot dismiss a blocking native modal dialog (
Services.prompt.confirmEx) — its nested modal loop blocks the eval thread these tools run on.
| Tool | Description |
|---|---|
zotero_execute_js | Execute JavaScript in Zotero's privileged context. Auto-wraps code with top-level return statements in IIFE. |
zotero_inspect_object | Explore Zotero APIs - list methods and properties of any object (e.g., Zotero.Items) |
zotero_open_preferences | Open Zotero's settings window, optionally to a specific pane (built-in or plugin) |
zotero_search_prefs | Search/discover preferences by pattern (e.g., find all prefs containing "debug") |
zotero_get_pref | Get a preference value |
zotero_set_pref | Set a preference value |
</details> <details> <summary><strong>Build & Scaffold</strong> — Integration with zotero-plugin-scaffold</summary>Examples:
Zotero.Items.getAll(1),Zotero.Prefs.get('export.quickCopy.setting'),ZoteroPane.getSelectedItems()Tip: Use
zotero_inspect_objectto explore APIs before writing code. Usezotero_search_prefsto discover preference keys.
| Tool | Description |
|---|---|
zotero_scaffold_build | Build plugin (dev or production mode) |
zotero_scaffold_serve | Start dev server with hot reload |
zotero_scaffold_lint | Run ESLint on plugin source |
zotero_scaffold_typecheck | Run TypeScript type checking |
| Tool | Description |
|---|---|
zotero_read_logs | Read debug output (Zotero.debug) |
zotero_read_errors | Read error console entries |
zotero_watch_logs | Stream logs in real-time |
zotero_clear_logs | Clear log buffer |
| Tool | Description |
|---|---|
zotero_plugin_reload | Hot reload your dev plugin |
zotero_plugin_install | Install plugin from XPI path |
zotero_plugin_list | List installed plugins with version/status |
| Tool | Description |
|---|---|
zotero_db_query | Execute SELECT query on zotero.sqlite |
zotero_db_schema | Get table schema information |
zotero_db_stats | Get database statistics (items, attachments, collections, size) |
</details>Note: Database access is read-only and requires Zotero to be closed, or uses a copy of the database.
🏗️ Architecture
┌─────────────────────────────────────────────────────────────────┐
│ 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) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Why this approach?
- ✅ Lightweight plugin — Just enables RDP, Firefox DevTools does the rest
- ✅ Zero-config after install — Just open Zotero normally, no special flags
- ✅ Rich AI context — Screenshots, DOM, and logs help the AI understand your plugin's state
- ✅ Hot reload — Integrates with zotero-plugin-scaffold for instant feedback
- ✅ Full Zotero access — Execute any Zotero API in the privileged context
- ✅ Cross-platform — Works on Linux, Windows, macOS
🔧 Environment Variables
| Variable | Description | Default |
|---|---|---|
ZOTERO_RDP_PORT | Remote debugging port | 6100 |
ZOTERO_RDP_HOST | Debugging host | 127.0.0.1 |
ZOTERO_DATA_DIR | Path to Zotero data directory | Auto-detect |
ZOTERO_PROFILE_PATH | Path to Zotero profile | Auto-detect |
🔌 Changing the RDP Port
The bridge listens on port 6100 by default. You only need to change it if you run two Zotero instances at the same time (a normal profile and a development one, say), or if another process already holds 6100.
The port lives on both sides of the bridge, and both have to agree on it.
1. Zotero side — set the plugin preference:
- Settings → Advanced → Config Editor, and accept the warning
- Search for
extensions.mcp-rdp.port - If it doesn't exist, create it: select Number, name it
extensions.mcp-rdp.port, and enter your port - Restart Zotero — the listener only opens at startup
Watch the type. The Config Editor pre-selects Boolean. Creating the preference without switching to Number stores
trueinstead of a port, and Zotero then opens the bridge on a local pipe rather than a TCP port — the debug log reports success while no MCP client can connect.
2. Client side — set ZOTERO_RDP_PORT to the same value in your MCP client config:
{
"mcpServers": {
"zotero-dev": {
"command": "npx",
"args": ["-y", "@introfini/mcp-server-zotero-dev@1.1.2"],
"env": {
"ZOTERO_RDP_PORT": "6101"
}
}
}
}
Change both or neither. Moving only one side disconnects the bridge: Zotero listens on one port while the client keeps dialing the other.
Actually running two instances
Launching Zotero a second time hands you the window you already have — like Firefox, it forwards to the running instance instead of starting another. A second instance needs its own profile and -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
Give that profile its own extensions.mcp-rdp.port and the two bridges stay out of each other's way. Verified with 9.0.6 on 6100 and 10.0-beta.22 on 6101 at the same time.
Requires MCP Bridge plugin 1.0.5 or later. In 1.0.4 and earlier,
extensions.mcp-rdp.portwas read under the wrong preference branch and silently ignored, so the bridge stayed on 6100 no matter what you set. If you configured a custom port against an older build, it is stored asextensions.zotero.extensions.mcp-rdp.port— that name still works, but prefer the one above.
Disabling the bridge
Set extensions.mcp-rdp.enabled to false (Boolean) in the Config Editor and restart Zotero. The plugin stays installed but opens no listener, and no MCP client can reach Zotero until you set it back to true.
📸 Screenshot Examples
// 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"]' });
🧑💻 Development
# 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
📚 Resources
- Architecture & Technical Learnings — Deep dive into RDP protocol, actor hierarchy, and common pitfalls
- Zotero Plugin Development — Official docs
- Zotero 10 for Developers — Migration guide for the latest major
- Zotero 7 for Developers — Migration guide
- zotero-plugin-scaffold — Build tooling
- zotero-plugin-template — Starter template
- zotero-plugin-toolkit — API helpers
- Firefox RDP Protocol — Protocol docs
🤝 Contributing
Contributions are welcome. See CONTRIBUTING.md for setup, test conventions and the codebase-specific rules worth knowing before you start.
The short version:
- Follow existing code patterns
- Add tests for new features, and skip rather than fail when Zotero is not running
- Update documentation
- There is no CI, so run
npm run build,npm run typecheck,npm run lintandnpm testyourself, and say in the PR which Zotero version you verified against
📄 License
MIT © introfini
Acknowledgments
- Built for the Zotero plugin developer community
- Integrates with zotero-plugin-scaffold by @windingwind
- Leverages Firefox DevTools RDP for reliable communication
常见问题
io.github.introfini/mcp-server-zotero-dev 是什么?
MCP server enabling AI assistants to build, test, and debug Zotero plugins
相关 Skills
MCP构建
by anthropics
聚焦高质量 MCP Server 开发,覆盖协议研究、工具设计、错误处理与传输选型,适合用 FastMCP 或 MCP SDK 对接外部 API、封装服务能力。
✎ 想让 LLM 稳定调用外部 API,就用 MCP构建:从 Python 到 Node 都有成熟指引,帮你更快做出高质量 MCP 服务器。
Slack动图
by anthropics
面向Slack的动图制作Skill,内置emoji/消息GIF的尺寸、帧率和色彩约束、校验与优化流程,适合把创意或上传图片快速做成可直接发送的Slack动画。
✎ 帮你快速做出适配 Slack 的动图,内置约束规则和校验工具,少踩上传与播放坑,做表情包和演示都更省心。
接口测试套件
by alirezarezvani
扫描 Next.js、Express、FastAPI、Django REST 的 API 路由,自动生成覆盖鉴权、参数校验、错误码、分页、上传与限流场景的 Vitest 或 Pytest 测试套件。
✎ 帮你把API与集成测试自动化跑顺,减少回归漏测;能力全面,尤其适合复杂接口场景的QA团队。
相关 MCP Server
Slack 消息
编辑精选by Anthropic
Slack 是让 AI 助手直接读写你的 Slack 频道和消息的 MCP 服务器。
✎ 这个服务器解决了团队协作中需要 AI 实时获取 Slack 信息的痛点,特别适合开发团队让 Claude 帮忙汇总频道讨论或发送通知。不过,它目前只是参考实现,文档有限,不建议在生产环境直接使用——更适合开发者学习 MCP 如何集成第三方服务。
by netdata
io.github.netdata/mcp-server 是让 AI 助手实时监控服务器指标和日志的 MCP 服务器。
✎ 这个工具解决了运维人员需要手动检查系统状态的痛点,最适合 DevOps 团队让 Claude 自动分析性能数据。不过,它依赖 NetData 的现有部署,如果你没用过这个监控平台,得先花时间配置。
by d4vinci
Scrapling MCP Server 是专为现代网页设计的智能爬虫工具,支持绕过 Cloudflare 等反爬机制。
✎ 这个工具解决了爬取动态网页和反爬网站时的头疼问题,特别适合需要批量采集电商价格或新闻数据的开发者。不过,它依赖外部浏览器引擎,资源消耗较大,不适合轻量级任务。