- Point the client at
https://mcp.bizzyco.ai/mcp. - Sign in to Bizzy when the consent screen opens in your browser.
- Choose an agent on the consent screen and review its allowed tools before approving the connection.
How the flow works
Discovery
The server publishes two metadata documents. A client discovers everything else from these.
You can fetch them directly:
401 response shape
A request to/mcp without a valid Bearer token returns HTTP 401 with a
WWW-Authenticate header pointing back to the protected-resource metadata URL
on the same host and naming the scope to request:
/.well-known/oauth-protected-resource for clients that
prefer it.
When a working connection starts returning 401
A token is bound to one agent at consent time. If that agent is later deleted, deactivated, or moved to another organization, the token stops working and every request returns a 401 that names the reason:When a disabled account is refused
If your Bizzy account is disabled, the server stops serving your connection. A new connection is refused with HTTP403 and no WWW-Authenticate header:
tools/call and on every other method
except ping:
When the business agreement isn’t accepted
The consent screen offers only businesses whose owner or admin has accepted the business agreement. If none of your businesses has, the consent screen shows Business agreement not accepted instead. An existing connection is refused the same way while its business still has to accept, including after a new version needs accepting:Client registration
Client ID Metadata Documents
Use anhttps:// URL as your client_id. The URL must have a path and serve a
JSON document whose client_id is that exact URL, with client_name and
redirect_uris (the redirect URI you send on /oauth/authorize must be listed
there). No registration step is needed, the same client_id works with every
server that supports this, and the consent screen shows your document’s domain
so users can tell who is asking.
Dynamic Client Registration
The MCP specification deprecates RFC 7591 registration but keeps it for clients that cannot host a metadata document. Register atPOST /oauth/register. Registration is open (no admin approval required) but
rate-limited to 10 requests per 60 seconds per IP, so 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
Send the RFC 8707resource parameter on every authorization and token
request with the value https://mcp.bizzyco.ai/mcp — exactly the value in the
protected-resource metadata, path included. This binds the issued access token
to Bizzy so it can’t be replayed against another server. A request naming any
other resource is refused with invalid_target, sent back to your redirect URI
with your state. Modern MCP clients read the value from the metadata and send
it automatically; custom clients must include it.
The redirect back to your client carries an iss parameter (RFC 9207).
Compare it with the issuer from the authorization-server metadata before
exchanging the code.
Scopes
Two scopes are advertised:
Choose an agent during consent. Its current resource permissions determine
which supported tools the client can use. Only
allow actions are available;
ask and deny actions are unavailable because MCP cannot request chat approval.
Change the agent’s resource permissions
to change the connection’s access. Changes apply on the next MCP request,
including within an existing connection. A request already in progress keeps
its starting permissions.
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 accepts 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.
Reference
- MCP authorization spec (2026-07-28)
- OAuth Client ID Metadata Documents
- RFC 9728 — OAuth 2.0 Protected Resource Metadata
- RFC 8414 — OAuth 2.0 Authorization Server Metadata
- RFC 8707 — Resource Indicators for OAuth 2.0
- RFC 9207 — OAuth 2.0 Authorization Server Issuer Identification
- RFC 7591 — Dynamic Client Registration