Permission inheritance
When a client connects, the user signs in to Coverbase through OAuth 2.0 and authorizes the connection. From that point on, every tool the assistant calls is evaluated against that user’s live organization membership. The connector is a delegate, not a privileged service account. Three properties follow from this design:No privilege escalation
Single source of truth
Org isolation
Role-to-access matrix
Coverbase organization roles map to MCP access as follows.- Read access (search vendors, pull assessment detail, list findings, run portfolio reports, and so on) is available to every role that can connect.
- Write access (creating or updating vendors, assessments, findings, obligations, notes, tags, and other records) is reserved for Members and Admins.
- Auxiliary Members cannot use the MCP server at all, and receive a
403if a token for one is ever presented. - Service Accounts are non-interactive by design, so they cannot sign in through OAuth or a dashboard session; those paths still return
403. They can hold an API key, which is what makes a programmatic read-only connection possible without a human seat. A service account can never write through MCP.
How a request is authorized
Every request flows through the same gate, regardless of which client or token type it uses. There is no path that skips role resolution.Authenticate the token
Authorization: Bearer header: an OAuth 2.0 access token issued to a remote MCP client, a dashboard SSO session token, or a long-lived Coverbase-issued MCP API key. Anything else is rejected with 401.Resolve the live role
Enforce the connect allowlist
403 before any tool runs.Enforce per-tool access
Scope to the organization
Write protection
Read-only versus read/write is not a single switch: a write tool only executes when three independent conditions are all satisfied. Any one of them failing returns a clear, non-destructive error instead of performing the change.Role check (least privilege)
Scope check
mcp:write scope. An API key minted read-only, or an OAuth token issued without it, produces a strictly read-only connection even for a user whose role would otherwise allow writes. (See Scopes.)Explicit confirmation (human-in-the-loop)
confirm=true argument. Without it, the tool returns a precondition error rather than executing, so the assistant is forced to surface the proposed change to you and wait for your approval before anything is written.Scopes
The server defines two scopes:mcp:read. Whether it also carries mcp:write is fixed when the credential is issued:
- API keys store their scopes on the key itself. Tick Read-only when you generate one under Configuration → MCP Server and the key never carries
mcp:write, not now and not if the owner is promoted to Admin later. The key list shows the grant on each key. - OAuth tokens are issued with both scopes by default. The authorization endpoint also accepts a narrower
scoperequest, so a client can ask formcp:readalone.
mutate tool is hidden from such a connection: it does not appear in the client’s tool list, and mcp_capabilities reports no mutations. The assistant never proposes a change it cannot make, so you are never asked to confirm a write that was going to fail.Programmatic read-only access
The common case is a pipeline, a scheduled report, or an internal assistant that should read Coverbase and never change it. You do not need a human seat for this.Generate the key as an admin
Choose what the key acts as
Store the key
Authorization: Bearer cb_mcp_... from your client. See Connecting clients.- Mint the API key read-only.
- Bind the key to a service account or another user, which forces read-only.
- Connect with a Guest or Siloed Member account; their role blocks writes regardless of scope.
Live revalidation
Because permissions are resolved from live membership, changes you make in Coverbase propagate without any re-install or token re-issuance on the user’s side.- API-key and session tokens look up the user’s membership on every request. If the user has been removed from the organization, the request is rejected with
403, even if the token itself is still otherwise valid. A key’s scopes do not follow the role: a read-only key stays read-only through any promotion, which is what makes it safe to hand to an automation. - OAuth tokens bind the role at authorization time and re-check live membership on every refresh. A user who is demoted (for example, Member → Guest) or removed from the organization cannot keep using a previously elevated token: the next refresh either downgrades the role baked into the new token or fails outright. Access tokens are short-lived and clients refresh silently, so a role change converges quickly.
What this means in practice
A Guest connects and asks the assistant to update a vendor
A Guest connects and asks the assistant to update a vendor
A Member connects and asks the assistant to create a finding
A Member connects and asks the assistant to create a finding
mcp:write. The assistant proposes the new finding and waits. Once you confirm, it re-runs the tool with confirm=true and the finding is created, and the action is recorded in the audit trail.An admin demotes a user to Guest while their session is live
An admin demotes a user to Guest while their session is live
A user is removed from the organization
A user is removed from the organization
403 because there is no active membership to resolve a role from. The connection effectively stops working immediately.Auditability
Every tool call, read or write, is logged with the connected identity, the tool name, the parameters, a timestamp, and the outcome. Write actions taken through the MCP server land in the same Coverbase audit trail as actions taken in the dashboard, so administrators have one consolidated record of who did what, regardless of whether it happened through the UI or an assistant.Attributing a key that acts as a service account
A reasonable question about any non-human credential: if it changes something, whose name is on it? For MCP keys the answer is that it cannot change anything. A key bound to a service account or to another user is read-only, and a service account is additionally excluded from the write-capable roles. A bound key never produces a write in your audit trail, so there is no such thing as a change you cannot trace to a person. Only a key that acts as you can write, and those entries carry your name exactly as if you had made the change in the dashboard. What you can still see for a bound key:Who provisioned it
What it read, and when
ak_ key’s id and name alongside the shared identity. Per-key attribution on individual MCP tool calls is not available today.