- Point the client at
https://mcp.bizzyco.ai. - Sign in to Bizzy when the consent screen opens in your browser.
- Approve the consent screen, choosing which tool categories the client may use.
How the flow works
Discovery
The server publishes two host-derived metadata documents. A client discovers everything else from these.
You can fetch them directly:
401 response shape
A request to/mcp or /sse without a valid Bearer token returns HTTP 401
with a WWW-Authenticate header pointing back to a route-scoped
protected-resource metadata URL on the same host:
resource_metadata URL is
route-scoped (/mcp and /sse advertise their own metadata documents); a
host-level document is also available at /.well-known/oauth-protected-resource
for clients that prefer it.
Dynamic Client Registration
Clients register themselves atPOST /oauth/register per RFC 7591. Registration
is open (no admin approval required) but rate-limited to 10 requests per 60
seconds per IP, so clients should cache the returned client_id (and any
client_secret) and reuse it across launches rather than re-registering every
time. Prefer the OS credential store (Keychain on macOS, Credential Manager on
Windows, libsecret on Linux) over a plaintext file on disk, especially for
client_secret values.
PKCE
The server requires PKCE on every authorization request and only accepts theS256 code-challenge method. Plain PKCE is rejected — clients that send
code_challenge_method=plain will fail the authorize step.
Resource indicator
The server requires an RFC 8707resource parameter on every authorization
request, and its value must identify this MCP server (the same origin you
connect to, e.g. https://mcp.bizzyco.ai). This binds the issued access
token’s audience to Bizzy so it can’t be replayed against another server. An
authorize request that omits resource, or sends one pointing at a different
origin, is rejected with an Invalid resource error. Modern MCP clients derive
this from the server URL and send it automatically; custom clients must include
it.
Scopes
Two scopes are advertised:
During consent the user also chooses which tool categories the client may call.
The set of tools advertised over
tools/list is filtered against that selection
on every request.
Token lifetime
Access tokens are refreshed via
POST /oauth/token with
grant_type=refresh_token. Refresh tokens rotate on every use per OAuth 2.1.
The token endpoint is rate-limited to 10 requests per 60 seconds per IP;
cache the access token for its lifetime rather than re-exchanging on every call.
Rate limits
Two limits apply to authenticated traffic, and they surface differently.Tool calls: your plan’s per-minute limit
Everytools/call spends one request from your account’s MCP allowance:
The limit is also the burst capacity: you can spend your full per-minute
allowance at once, and it replenishes continuously over the following minute.
MCP and API allowances are independent — heavy API traffic never consumes your
MCP capacity. See Understanding Limits for how
rate limits fit into your plan.
A throttled tool call is not an HTTP error. The request succeeds at the
transport level and the throttle is reported in the JSON-RPC envelope, so
clients must inspect the response body rather than the status code alone:
data.retryAfter seconds before retrying that call. Other methods
(tools/list, ping, and the rest of the protocol) do not spend from this
allowance.
Transport: per-(user, client) backstop
Independently,/mcp and /sse accept at most 600 requests per 60 seconds
per (user, client) as an abuse backstop. Its ceiling sits above every plan’s
tool-call limit, so ordinary use never reaches it. A throttled request here is
HTTP 429 with the same JSON-RPC error body and a Retry-After header.
The server does not emit X-RateLimit-* headers on either surface.