Docs

Use PartPin with your AI agent

Everything PartPin does for you on the dashboard — resolve a part number against your own catalog, register or update a part, run a zero-result query autopsy, confirm a write-back — your own AI agent can do too. There are three doors, all opened by one API key from the dashboard's API KEY card: a remote MCP server for Claude, ChatGPT/Codex, Cursor, VS Code and any other MCP client; a REST API with an OpenAPI document; and the partpin CLI. The agent acts as your workspace, under your workspace's own data — never another tenant's.

1. Get an API key

Sign in and open the dashboard. A full-access key is minted the first time you sign in; rotate it any time with the Rotate key button. The key is shown once. Put it in an environment variable — every snippet below reads PARTPIN_API_KEY — rather than pasting it into a file that gets committed.

2. Claude Code, claude.ai and Claude Desktop

Claude Code, from a terminal (the key is sent as a header on every request):

claude mcp add --transport http partpin https://partpin.net/mcp \
  --header "Authorization: Bearer $PARTPIN_API_KEY"

Or add it to a project's .mcp.json so the whole team gets it; Claude Code expands ${PARTPIN_API_KEY} from the environment:

{
  "mcpServers": {
    "partpin": {
      "type": "http",
      "url": "https://partpin.net/mcp",
      "headers": { "Authorization": "Bearer ${PARTPIN_API_KEY}" }
    }
  }
}

claude.ai and Claude Desktop: Customize → Connectors → Add custom connector. Name it PartPin, set the URL to https://partpin.net/mcp, choose “No sign in”, and under Request headers add Authorization with the value Bearer <your key>.

3. Cursor and VS Code

Cursor — ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):

{
  "mcpServers": {
    "partpin": {
      "url": "https://partpin.net/mcp",
      "headers": { "Authorization": "Bearer ${env:PARTPIN_API_KEY}" }
    }
  }
}

VS Code — .vscode/mcp.json; the input prompt keeps the key out of the file:

{
  "servers": {
    "partpin": {
      "type": "http",
      "url": "https://partpin.net/mcp",
      "headers": { "Authorization": "Bearer ${input:partpin-key}" }
    }
  },
  "inputs": [{ "id": "partpin-key", "type": "promptString", "password": true, "description": "PartPin API key" }]
}

4. ChatGPT and Codex

Codex CLI and the ChatGPT desktop app share one MCP configuration:

[mcp_servers.partpin]
url = "https://partpin.net/mcp"
bearer_token_env_var = "PARTPIN_API_KEY"

ChatGPT's in-app custom connectors currently require OAuth or no authentication, and cannot send a fixed header. The server also exposes search and fetchin the shape ChatGPT's deep-research connectors expect, so the day sign-in with PartPin is available there, nothing else changes. Until then, use Codex above.

5. The CLI

Node 18 or newer. No install needed; npx fetches the partpin package. It talks to the same API with the same key:

# one-time: paste your key when prompted (stored in ~/.config/partpin/config.json, mode 600)
npx partpin login

npx partpin whoami
npx partpin resolve "6203DDU"
npx partpin search "6203" --limit 10
npx partpin register bearing-6203 6203-2RS --title "Deep groove bearing" --alias 6203DDU
npx partpin autopsy misses.txt            # one query per line; write-scope not required
npx partpin confirm "6203 special" bearing-6203
npx partpin queries --misses

# any command: --json for machine-readable output; PARTPIN_API_KEY overrides the saved key

6. The tools

What any MCP client sees from tools/list. “Read-only” and “destructive” are the server's own annotations; Claude and other clients use them to decide when to ask you first. PartPin ships no destructive tool today — nothing here can delete a catalog or a workspace.

ToolScopeKindWhat it does
resolve_partreadread-onlyResolve ONE query against the workspace's own uploaded catalog through PartPin's tiered resolver: exact/alias matches are ASSERTED (confident, 'this IS the part'); fuzzy and hybrid matches are returned as ranked CANDIDATES for a human to confirm, never stated as fact. When nothing in the workspace's own catalog asserts, PartPin's interchange seed may add cross-reference candidates (never asserted) to parts the workspace stocks. Every call is logged to the query log (GET /api/v1/queries). 404 if no catalog has been uploaded yet.
search_catalogreadread-onlyRaw candidate browse of the workspace's own catalog near a term: exact key matches plus nearby trigram neighbors, up to `limit` (default 20, max 100). No tiered scoring, no assertion doctrine, no interchange seed, and nothing is logged. Use this to see what the catalog actually contains before deciding whether to register_part; use resolve_part when the question is 'what does THIS query resolve to'.
register_partwritewritesAdd or update ONE item in the workspace's catalog by id, without touching the rest of the catalog (the bulk POST /api/catalog endpoint replaces the WHOLE catalog; this is additive/idempotent -- registering the same id again just updates it). Requires a write-scope key. Not destructive: nothing is ever deleted by this tool.
run_autopsyreadread-onlyScore a list of real customer queries (e.g. zero-result search terms exported from your storefront) against the workspace's OWN uploaded catalog: each query is classified resolved (asserted match), candidate (unasserted match only), or dead (nothing). Up to 5000 queries per call. Read-only -- nothing is logged or saved. This is the authenticated, your-own-catalog version of the free public demo at the site's /autopsy page (which takes an arbitrary catalog + queries and needs no key).
confirm_matchwritewritesWRITE-BACK: record that a human confirmed `query` refers to catalog item `itemId`. Persists it as a workspace alias so the SAME query ASSERTS next time (the compounding identifier graph), and logs the confirmation for audit. Requires a write-scope key. Idempotent if the key is already known as an alias of that item. 404 if itemId does not exist in the catalog.
list_queriesreadread-onlyRecent GET /api/v1/resolve and resolve_part calls for this workspace (metering view), or with missesOnly: true, only the zero-result / candidate-only (unasserted) queries -- the live enrichment queue for confirm_match. Up to 500 rows.
whoamireadread-onlyThe workspace this API key belongs to, the key's scopes and display prefix, and recent query/agent activity. Call this first when unsure what the key can do.
searchreadread-onlySame as search_catalog, returned in the connector-shaped id/title/url form fetch() expects.
fetchreadread-onlyFetch the full catalog item for a search() result id.

Try the endpoint by hand — initialize and tools/list need no key:

curl -s -X POST https://partpin.net/mcp \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

7. REST API and OpenAPI

The MCP tools and the CLI are thin layers over /api/v1. The full description is at /openapi.json (OpenAPI 3.1), which any code generator or agent framework can read directly.

curl -s "https://partpin.net/api/v1/resolve?q=6203DDU" \
  -H "Authorization: Bearer $PARTPIN_API_KEY"

curl -s -X POST https://partpin.net/api/v1/parts \
  -H "Authorization: Bearer $PARTPIN_API_KEY" -H "Content-Type: application/json" \
  -d '{"id":"bearing-6203","sku":"6203-2RS","aliases":["6203DDU"]}'

Endpoints: GET /api/v1/me, GET /api/v1/resolve?q=, GET /api/v1/search?q=, POST /api/v1/parts, POST /api/v1/autopsy, POST /api/v1/confirm, GET /api/v1/queries.

8. Safety, limits and logging

Questions

Do I need to pay to use PartPin from an AI agent?
No. PartPin takes no payment today (billing is built but switched off); API keys, the MCP server and the CLI are available to every workspace at no charge, and they enforce the same no-usage-cap state the website does.
How do I get an API key?
Sign in, open the dashboard, and under API KEY either use the key shown right after sign-up or click Rotate key. The full key is shown exactly once; copy it then. Keys are stored hashed, so a lost key cannot be recovered, only rotated.
What is the difference between a read key and a write key?
A read key can resolve parts, browse the catalog, run an autopsy, list recent queries and call whoami. A write key can also register_part and confirm_match (the write-back loop). Give an agent the smallest scope its job needs.
Can an agent delete or overwrite my catalog by accident?
register_part is additive and idempotent: it adds or updates ONE item by id and never touches the rest of the catalog. Nothing in the MCP server, REST API or CLI can delete a catalog or a workspace. The bulk POST /api/catalog endpoint (full replace) is a separate, non-agent path with its own key auth.
Which MCP protocol versions does the server speak?
Both the current stateless revision (2026-07-28, with server/discover) and the earlier handshake revisions clients still use today (2025-03-26, 2025-06-18, 2025-11-25). Transport is Streamable HTTP with plain JSON responses; the endpoint is POST https://partpin.net/mcp. There are no sessions to manage.
What does resolve_part do that search_catalog does not?
resolve_part runs the full tiered resolver (exact/alias asserted, fuzzy/hybrid and interchange candidates ranked) and logs the call. search_catalog is a raw, unscored browse of what the catalog contains near a term, with nothing logged -- useful before deciding what to register_part.

Reviewed 2026-10-02. Protocol facts checked against modelcontextprotocol.io on that date.