Sign-in, permissions, and limits
How MCP clients sign in to Bucky, the permissions (scopes) they can ask for, rate limits, plan usage, and the errors they can return.
How sign-in works
MCP clients sign in with OAuth 2.1 in your browser. You never paste a password or a token into the assistant.
- The client calls a tool that needs an account.
- Bucky answers
401with aWWW-Authenticateheader, which starts sign-in. - Your browser opens a Bucky page that names the app and lists the permissions it is asking for. Sign in and approve.
- The client receives tokens and refreshes them itself.
For client developers, Bucky supports:
- PKCE with
S256; - dynamic client registration and client ID metadata documents;
- refresh tokens and token revocation.
Metadata lives at:
https://buckybuild.com/.well-known/oauth-protected-resource/api/mcphttps://buckybuild.com/.well-known/oauth-authorization-server
Don't hide signed-in tools until a token exists. tools/list always returns every tool;
calling a signed-in tool is what starts sign-in.
Permissions (scopes)
| Scope | What it allows (as shown on the approval page) |
|---|---|
mcp:read | Read your projects, site analyses, and zoning results |
mcp:write | Create and update projects, attach parcels, and run new analyses |
mcp:export | Export report PDFs, which spends your export credits |
mcp | All three |
A client that asks for no scope gets mcp. Unknown scopes are ignored rather than
rejected. Export is separate because it is the only permission that uses a plan
allowance. Each tool's scope is listed in MCP tools.
Manage and revoke access
Connected apps are listed under Settings → Connections with their permissions and
when each was last used. Revoking takes effect on the app's next request. From a
terminal, bucky mcp connections list and bucky mcp connections revoke do the same
(CLI).
Bearer tokens
MCP clients get their tokens through OAuth, including scripts. Send the RFC 8707
resource parameter, https://buckybuild.com/api/mcp, on the authorize and token
requests. If the authorize request leaves it out, Bucky binds the MCP resource. Any
other value returns invalid_target.
- Access tokens start with
bmcp_at_and last 1 hour. - Refresh tokens start with
bmcp_rt_. Each refresh returns a new one, so keep only the newest. They stop working after 7 days unused, or 30 days after sign-in. - A used refresh token is a replay. Sending one again revokes every token for that connection, and the client must sign in again.
- They work only at
/api/mcp. Bucky's HTTP API refuses them.
Treat tokens as opaque; the prefixes are for recognition, not parsing. Connected clients move to these tokens at their next refresh, without reconnecting.
Don't paste a Bucky user access token as a bearer. /api/mcp still accepts one
during the transition, but that is deprecated and will end: Bucky will answer
401 invalid_token with the resource_metadata challenge. bucky auth login --copy-mcp
prints a URL-only configuration, and the MCP client signs in with OAuth itself. Agents
using /auth.md send the same resource. Keep tokens
out of shell history (for example, read them with read -s).
Developer API keys don't work on MCP. Keys starting with bk_live_ or bk_test_
are for the HTTP API only. Sent to /api/mcp, they are rejected like an
invalid token.
Plans and usage
- The MCP connector is included on every plan, including Free.
- Looking up a site (
getFeasibilitySnapshot) over MCP does not use site lookups. - Creating a project with
saveToProjectcounts toward your plan's project limit. - Exporting a report with
produceProjectReportuses one of your plan's exports. - Screening (
screenLots) and saved buy boxes don't use a plan allowance.
See Plans.
Rate limits
The tools that work without signing in are limited per IP address:
| Tool | Limit |
|---|---|
previewSiteCoverage | 20 requests per hour |
cityInventory | 30 requests per minute |
Over the limit, the call returns error -32011. Sign in for the full tools.
Errors
| Error | HTTP | Meaning |
|---|---|---|
-32010 | 401 | No token, or the token is invalid or expired. Sign in or refresh. |
-32011 | Rate limit reached on a tool that works without signing in. | |
-32012 | 402 | Your plan doesn't include this. |
-32602 | Invalid arguments. The message names the field. | |
-32602 | 403 | Signed in but not permitted, for example a suspended account. |
-32603 | Unexpected server error. Details are logged, not returned. | |
-32600 | 413 | Request body over 64 KiB. |
-32000 | 403 | The request's Origin isn't allowed. |
405 | GET or DELETE on the endpoint. Use POST. | |
406 | The Accept header must include application/json and text/event-stream. |
A tool that fails on its own terms (for example, an address it can't find) returns a
normal result with isError: true and an explanation, not a protocol error.
Origin
Requests with an Origin header must come from an allowed origin, which prevents DNS
rebinding. Requests with no Origin — the normal case for desktop and server MCP
clients — are allowed. To call Bucky's MCP server from a web page, contact us to allow
your origin.
Last updated on