The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Pantrist MCP listing page.
A Model Context Protocol server that wraps the Pantrist REST API, so an LLM client (Claude Desktop, the Claude web/mobile connector, Cursor, …) can manage shopping lists, the pantry, recipes and the week plan in natural language.
It's a thin wrapper — no business logic. Every tool maps to an existing
REST endpoint and forwards the caller's Bearer token. The HTTP client is
generated from the public OpenAPI spec (src/generated/pantrist-api.ts),
so request/response types track the API automatically; only the curated tool
layer (src/tools.ts) is hand-written.
| Transport | When | Auth |
|---|---|---|
stdio (src/stdio.ts) | Local PoC, single user, Claude Desktop | Bearer from PANTRIST_TOKEN env |
Streamable HTTP (src/http.ts) | Remote, multi-user, the Claude connector | Per-request Bearer, obtained by the client via OAuth |
If you just want to use Pantrist with Claude (not self-host), the public
endpoint is https://mcp.pantrist.app/mcp. Pick whichever Claude surface
you're on; in every case the first tool call walks you through an OAuth login
to your Pantrist account, no token to copy by hand.
Pantristhttps://mcp.pantrist.app/mcpIn the session, run /mcp to confirm it's listed. The first tool call triggers
the OAuth flow in your browser.
For Claude Desktop versions that support remote MCP, in
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
the equivalent on Windows/Linux:
Restart Claude Desktop. First tool use kicks off OAuth.
If all three succeed but the connector flow still fails, the API's
OAUTH_AUTHORIZE_URL probably isn't set to a browser-facing consent page —
see the warning in the OAuth dependency note.
You can validate the whole tool set in a couple of minutes without touching OAuth, using an API key you generate in the Pantrist web app.
claude_desktop_config.json (macOS:
~/Library/Application Support/Claude/claude_desktop_config.json):
Restart Claude Desktop, then try: "What's on my shopping list?" or "Add milk and eggs."
Then add it in Claude as a Custom Connector with URL
https://mcp.pantrist.app/mcp. The server also exposes GET /healthz for
probes. Full env reference, ingress, and scaling notes are in
docs/DEPLOYMENT.md.
The MCP server is the Resource Server; the Authorization Server is the Pantrist API. The token Claude receives is the API Bearer, so this server just forwards it.
⚠️ Dependency — the consent page. The API's
authorization_endpointmust be a browser-navigable login/consent page (the API's/access-token/authorizeis a guarded JSON endpoint and can't be navigated to directly). Host one on the app (e.g.https://pantrist.app/oauth/authorize) and set the API'sOAUTH_AUTHORIZE_URLenv to point at it. Until that page exists, use the stdio path above with a manually-supplied token.
| Tool | REST route |
|---|---|
list_lists | GET /list |
list_shopping_items | GET /list/{listId}/shoppingList |
add_shopping_item | POST /list/{listId}/shoppingList/add-by-name |
check_shopping_item | POST /list/{listId}/shoppingList/{itemId}/check |
delete_shopping_item | DELETE /list/{listId}/shoppingList/{itemId} |
list_pantry_items | GET /list/{listId}/pantryList |
add_pantry_item | POST /list/{listId}/pantryList/add-by-name |
reduce_pantry_amount | PUT /list/{listId}/pantryList/{itemId}/change-amount |
update_pantry_item | GET + PUT /list/{listId}/pantryList/{itemId} (metadata-only; stock changes go through reduce_pantry_amount) |
search_recipes | POST /recipe/filter |
get_recipe | GET /recipe/{recipeId} |
delete_recipe | DELETE /recipe/{recipeId} |
get_week_plan | GET /list/{listId}/weekPlan?from=&to= |
update_week_plan_day | PUT /list/{listId}/weekPlan/{date} |
Most tools accept an optional listId; if omitted they use PANTRIST_LIST_ID
in stdio mode only (HTTP mode requires it explicitly — see
multi-user isolation). Full
argument and item-shape details are in docs/TOOLS.md.
All of these are public API endpoints (present in /swagger-ui-json), so
this wrapper needs only the published spec — never the private API source. That
keeps the door open to open-sourcing this directory as its own repo.
Two steps, run when the API contract changes:
Both the spec snapshot (openapi/pantrist-openapi.json) and the generated
client (src/generated/pantrist-api.ts) are committed so the project builds
without network access. The tool layer in src/tools.ts is hand-authored and
not regenerated.
See .env.example.