Skip to main content
Glama

zotero-grounded-mcp

An MCP (Model Context Protocol) server that gives any MCP-compatible assistant access to your Zotero reference library. It can search your real references, generate accurate citations, build bibliographies, read your notes, and turn .docx citation stubs into live Zotero field codes.

The design goal is conservative: use Zotero as the ground truth for references, rather than giving an agent room to invent sources silently and slip them into your work.

What is an MCP server?

MCP (Model Context Protocol) is a standard that lets AI assistants call external tools in a consistent way. This project is an MCP server: a small program that runs on your machine, connects to your Zotero library, and exposes tools that any MCP-ready client can call.

You usually do not interact with this server directly. Instead, you configure an MCP client to start it automatically. When your assistant needs to look up a reference, validate a citation, or process a .docx, it calls the tools this server provides.

Related MCP server: zotero-mcp

Read-only by design

This server treats Zotero as a source of truth, not as something the assistant should rewrite. The Zotero-facing operations are read-only:

  • search items

  • fetch item metadata

  • list collections

  • read notes and attachments

  • format citations and bibliographies from existing Zotero items

The server does not create, edit, move, or delete Zotero library items. The only write operation in the overall workflow is on your local .docx output when zotero_process_docx converts validated stubs into Zotero field codes.

This is intentional. Many Zotero-related assistant integrations optimize for broad library automation. This project prioritizes verification instead: the assistant should have to cite what is actually in Zotero, so your bibliography is anchored to records you already control.

Works with any MCP-ready client

This server is not specific to Claude Cowork. It works with any MCP-ready system that can launch a stdio MCP server, including:

  • Claude Code

  • Claude Desktop / Cowork

  • custom MCP clients

  • editor integrations or agent frameworks that support MCP

The only requirement is that the client can start:

node /full/path/to/zotero-grounded-mcp/dist/index.js

with the appropriate environment variables.

Tools provided

Tool

What it does

zotero_search

Search your library by query, tag, or collection

zotero_get_item

Get full metadata + formatted citation for an item

zotero_collections

List all your Zotero collections

zotero_cite

Generate inline + full citations for given item keys

zotero_bibliography

Build a sorted Works Cited from item keys

zotero_get_notes

Get notes and PDF annotations attached to an item

zotero_get_attachments

Get PDF and file attachments for an item

zotero_cite_stub

Generate validated citation stubs for .docx documents

zotero_process_docx

Convert stubs in a .docx into live Zotero field codes

Citation formatting uses citeproc-js with the Chicago Author-Date style (18th ed.) by default. The zotero_cite and zotero_bibliography tools accept an optional style parameter.

Prerequisites

  • Node.js 18+ and npm -- check with node -v and npm -v

  • Zotero desktop app (for local mode) -- download from zotero.org

  • An MCP-compatible client -- Claude Code, Claude Desktop / Cowork, or any other MCP-ready system

Installation (step by step)

1. Clone the project

git clone https://github.com/msantelli/zotero-grounded-mcp.git
cd zotero-grounded-mcp

Or if you already have the folder:

cd zotero-grounded-mcp

2. Install dependencies

npm install

3. Build the project

npm run build

This compiles TypeScript to dist/. The server runs from dist/index.js.

4. Register the MCP server with your MCP client

This is the key step. You need to tell your MCP client where to find this server. In generic terms, the client should launch:

{
  "mcpServers": {
    "zotero": {
      "command": "node",
      "args": ["/full/path/to/zotero-grounded-mcp/dist/index.js"],
      "env": {
        "ZOTERO_MODE": "local"
      }
    }
  }
}

Replace the path with the real absolute path to dist/index.js.

4A. Claude Code example

Open a terminal and run:

claude mcp add zotero node /full/path/to/zotero-grounded-mcp/dist/index.js -e ZOTERO_MODE=local

Replace /full/path/to/zotero-grounded-mcp with the actual absolute path to this project. You can find it by running pwd inside the project folder.

This registers the server globally so Claude Code can use it in any conversation.

4B. Claude Code settings.json example

Open (or create) the file ~/.claude/settings.json and add:

{
  "mcpServers": {
    "zotero": {
      "command": "node",
      "args": ["/full/path/to/zotero-grounded-mcp/dist/index.js"],
      "env": {
        "ZOTERO_MODE": "local"
      }
    }
  }
}

Again, replace the path with the real absolute path.

4C. Claude Code project-level configuration

If you only want this server available when working inside a specific project, create .claude/settings.json in that project's root:

{
  "mcpServers": {
    "zotero": {
      "command": "node",
      "args": ["/full/path/to/zotero-grounded-mcp/dist/index.js"],
      "env": {
        "ZOTERO_MODE": "local"
      }
    }
  }
}

5. Make sure Zotero is running

Open the Zotero desktop app. It exposes a local API on port 23119 automatically -- you don't need to configure anything in Zotero.

6. Verify it works

Start your MCP client and issue a simple Zotero lookup, for example:

"Search my Zotero library for articles about pragmatism"

If everything is set up correctly, the client will call zotero_search and return results from your actual library. You should see a tool call indicator or MCP tool trace in the client output.

If you see an error like "Could not connect to Zotero", make sure the Zotero desktop app is open.

Using the web API (no desktop app needed)

If you want to access your library without Zotero running locally (e.g., on a server), use web mode instead:

1. Get your API credentials

  1. Go to zotero.org/settings/keys

  2. Click "Create new private key"

  3. Check "Allow library access" (read-only is fine)

  4. Save the key

  5. Note your numeric user ID shown at the top of the page

2. Register with web mode

claude mcp add zotero node /full/path/to/zotero-grounded-mcp/dist/index.js \
  -e ZOTERO_MODE=web \
  -e ZOTERO_USER_ID=your_numeric_id \
  -e ZOTERO_API_KEY=your_api_key

Or in settings.json:

{
  "mcpServers": {
    "zotero": {
      "command": "node",
      "args": ["/full/path/to/zotero-grounded-mcp/dist/index.js"],
      "env": {
        "ZOTERO_MODE": "web",
        "ZOTERO_USER_ID": "your_numeric_id",
        "ZOTERO_API_KEY": "your_api_key"
      }
    }
  }
}

Using a group library

To access a Zotero group library instead of your personal library, add the group config:

claude mcp add zotero node /full/path/to/zotero-grounded-mcp/dist/index.js \
  -e ZOTERO_MODE=local \
  -e ZOTERO_LIBRARY_TYPE=group \
  -e ZOTERO_GROUP_ID=your_group_id

You can find the group ID in the URL when you view the group on zotero.org (e.g., https://www.zotero.org/groups/12345 → group ID is 12345).

Claude Cowork example (Windows/Mac desktop)

Claude Cowork is one example of an MCP-capable environment. It runs in a virtual machine on your desktop, while this server runs on the host machine and is exposed through the Claude Desktop config.

1. Prerequisites

  • Node.js 18+ installed on your machine (not inside the VM) -- download from https://nodejs.org

  • Zotero desktop running on your machine

  • Claude Desktop with Cowork access (Pro or Max plan)

2. Build the project

Open PowerShell (Windows) or Terminal (Mac):

cd C:\Users\yourname\zotero-grounded-mcp   # or wherever you cloned it
npm install
npm run build

3. Edit the Claude Desktop config

Open the config file:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json

Add the MCP server (create the file if it doesn't exist):

{
  "mcpServers": {
    "zotero": {
      "command": "node",
      "args": ["C:\\Users\\yourname\\zotero-grounded-mcp\\dist\\index.js"],
      "env": {
        "ZOTERO_MODE": "local"
      }
    }
  }
}

Replace the path with the actual absolute path to dist/index.js on your machine.

4. Restart Claude Desktop

Quit and reopen Claude Desktop. The Zotero tools should now appear in Cowork sessions. You can verify by asking Claude to search your library.

How it works: The MCP server runs on your host machine (where Node.js and Zotero live). Cowork's VM bridges to it through the desktop config, so you don't need to install anything inside the VM. Zotero must be running on your desktop for local mode to work.

Configuration reference

Variable

Default

Description

ZOTERO_MODE

local

"local" = Zotero desktop; "web" = zotero.org API

ZOTERO_LIBRARY_TYPE

user

"user" = personal library; "group" = group library

ZOTERO_GROUP_ID

--

Numeric group ID (required when ZOTERO_LIBRARY_TYPE=group)

ZOTERO_USER_ID

--

Your numeric user ID (web mode, user libraries only)

ZOTERO_API_KEY

--

API key from zotero.org/settings/keys (web mode only)

ZOTERO_LOCAL_PORT

23119

Port for the local Zotero connector

Using drafts to produce Zotero-ready .docx files

This is the main workflow for turning an existing draft into a .docx with Zotero-managed citations. The key idea is not "have the assistant invent a paper from scratch" (which is not generally a good idea), but "take an existing draft in another format (like .md, .txt, or even a rough .docx), find the correct references in Zotero, insert validated stubs, and then convert those stubs into Zotero field codes".

This workflow is tied to Zotero's official Word Processor Plugins, especially the Zotero Word Plugin usage guide. In ordinary Zotero usage, those docs describe the commands this MCP is designed to feed into safely:

  • Add/Edit Citation

  • Add/Edit Bibliography

  • Document Preferences

  • Refresh

  • Unlink Citations

How it works

Your draft (.md, .txt, pasted text, or a rough .docx source)
    |
    v
Your MCP client + zotero-grounded-mcp
    |  1. Searches your Zotero library (zotero_search)
    |  2. Reads abstracts, notes, attachments
    |  3. Matches claims in the draft to real Zotero items
    |  4. Generates validated citation stubs (zotero_cite_stub)
    |  5. Produces a fresh .docx containing those stubs
    v
.docx file with stubs like {{CITE:4XD6XSLU|lib=user:1234567|p=42}}
    |
    v
Your MCP client runs zotero_process_docx
    |  Edits the .docx XML directly: fetches item data from Zotero,
    |  builds the field code structure Zotero's Word integration expects
    v
.docx with live Zotero field codes
    |
    v
Open in Word, click Zotero > Refresh
    |  Zotero formats all citations per your chosen CSL style,
    |  generates the bibliography, and takes ownership
    v
Finished document -- citations are live, reformattable,
and included in Zotero's bibliography management

Step by step

  1. Provide a real draft and ask the assistant to ground it in your Zotero library. For example:

    "Take this draft about logical expressivism, find the correct references in my Zotero library, and create a fresh .docx with validated Zotero stubs for every citation."

    A good client workflow is:

    • start from a draft you already have

    • ask the assistant to identify which claims need citations

    • ask it to search Zotero for the matching items

    • have it generate a new .docx with validated stubs rather than hand-written references

    The resulting draft will contain stubs like:

    Brandom argues that meaning is constituted by inferential relations
    {{CITE:4XD6XSLU|lib=user:1234567|p=42}}. This builds on earlier work
    {{CITE:Z2JEL4W2;6KQWLXUJ|lib=user:1234567}}.
    
    {{BIBLIOGRAPHY|lib=user:1234567|style=chicago-author-date}}
  2. Save or export that result as .docx.

  3. Process the .docx through zotero_process_docx. This converts the stubs directly into Zotero field codes inside the .docx. No macros or manual XML editing are required.

  4. Open the processed .docx in Word and click Zotero > Refresh. This is the same refresh action documented in Zotero's official Word Plugin usage guide. Zotero formats everything:

    • {{CITE:4XD6XSLU|lib=user:1234567|p=42}} becomes (Brandom, 2019, p. 42)

    • The bibliography appears at the end with all cited works

    • You can now change citation styles, add references, etc. through Zotero as usual

The important distinction is:

  • the assistant helps find and validate the references

  • zotero_cite_stub ensures the references are real Zotero items

  • zotero_process_docx converts the stubbed .docx into a Zotero-ready .docx

  • Zotero itself takes ownership after refresh through the normal Word plugin workflow

In other words, this MCP is an on-ramp into Zotero's existing document model, not a parallel citation system.

Anti-hallucination guardrail

The zotero_cite_stub tool validates every item key for the stubs it generates against your Zotero library. If the assistant tries to generate a stub for an item that doesn't exist, the tool returns an error:

Error: The following Zotero item keys were not found in the library: FAKEKEY99.
Use zotero_search to find valid keys.

This does not mean the entire document is automatically fabrication-proof. An assistant could still:

  • cite a real item from your library that is not actually relevant to the paragraph,

  • write fake references as plain text,

  • hand-write a bogus stub without calling the tool,

  • or add claims with no Zotero-backed citation at all.

What the workflow does guarantee is narrower and more useful: citations that go through the validated zotero_cite_stub -> zotero_process_docx -> Zotero Refresh path are grounded in real Zotero items. Fake references outside that path may still appear as ordinary text, but they will not be taken over as Zotero-managed citations.

In practice, every citation that passes through the validated path points to a real item in your library -- it will not be an outright fabrication. But a real reference can still be misapplied. You should review the final document for relevance (does this source actually support this claim?) and for any plain-text references the assistant may have added outside the Zotero-managed path.

Other example workflows

  • "Search my Zotero for Brandom's work on inferentialism" -- uses zotero_search

  • "Get the full citation for item key ABCD1234" -- uses zotero_cite

  • "Build a bibliography from these 5 items" -- uses zotero_bibliography

  • "What are my notes on this paper?" -- uses zotero_get_notes

  • "What PDFs do I have for this item?" -- uses zotero_get_attachments

  • "Take this draft section, find the right Zotero references, and generate a .docx with citation stubs" -- uses zotero_search, zotero_cite_stub

  • "Process this stubbed .docx into a Zotero-ready .docx" -- uses zotero_process_docx

Privacy and security

This server is local-first and privacy-respecting:

  • Local mode: all data stays on your machine (talks only to localhost:23119)

  • Web mode: talks only to api.zotero.org and your own Zotero.org account

  • Read-only Zotero access: it reads your library metadata but does not modify Zotero records

  • No third-party services: no data is sent to third parties through the MCP server, there are no more privacy considerations than using a LLM in the cloud in the first place. If you are using a local model, all data stays on your machine.

Troubleshooting

"Could not connect to Zotero. Is Zotero desktop running?" Open the Zotero desktop app. It needs to be running for local mode to work.

"Web mode requires userId and apiKey" You're in web mode but forgot to set the credentials. Add ZOTERO_USER_ID and ZOTERO_API_KEY to your MCP server config.

"Zotero API request timed out" The Zotero API didn't respond within 10 seconds. Check your internet connection (web mode) or restart Zotero (local mode).

My MCP client doesn't seem to use the Zotero tools

  1. Check that the server is registered in your client

  2. Make sure the path in your config points to the built dist/index.js, not src/index.ts

  3. Restart the MCP client after adding the config

  4. If you are using Claude Code specifically, run claude mcp list to inspect configured servers

Tools work but citations look plain The server uses citeproc-js for proper citation formatting. If an item doesn't have CSL-JSON data from Zotero, it falls back to a simplified format. This is normal for some item types.

Development

npm install        # install dependencies
npm run dev        # run with tsx (hot reload, for development)
npm run build      # compile TypeScript to dist/
npm start          # run the compiled server
npm test           # run the test suite (vitest)

Project structure

zotero-grounded-mcp/
├── src/
│   ├── index.ts             # MCP server entry point, tool definitions
│   ├── zotero-client.ts     # Zotero API client (local + web)
│   ├── citation-stubs.ts    # .docx stub generation + style validation
│   ├── docx-workflow.ts     # Library-aware .docx orchestration for processing
│   ├── docx-processor.ts   # Post-processes .docx to inject Zotero field codes
│   ├── formatter.ts         # Citation formatting (citeproc + fallback)
│   ├── citation-engine.ts   # citeproc-js wrapper
│   ├── html-utils.ts        # HTML-to-Markdown converter
│   ├── citeproc.d.ts        # Type declarations for citeproc
│   ├── server-version.ts    # package.json version bridge for MCP metadata
│   └── csl/                 # Bundled CSL style and locale data
│       ├── chicago-author-date.ts
│       └── locales-en-US.ts
├── tests/                   # Vitest test suite
├── .github/workflows/       # CI build + test checks
├── dist/                    # Compiled output (after npm run build)
├── package.json
├── tsconfig.json
├── vitest.config.ts
└── README.md

License and authorship

This project is released under the MIT License.

Authored by Mauro Santelli, with development help from Claude Opus 4.6 and Codex 5.4.

Available Tools

9 tools
zotero_bibliographyA

Generate a formatted bibliography (Works Cited) from a list of Zotero item keys. Returns entries sorted alphabetically, ready to paste into a document.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYesArray of Zotero item keys to include
styleNoCSL style: 'chicago-author-date' (default), 'apa', 'mla', 'ieee', 'harvard'

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states that entries are 'sorted alphabetically' and 'ready to paste into a document,' which conveys some output characteristics. However, it does not mention potential errors, the output format (e.g., plain text vs. HTML), or any side effects, so the transparency is moderate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally concise: two sentences, 21 words. It front-loads the core purpose in the first sentence and adds a useful behavioral detail (sorting) in the second. There is no waste, repetition, or extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with no output schema, the description covers the basic purpose and one output trait (sorted entries). However, it omits important context such as what the returned bibliography looks like (e.g., plain text, HTML), the default citation style, and how the 'style' parameter affects output. Given the tool's moderate complexity, the description is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters ('keys' and 'style') with 100% coverage, so the baseline is 3. The description only references 'list of Zotero item keys,' which mirrors the 'keys' parameter but adds no additional nuance. It does not mention the 'style' parameter, its options, or the default, so no significant value is added beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Generate a formatted bibliography (Works Cited) from a list of Zotero item keys.' It uses a specific verb ('Generate') and resource ('bibliography'), and the phrase 'Works Cited' plus 'list of Zotero item keys' differentiates it from sibling tools like zotero_cite, which handle individual citations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (when you have a list of Zotero item keys and need a bibliography), but it does not explicitly mention alternatives or when not to use it. Sibling tools like zotero_cite could be relevant alternatives, and the absence of any exclusion or comparison leaves the guidance implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_citeA

Generate inline citations and full reference entries for one or more Zotero items. Provide item keys. Useful when writing documents — gives you the exact citation text to insert.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYesArray of Zotero item keys to cite
styleNoCSL style: 'chicago-author-date' (default), 'apa', 'mla', 'ieee', 'harvard'

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description bears full responsibility. It discloses the output (exact citation text) but does not state whether the tool is read-only, requires Zotero connectivity, or any error behavior. It adds minimal context beyond the tool's obvious function.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the action, and includes a use case. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With simple parameters and no output schema, the description adequately covers purpose, input, and use case. It lacks note on prerequisites like Zotero running, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with descriptions for both keys and style. The description only says 'Provide item keys,' which adds no meaning beyond the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it generates inline citations and full reference entries for Zotero items, with a specific verb and resource. 'Provide item keys' indicates required input, distinguishing it from sibling tools like zotero_search or zotero_collections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context: 'Useful when writing documents — gives you the exact citation text to insert.' This clearly indicates when to use, but does not explicitly mention alternatives or exclusions, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_cite_stubA

Generate validated citation stubs for use in documents. Each stub references a real Zotero item — if any key doesn't exist, the tool returns an error. Use these stubs in .docx documents, then run zotero_process_docx to convert them into live Zotero citations.

Stub format: {{CITE:KEY|lib=user:12345}} — simple citation {{CITE:KEY|lib=user:12345|p=42}} — with page locator {{CITE:KEY1;KEY2|lib=group:67890}} — grouped (multiple sources, one claim) {{CITE:KEY|lib=user:12345|prefix=see%20|suffix=%2C%20emphasis%20added}} — with prefix/suffix {{CITE:KEY|lib=user:12345|suppress-author}} — for narrative citations like "Brandom (2019) argues..." {{BIBLIOGRAPHY|lib=user:12345|style=apa}} — bibliography placeholder with document style

IMPORTANT: Always call this tool to get stubs instead of writing them by hand. This validates that every key exists in the user's Zotero library, preventing hallucinated references.

ParametersJSON Schema
NameRequiredDescriptionDefault
citationsYesArray of citations to generate stubs for
bibliographyNoIf true, also include a {{BIBLIOGRAPHY}} stub
bibliographyStyleNoCSL style for bibliography (e.g. 'chicago-author-date'). Default: apa

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It transparently states that the tool errors on nonexistent keys, validates all keys against the user's Zotero library, and describes the exact stub output format with examples. It doesn't cover potential side effects or return value structure, but for a generation tool, the disclosed behavior is sufficient. The validation warning is a valuable behavioral disclosure not evident from the name or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear purpose statement, followed by a structured list of stub formats, and closes with an important usage note. Each example in the list is compact and necessary because the stub syntax is the core knowledge required to invoke the tool correctly. Though it is longer than a typical description, every line contributes to usability; only a slight reduction could be made by trimming examples, but the detail is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description compensates by providing a comprehensive picture: what the tool does, when to use it, how to construct stubs, what validation behavior to expect, and how it fits into the larger document processing workflow. It even includes the specific stub format for bibliography. This level of detail ensures the agent can select and invoke the tool correctly without additional context. The only minor omission is an explicit statement about the return type, but the stub examples strongly imply the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage with descriptions. The description adds semantic depth by showing concrete usage of each parameter through stub format examples (e.g., 'p=42' for locator, 'prefix=see%20|suffix=%2C%20emphasis%20added' for prefix/suffix, 'suppress-author' for narrative citations). This goes beyond the schema definitions, helping the agent map parameters to the actual stub syntax. The bibliography placeholder example clarifies the purpose of bibliography and bibliographyStyle parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Generate validated citation stubs for use in documents,' a specific verb+resource pairing that clearly differentiates from siblings like zotero_cite or zotero_process_docx. It further distinguishes itself by emphasizing validation of real Zotero items and the exact stub format. This leaves no ambiguity about the tool's core function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear workflow guidance: use stubs in .docx documents then run zotero_process_docx. The 'IMPORTANT: Always call this tool to get stubs instead of writing them by hand' gives a strong directive, and the validation rationale prevents hallucinated references. It doesn't explicitly state when NOT to use this tool versus alternatives like zotero_cite, but the overall context implies a staged workflow, earning a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_collectionsA

List all collections in your Zotero library. Returns collection names and keys.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. 'List' indicates a read-only operation, and 'Returns collection names and keys' adds useful output information. However, it does not disclose potential limitations like pagination, permission requirements, or empty-library behavior, leaving some behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences that front-load the purpose and immediately state the return value. Every word earns its place, with no redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, simple list tool, the description fully covers its function and output. There is no output schema, but the mention of 'collection names and keys' provides enough context. No additional information seems necessary for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides complete coverage by definition. The description adds clarifying information about what the tool returns (collection names and keys), which is sufficient given no parameters exist. The baseline for 0 params is 4, and this description meets that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('all collections in your Zotero library'), which clearly distinguishes it from sibling tools that handle items, searches, citations, or document processing. It is unambiguous and directly conveys the tool's core function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is for retrieving collections, but it does not explicitly state when to use it instead of alternatives like zotero_search or zotero_get_item. Since there are no exclusions or alternative mentions, the guidance is only implicit and limited.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_get_attachmentsA

Get file attachments (PDFs, etc.) for a Zotero item. Returns filenames, file paths, content types, and link modes.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesZotero item key (e.g. 'ABC12345')

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description explicitly states what it returns (filenames, paths, content types, link modes), which is valuable behavioral disclosure. Without annotations, it does not mention edge cases like empty results or authorization requirements, but for a simple read operation, this level of detail is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and resource, no filler. Every word adds value, making it a model of concise tool documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter, full schema coverage, and no output schema, the description is functionally complete: it states what the tool does and what data it returns. It lacks only minor details like behavior when no attachments exist, but these are not critical for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: the single 'key' parameter is already described with an example in the schema. The description adds only 'for a Zotero item', which does not materially enhance the schema's explanation. Baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and identifies the resource ('file attachments for a Zotero item'), clearly distinguishing it from sibling tools like zotero_get_item or zotero_get_notes. It also lists the outputs (filenames, paths, content types, link modes), making the tool's unique function explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: when you need file attachment metadata for a particular Zotero item. It does not mention alternatives or exclusion criteria, but the context is clear enough that an agent can infer it is meant for attachments rather than note or item metadata.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_get_itemA

Get full metadata for a Zotero item by its key. Returns all fields including abstract, tags, collections, and CSL-JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesZotero item key (e.g. 'ABC12345')

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses the key behavior of returning all fields including abstract, tags, collections, and CSL-JSON, which informs the agent of the output scope. It does not mention error cases or permissions, but for a read-only getter this is acceptable and adds value beyond the name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the action and resource, and each sentence earns its place. It is appropriately concise with no redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter lookup with no output schema, the description provides sufficient context by naming the return content. It omits potential error conditions, but these are not mission-critical for a straightforward getter. Overall, it is complete for the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes the single 'key' parameter with a type and example. The description's phrase 'by its key' merely restates the parameter, adding no new semantic detail. Since schema coverage is 100%, this meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get', the resource 'full metadata for a Zotero item', and the scope 'by its key'. It distinguishes itself from sibling getters like zotero_get_notes and zotero_get_attachments by focusing on the item record itself and listing specific return fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: use this tool when you have an item key and need the complete metadata record. It does not explicitly mention alternatives or exclusions, but the 'by its key' phrasing and sibling tool names make the intended use obvious enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_get_notesA

Get notes and annotations attached to a Zotero item. Returns note content as Markdown and PDF annotations with highlighted text, comments, and page numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesZotero item key (e.g. 'ABC12345')

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return format ('Markdown' and 'PDF annotations with highlighted text, comments, and page numbers'), which is meaningful. It does not discuss edge cases or error behavior, but for a read-only tool this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. The first sentence front-loads the purpose, the second details the output. Perfectly concise and structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool, the description adequately explains purpose and return content. It does not need an output schema because the return format is described in prose. Slight gap: no mention of what happens when no notes/annotations exist, but this is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (only 'key' parameter, described as 'Zotero item key (e.g. 'ABC12345')'). The description adds little beyond the schema, just repeating that it operates on an item. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Get notes and annotations attached to a Zotero item', using a specific verb and resource. It distinguishes from siblings like zotero_get_item (item metadata) and zotero_get_attachments (attachments) by focusing on notes/annotations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use: when you need note or annotation content for a specific Zotero item. It does not explicitly mention alternatives or exclusions, but the context is clear enough given the sibling tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zotero_process_docxA

Process a .docx file to convert {{CITE:...}} stubs into live Zotero field codes. This directly edits the .docx XML to produce the exact field structure Zotero expects. After processing, open the file in Word and click Zotero > Refresh.

Give this tool the file path and it does everything: fetches item data from Zotero, builds field codes, writes the output. Fire and forget.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputPathYesPath to the .docx file with citation stubs
outputPathNoOutput path (defaults to overwriting the input file)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses key side effects: 'directly edits the .docx XML', 'fetches item data', 'builds field codes', 'writes the output'. It also warns about the post-processing step in Word. It doesn't mention failure modes or prerequisites like Zotero running, but it is quite transparent for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose, followed by mechanism and a summary. It is two sentences plus a summary line, which is efficient. The only minor redundancy is 'Give this tool the file path and it does everything' restating the parameter usage, but it does not waste words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only 2 params and no output schema, the description covers the essential context: what it processes, how it works, what the user must do afterwards, and the all-in-one nature. It omits potential error conditions or prerequisites, but for a simple file-processing tool, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% coverage for both parameters ('Path to the .docx file with citation stubs' and 'Output path (defaults to overwriting the input file)'). The description adds a general 'give it the file path and it does everything' but does not enrich the meaning beyond what schema descriptions already state. This matches the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Process a .docx file to convert {{CITE:...}} stubs into live Zotero field codes.' This clearly distinguishes it from sibling tools like zotero_get_item or zotero_cite, which handle other aspects of Zotero interaction. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when you have a .docx with citation stubs and want them converted. It also provides a workflow hint ('open the file in Word and click Zotero > Refresh'). However, it does not explicitly exclude alternatives or state when not to use it, so it lacks a clear contrast with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv1.0.0
    • First observedzotero_bibliography
    • First observedzotero_cite
    • First observedzotero_cite_stub
    • First observedzotero_collections
    • First observedzotero_get_attachments
    • First observedzotero_get_item
    • First observedzotero_get_notes
    • First observedzotero_process_docx
    • First observedzotero_search

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

Most tools target distinct actions: retrieval (get_item, get_notes, get_attachments), discovery (search, collections), and citation output (cite, bibliography, cite_stub, process_docx). However, cite and bibliography both generate reference text, and cite_stub may be confused with cite at first glance.

Naming Consistency3/5

All tools share the zotero_ prefix and use snake_case, but the pattern is inconsistent: some are verb_noun (zotero_get_item, zotero_process_docx), some are verb-only (zotero_search, zotero_cite), some are noun-only (zotero_collections, zotero_bibliography), and one is verb_noun with a noun complement (zotero_cite_stub). This mixed style is readable but not fully predictable.

Tool Count5/5

With 9 tools, the server is well-scoped for its purpose: Zotero lookup, citation generation, and docx processing. Each tool fills a distinct role in the workflow, and the count is neither bloated nor sparse.

Completeness5/5

The tool surface covers the full citation-writing workflow: searching and retrieving items, accessing notes/attachments, generating citations and bibliographies, validating stub keys, and converting stubs into live Zotero fields. No critical missing operations for the stated domain.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers