workspaceId is your workspace UUID, from Settings → Workspace. Anything
that is not a well-formed UUID returns 404.
This endpoint is unauthenticated. There is no key. The only credential is
the workspace id in the URL, and CORS is
*.That is safe because the endpoint is read-only and guide-only — it cannot
change anything, and it exposes only the capabilities you have explicitly
marked agent-accessible. It is not private: treat the URL as public, because
anyone you give it to can share it.It is rate limited per workspace and per source IP for exactly this reason —
every call runs a multi-read query, so an unbounded caller would otherwise
hammer your data for free.GET — discovery card
A small card for humans and directories.POST — JSON-RPC
initialize
listChanged: false — the tool list does not push updates. Clients should
re-list rather than wait for a notification.
tools/list
These annotations describe the capability, not this endpoint. No tool call
here executes anything, whatever its annotations say — they exist so a
client can present the guidance with the right weight.
tools/call
-32602 Unknown tool: {name}; a missing name
returns -32602 Invalid params: missing tool name.
Batching
202 with no body.
Errors
MCP clients expect protocol errors as200 responses with a JSON-RPC error
member, and that is what Peeve returns — with two exceptions noted below.
Rate limiting is a real
429 with a retry-after header on purpose, so a
client backs off properly instead of retrying into the wall.
A
-32001 does not distinguish “no such workspace” from “not entitled” —
both look the same from outside. If you are debugging, check in order: the
workspace id is a valid UUID; the plan is Growth or above; the agent channel
is enabled; the kill switch is off.Rate limits
Bucketed per workspace and per hashed source IP — there is no key bucket, because there is no key. Ceilings follow your plan; see Rate limits. The limiter runs before the capability projection, so a shed request costs nothing. Like every limiter in Peeve it fails open: if the limiter itself is unavailable, requests are allowed rather than blocked.A friendly hostname
The endpoint is advertised asmcp.peeve.ai/{workspaceId}, which rewrites to
this route. Both work; use whichever you prefer when handing the URL to someone.