# @oscardvs/zoteus

The everything Zotero MCP server — Web API v3 + local API, safe writes, citations, search.

- **Type:** MCP server
- **Trust:** 85/100 (A), scored on the package rubric
- **Verification:** verified (build provenance)
- **Version:** 1.8.0
- **Author:** io.github.oscardvs
- **License:** MIT
- **npm:** @oscardvs/zoteus
- **Source:** https://github.com/oscardvs/zoteus
- **Compatible clients:** claude-code, cursor, copilot, gemini (basis: transport)

## Trust

85/100 (A), scored on the package rubric
- Publisher verified: no
- Build provenance: verified attestation
- npm trusted publishing (OIDC): yes
- Install scripts: nothing suspicious found
- Prompt-injection scan: not run
- Obfuscation scan: not run
- Evidence age: 0 days

## Security scan

- **Status:** clean
- **Scanned:** 2026-08-29T02:09:14.527Z
- **Version scanned:** 1.9.0
- **CVEs:** none found by OSV at scan time
**Findings**
- injection-shaped content (note) in the `zotero_schema` tool: Imperative addressed to the AI model

## Tools

30 declared. Statically extracted from the shipped source — a floor on the surface, not a census.
- `zotero_annotate`
- `zotero_attach_file`
- `zotero_attachment`
- `zotero_bibliography` — Produce a formatted bibliography for items already in a Zotero library, rendered server-side by Zotero in a CSL style. Provide `item_keys` and optionally `style
- `zotero_create_items`
- `zotero_delete_items`
- `zotero_export`
- `zotero_format_bibliography`
- `zotero_fulltext`
- `zotero_get_fulltext`
- `zotero_get_item`
- `zotero_groups` — List the group libraries the current API key can access, with each group's id, name, type, item count, and edit permissions. Use a returned group id with the `l
- `zotero_import`
- `zotero_index`
- `zotero_list_collections` — List collections in a Zotero library (key, name, parent collection key, item count). Read-only — available even in read-only mode (unlike zotero_manage_collecti
- `zotero_list_tags` — List tags in a Zotero library with their usage count and whether each was auto-applied by Zotero. Optional `q` substring filter and `limit`. Read-only — availab
- `zotero_manage_collections`
- `zotero_manage_tags` — List tags, or add/remove tags on items. Set `action` to "list" (returns library tags; supports `q` substring filter), "add" (add `tags` to each of `item_keys`),
- `zotero_saved_searches` — List, create, or delete saved-search DEFINITIONS. NOTE: the Zotero cloud Web API stores saved searches but does NOT execute them — to get the items a saved sear
- `zotero_schema` — Return the Zotero data model so you never hardcode item shapes. With no arguments, returns the schema version and the list of all item type names. With `item_ty
- `zotero_scholar`
- `zotero_search_items`
- `search_tools` — Discover the available Zotero tools by keyword — useful for progressive disclosure when you do not want to load every tool definition up front (the code-executi
- `zotero_semantic_search`
- `zotero_styles`
- `zotero_sync` — Return what changed in a library since a given version, for efficient incremental sync. Provide `since` (a library version; 0 = everything). Returns, per object
- `zotero_tag_audit`
- `zotero_trash_items` — Move items to the trash (the safe, REVERSIBLE default) or restore them. This sets the `deleted` flag (1=trash, 0=restore) — it is NOT a permanent delete, so tra
- `zotero_update_item`
- `zotero_whoami` — Resolve the current Zotero identity (userID, username, display name) and per-library access scopes from the configured API key, and report which library backend

## Install

**Verdict: install** — No blocking findings and no open coverage gaps — safe to install as configured.
**Config** (claude-code):
```json
"{\n  \"mcpServers\": {\n    \"zoteus\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@oscardvs/zoteus\"\n      ],\n      \"env\": {\n        \"ZOTERO_API_KEY\": \"<YOUR_ZOTERO_API_KEY>\"\n      }\n    }\n  }\n}"
```
**Credentials it will ask for** (names only — Forge never holds a value):
- `ZOTERO_API_KEY` — Zotero API Key (optional)
Placeholders only. Forge never holds, brokers, or transmits a credential value — replace each <YOUR_NAME> in your own config file. Do not send a value back to Forge; no Forge endpoint accepts one.
- This entry needs 1 credential (0 required). The generated config carries placeholders, so it will fail in the editor rather than at runtime if they are left unset.

## Blast radius

Extensive blast radius — deletes data; holds an api key.
- Floor 52, ceiling 52 (tier: extensive)
- This is impact, not likelihood. A high radius is not a defect: a filesystem server is supposed to write files. It is never part of the trust score.

## Machine-readable views of this entry

- Signed JSON: https://forgeregistry.com/api/v1/packages/%40oscardvs%2Fzoteus
- Install plan: https://forgeregistry.com/api/v1/packages/%40oscardvs%2Fzoteus/install-plan
- Alternatives: https://forgeregistry.com/api/v1/alternatives/%40oscardvs%2Fzoteus
- HTML page: https://forgeregistry.com/registry/%40oscardvs%2Fzoteus
- MCP: POST https://forgeregistry.com/api/mcp → `forge_get_package` / `forge_install_plan`

## About this document

Generated by Forge (https://forgeregistry.com) — a compact rendering of the same record served, signed, at the JSON URL above. Trust and scan facts are the registry's own measurements; anything Forge did not measure is named as unmeasured rather than omitted.
