zotero-local
Interact with a local Zotero 8 desktop application through its HTTP API at localhost:23119. Use this skill whenever the user wants to search, fetch, add, edit, or organize bibliographic items in their Zotero library, import citations (BibTeX, RIS, etc.), attach files, manage collections and tags, or retrieve full-text content from Zotero. Triggers on mentions of Zotero, citation management, reference libraries, bibliographic databases, or local library management. Also use when chaining with other catalog skills (Harvard, LOC, HathiTrust, etc.) to save found records into the user's Zotero library.
What this skill does
# Zotero Local API Skill
Interact with a running Zotero 8 desktop app via its local HTTP API.
## Critical: Two API Layers
Zotero's local server has **two separate API layers** with different capabilities:
### 1. Local API (Read-Only) — `/api/...`
Mirrors the Zotero Web API v3 at `http://localhost:23119/api/`. Supports comprehensive read operations but **no writes** (POST/PUT/PATCH/DELETE all return 400).
- Uses `users/0` for the local user (not the actual user ID)
- No authentication required
- All query parameters from the Web API work: `q`, `qmode`, `sort`, `direction`, `limit`, `start`, `format`, `include`, `itemType`, `tag`, `since`
- Supports `format=json` (default), `format=bib`, `format=citation`, `format=keys`, `format=versions`, and export formats like `format=bibtex`
### 2. Connector API (Write) — `/connector/...`
The connector endpoints handle all write operations:
| Endpoint | What it does |
|----------|-------------|
| `POST /connector/saveItems` | Create items with full metadata, notes, and tags |
| `POST /connector/saveSnapshot` | Save a webpage as a Zotero item |
| `POST /connector/import` | Import BibTeX, RIS, or other bibliographic formats |
| `POST /connector/saveAttachment` | Attach files to existing items |
| `POST /connector/saveStandaloneAttachment` | Save a standalone file attachment |
| `POST /connector/saveSingleFile` | Save SingleFile webpage snapshots |
| `POST /connector/updateSession` | Update tags, target collection for a save session |
| `POST /connector/getSelectedCollection` | Get current library/collection selection |
| `POST /connector/installStyle` | Install citation styles |
## Prerequisites
- Zotero 8 must be running on the local machine
- In Zotero preferences: "Allow other applications on this computer to communicate with Zotero" must be enabled
- The API runs at `http://localhost:23119/api/`
## Common Workflows
### Search Items
```
GET http://localhost:23119/api/users/0/items?q=keyword&format=json&limit=20
```
Query parameters: `q` (search text), `qmode` (titleCreatorYear or everything), `sort` (dateAdded, dateModified, title, creator, date), `direction` (asc/desc), `itemType` (book, journalArticle, etc.), `tag` (filter by tag).
### Get a Specific Item
```
GET http://localhost:23119/api/users/0/items/{itemKey}?format=json
```
### Get Item Children (notes, attachments)
```
GET http://localhost:23119/api/users/0/items/{itemKey}/children?format=json
```
### Create Items
```bash
POST http://localhost:23119/connector/saveItems
Content-Type: application/json
{
"items": [{
"itemType": "book",
"title": "The Title",
"creators": [{"firstName": "First", "lastName": "Last", "creatorType": "author"}],
"date": "2024",
"publisher": "Publisher Name",
"ISBN": "978-0-123456-78-9",
"tags": [{"tag": "history"}, {"tag": "research"}],
"notes": [{"note": "<p>My note about this book</p>"}]
}],
"uri": "http://example.com",
"sessionID": "unique-session-id"
}
```
The `uri` and `sessionID` fields are required by the connector protocol. Use any unique string for `sessionID`.
### Import BibTeX/RIS
The import endpoint requires a unique `session` query parameter:
```bash
POST http://localhost:23119/connector/import?session=unique-id
Content-Type: text/plain
@book{key2024,
author = {Author Name},
title = {Book Title},
year = {2024},
publisher = {Publisher}
}
```
Returns the created item(s) as JSON. Without the `session` parameter, repeated imports return 409 Conflict.
### Import a PDF into Zotero
Upload a PDF as a standalone attachment. Zotero auto-recognizes the document and creates a parent item with extracted metadata (title, authors, DOI, etc.).
```bash
POST http://localhost:23119/connector/saveStandaloneAttachment
Content-Type: application/pdf
X-Metadata: {"sessionID": "unique-id", "url": "file:///path/to/file.pdf", "title": "file.pdf"}
<binary PDF data>
```
Returns `{"canRecognize": true}` on success (201).
### Attach a File to an Existing Item
Requires the **Better BibTeX (BBT)** extension for its debug-bridge endpoint. Without BBT, use `import_pdf()` to import as a standalone item instead.
```bash
POST http://127.0.0.1:23119/debug-bridge/execute
Content-Type: application/javascript
var item = await Zotero.Items.getByLibraryAndKeyAsync(
Zotero.Libraries.userLibraryID, 'ITEMKEY'
);
var att = await Zotero.Attachments.importFromFile({
file: '/path/to/file.pdf',
parentItemID: item.id
});
return JSON.stringify({key: att.key});
```
### Download Attached Files
Get the local file path for an attachment:
```
GET http://localhost:23119/api/users/0/items/{attachmentKey}/file/view/url
```
Returns a `file://` URL pointing to the file in Zotero's storage directory.
Or redirect to the file directly (returns 302):
```
GET http://localhost:23119/api/users/0/items/{attachmentKey}/file
```
### Get Full-Text Content
```
GET http://localhost:23119/api/users/0/items/{itemKey}/fulltext
```
Returns indexed full-text content for PDFs and other indexed documents.
### List Collections
```
GET http://localhost:23119/api/users/0/collections?format=json
GET http://localhost:23119/api/users/0/collections/top?format=json
GET http://localhost:23119/api/users/0/collections/{collectionKey}/items?format=json
```
### Create / Delete Collections (requires BBT)
These operations use the Better BibTeX debug-bridge. See the "Better BibTeX" section below.
```python
z = ZoteroLocal()
# Check if BBT is available
if not z.check_bbt():
print("Install Better BibTeX: https://retorque.re/zotero-better-bibtex/installation/")
# Create a top-level collection
col = z.create_collection("My Research")
# Returns: {"key": "ABCD1234", "name": "My Research"}
# Create a sub-collection
sub = z.create_collection("Chapter 1", parent_key=col["key"])
# Returns: {"key": "EFGH5678", "name": "Chapter 1", "parentKey": "ABCD1234"}
# Delete a collection (items remain in library)
z.delete_collection("ABCD1234")
# Delete a collection and trash items only in that collection
z.delete_collection("ABCD1234", delete_items=True)
```
### List Tags
```
GET http://localhost:23119/api/users/0/tags?format=json
```
### Export Citations
```
GET http://localhost:23119/api/users/0/items?format=bibtex
GET http://localhost:23119/api/users/0/items/{itemKey}?format=ris
GET http://localhost:23119/api/users/0/items?format=bib&style=chicago-author-date
```
Supported export formats: `bibtex`, `ris`, `csljson`, `mods`, `refer`, `rdf_bibliontology`, `rdf_dc`, `rdf_zotero`, `tei`, `wikipedia`.
### Execute Saved Searches
Unlike the web API, the local API can execute saved searches:
```
GET http://localhost:23119/api/users/0/searches/{searchKey}/items?format=json
```
## Item Types
Common types: `book`, `bookSection`, `journalArticle`, `conferencePaper`, `thesis`, `report`, `webpage`, `document`, `manuscript`, `letter`, `map`, `artwork`, `film`, `videoRecording`, `audioRecording`, `presentation`, `statute`, `case`, `patent`, `blogPost`, `forumPost`, `encyclopediaArticle`, `dictionaryEntry`, `newspaperArticle`, `magazineArticle`.
Get all types: `GET http://localhost:23119/api/itemTypes`
Get fields for a type: `GET http://localhost:23119/api/itemTypeFields?itemType=book`
Get creator types: `GET http://localhost:23119/api/itemTypeCreatorTypes?itemType=book`
## Response Structure
Items from the local API return this structure:
```json
{
"key": "ABC12345",
"version": 0,
"library": {"type": "user", "id": 0, "name": "My Library"},
"meta": {"creatorSummary": "Author", "numChildren": 2},
"data": {
"key": "ABC12345",
"itemType": "book",
"title": "...",
"creators": [...],
"date": "2024",
"publisher": "...",
"ISBN": "...",
"tags": [{"tag": "..."}],
"collections": ["COLLKEY1"],
"dateAdded": "2024-01-01T00:00:00Z",
"dateModified": "2024-01-01T00:00:00Z"
}
}
```
## Python Script
```python
from scripts.zotero_api import ZoteroLocal
z = ZoteroLocal() # connectRelated in Backend & APIs
jfrog
IncludedInteract with the JFrog Platform via the JFrog CLI and REST/GraphQL APIs. Use this skill when the user wants to manage Artifactory repositories, upload or download artifacts, manage builds, configure permissions, manage users and groups, work with access tokens, configure JFrog CLI servers, search artifacts, manage properties, set up replication, manage JFrog Projects, run security audits or scans, look up CVE details, query exposures scan results from JFrog Advanced Security, manage release bundles and lifecycle operations, aggregate or export platform data, or perform any JFrog Platform administration task. Also use when the user mentions jf, jfrog, artifactory, xray, distribution, evidence, apptrust, onemodel, graphql, workers, mission control, curation, advanced security, exposures, or any JFrog product name.
cupynumeric-migration-readiness
IncludedPre-migration readiness assessor for porting NumPy to cuPyNumeric. Use BEFORE substantial porting work begins when the user asks whether code will scale on GPU, whether they should migrate to cuPyNumeric, which NumPy patterns transfer cleanly, what must be refactored before porting, or mentions pre-port assessment, scaling analysis, or refactor planning. Inspect the user's source code, look up NumPy usage, cross-reference the cuPyNumeric API support manifest, and distinguish distributed-scaling-friendly patterns from blockers such as unsupported APIs, scalar synchronization, host round-trips, Python/object-heavy control flow, shape/data-dependent branching, and in-place mutation hazards. Produce a verdict of READY, LIGHT REFACTOR, SIGNIFICANT REFACTOR, or NOT RECOMMENDED, with concrete refactor pointers.
alibabacloud-data-agent-skill
IncludedInvoke Alibaba Cloud Apsara Data Agent for Analytics via CLI to perform natural language-driven data analysis on enterprise databases. Data Agent for Analytics is an intelligent data analysis agent developed by Alibaba Cloud Database team for enterprise users. It automatically completes requirement analysis, data understanding, analysis insights, and report generation based on natural language descriptions. This tool supports: discovering data resources (instances/databases/tables) managed in DMS, initiating query or deep analysis sessions, real-time progress tracking, and retrieving analysis conclusions and generated reports. Use this Skill when users need to query databases, analyze data trends, generate data reports, ask questions in natural language, or mention "Data Agent", "data analysis", "database query", "SQL analysis", "data insights".
token-optimizer
IncludedReduce OpenClaw token usage and API costs through smart model routing, heartbeat optimization, budget tracking, and native 2026.2.15 features (session pruning, bootstrap size limits, cache TTL alignment). Use when token costs are high, API rate limits are being hit, or hosting multiple agents at scale. The 4 executable scripts (context_optimizer, model_router, heartbeat_optimizer, token_tracker) are local-only — no network requests, no subprocess calls, no system modifications. Reference files (PROVIDERS.md, config-patches.json) document optional multi-provider strategies that require external API keys and network access if you choose to use them. See SECURITY.md for full breakdown.
resend-cli
IncludedUse this skill when the task is specifically about operating Resend from an AI agent, terminal session, or CI job via the official resend CLI: installing/authenticating the CLI, sending/listing/updating/cancelling emails, batch sends, domains and DNS, webhooks and local listeners, inbound receiving, contacts, topics, segments, broadcasts, templates, API keys, profiles, or debugging Resend CLI/API failures. Trigger on mentions of Resend CLI, `resend`, `resend doctor`, `resend emails send`, `resend domains`, `resend webhooks listen`, `resend emails receiving`, or agent-friendly terminal automation.
alibabacloud-odps-maxframe-coding
IncludedUse this skill for MaxFrame SDK development and documentation navigation on Alibaba Cloud MaxCompute (ODPS). Helps answer MaxFrame API, concept, official example, and supported pandas API questions; create data processing programs; read/write MaxCompute tables; debug jobs (remote or local); and build custom DPE runtime images. Trigger when users mention MaxFrame, MaxCompute with MaxFrame, ODPS table processing, DPE runtime, MaxFrame docs/examples, DataFrame/Tensor operations, or GPU runtime setup. Works for both English and Chinese queries about Alibaba Cloud data processing with MaxFrame.