Endpoint

MCP endpoint
URLhttps://mcp.mutualtrust.io/mcp
TransportStreamable HTTP
AuthorizationOAuth 2.1 (authorization code with PKCE), provided by the Cloudflare Workers OAuth provider, with consent in the Mutual Trust portal

How authorization works

  1. Your MCP client discovers the server’s OAuth metadata and registers itself, then opens the authorization page in your browser.
  2. You sign in to app.mutualtrust.io and see a consent screen naming the client. Choose one organization and the roles to delegate. Only roles you hold in that organization are offered.
  3. On approval the portal mints a dedicated API credential (purpose: "mcp", named “MCP: <client>”, valid 30 days) and hands it once to the MCP server through a single-use code that expires after 2 minutes. If the handoff is not completed in time, the credential is revoked automatically.
  4. The MCP server completes the OAuth flow with your client. The client only ever holds OAuth tokens for the MCP server; the MCP server calls the Mutual Trust API with the scoped credential.

Every action is therefore limited to that organization and to the delegated roles intersected with your current roles, and is recorded in the audit log as you (via the credential). Removing a role from you removes it from the MCP connection too.

Tools

MCP tools
ToolWhat it doesAPINeeds
get_overviewSummary of organizations, services, relationships and alerts.GET /v1/overviewAny role
list_servicesServices in the organization with gateway and grant counts.GET /v1/overviewAny role
get_serviceOne service: gateways, current policy revision, readiness.GET /v1/services/{id}Any role
list_grantsGrants on a service (sponsor) or held by the organization (partner).GET /v1/grantsgrant.read
get_grantGrant detail, workload principal and certificates.GET /v1/grants/{id}grant.read
list_receiptsRecent verification receipts for a service.GET /v1/services/{id}/receiptsgrant.read
create_invitationInvite a partner to a scope within the service’s templates. Returns the one-time accept link.POST /v1/services/{id}/invitationsservice_owner or trust_admin
suspend_grantSuspend a grant with a reason code.POST /v1/grants/{id}/suspendservice_owner or trust_admin
resume_grantResume a suspended grant.POST /v1/grants/{id}/resumeservice_owner or trust_admin
revoke_grantWithdraw a grant permanently with a reason code.POST /v1/grants/{id}/revokeservice_owner or trust_admin
get_operationPer-gateway progress of a change.GET /v1/operations/{id}Any role
list_integrationsAdapter integrations of an organization.GET /v1/integrationsintegration.read
list_integration_plansPlans submitted by mt-adapt, with state and redacted diff.GET /v1/integrations/{id}/plansintegration.read
get_integration_planOne plan: changes, diff, test vectors, decision. Approving stays in the portal.GET /v1/integrations/{id}/plans/{plan_hash}integration.read
list_integration_runsRun timeline with outcomes and verification categories.GET /v1/integrations/{id}/runsintegration.read
get_integration_evidenceLatest result for each of the eight acceptance categories.GET /v1/integrations/{id}/evidenceintegration.read

Destructive tools

Suspending and withdrawing access take effect at your gateways within seconds, and withdrawal cannot be undone. Delegate service_owner only to clients you trust, and keep your client’s confirmation prompts for write tools enabled. For read-only use, delegate auditor.

API data is returned as untrusted data

Names, plan diffs, inspected configuration and run output can contain text written by customers, partners or their platforms. Every tool returns API data only inside one <untrusted_data> block (JSON with <, > and & escaped), and the summary line holds only ids, counts and states. Tool descriptions and server instructions never contain API data. Treat the block as data, never as instructions.

Each tool maps to one API operation; the underlying behaviour is documented in the API reference, and tool changes are listed in the changelog.

Migration tools and agent runs

An agent can work on a connection workspace only inside an agent run that a person creates in the portal for one MCP connection. The run fixes the workspace, the side the agent acts for, the mode, the tools, and an expiry. The server checks every call against the run; nothing an agent reads (evidence, plans, earlier tool output) can widen what it may do. Without a run, the connection reaches no workspace (agent_run_required). The agent finds its runs with agent_runs.list.

Agent run modes
ModeThe agent mayLongest run
ObserveRead, explain and preview (assessment and plan drafts that store nothing). Every write is refused.30 days
Supervised (default)Record evidence, plans, approval requests and test results; start, cut over and roll back only with approvals that name its run. It waits at each approval gate it raises.7 days
DelegatedAs supervised, and use a standing organization approval for the actions the person preauthorized: execution.start, rollback. Trust anchors, resource authorization and cutover always need an approval naming the run.24 hours
  • Agents never approve. People with the permission kind approve with a passkey or identity-provider sign-in (step-up). The person who delegated a run cannot approve what it asks for.
  • Approvals are bound to plan hash, action, target, actor (agent_run:<id>), expiry and environment, and checked again when used. A replayed single-use approval, another plan hash or another actor is refused.
  • Retries are safe. Every mutating tool sends an Idempotency-Key. When the agent does not pass idempotency_key, one is derived from the call, so repeating the same call returns the first result.
  • Pause, resume, cancel. The delegator, the side’s requesters or the resource owner pause a run immediately; a person resumes it (with step-up). Cancelling can also revoke the MCP credential. Neither reverses changes that already committed: use rollback.
  • Every call is recorded in the run’s action log (allowed, refused or failed), and every change carries the run, the agent identity and you in the audit log. Calls are limited to 120 per minute per run (30 that change something).
Migration tools
ToolWhat it doesAPIRun mode
connections.inspectThe workspace of the run in your side’s view: status, plan, execution, approvals, approval requests, certificates, telemetry coverage.GET /v1/workspaces/{id}Every mode
connections.assessAssess discovery evidence for the workspace endpoint. Preview by default (stores nothing); store: true records it.POST /v1/workspaces/{id}/assessments[/preview]Preview: every mode. Store: supervised, delegated
connections.diagnostics.readEvidence your side may see, newest first, paginated with cursor.GET /v1/workspaces/{id}/diagnosticsEvery mode
migrations.plan.createDraft the next immutable plan version. Preview by default; store: true records it and invalidates approvals of earlier versions.POST /v1/workspaces/{id}/plans[/preview]Preview: every mode. Store: supervised, delegated
migrations.plan.getOne plan version: plain-language summary, technical changes per party, steps, tests, rollback, plan_hash, approvals.GET /v1/plans/{id}Every mode
migrations.approvals.requestAsk people for the approvals the next action needs. Grants nothing; a supervised run waits until they are decided.POST /v1/plans/{id}/approval-requestsSupervised, delegated
migrations.tasks.delegateCreate a discovery task for an engineer. The claim link goes to the person who delegated the run, never to the agent.POST /v1/workspaces/{id}/tasksSupervised, delegated
migrations.execute.prepareCheck every required approval exactly as starting, cutover and rollback would check it for this run, and the next step. Changes nothing.GET /v1/plans/{id}/readinessEvery mode
migrations.execute.applyStart the durable execution of the approved plan version.POST /v1/plans/{id}/executionsSupervised, delegated; approvals
migrations.validateRead the validation state, or record positive and negative test results for the step the execution waits on.GET /v1/executions/{id}, POST /v1/executions/{id}/evidenceRead: every mode. Record: supervised, delegated
migrations.cutover.requestRequest cutover after validation passed.POST /v1/executions/{id}/cutoverSupervised, delegated; approval naming the run
migrations.rollback.requestRequest rollback; irreversible steps are reported, never undone.POST /v1/executions/{id}/rollbackSupervised, delegated; approval
migrations.handover.exportThe signed, immutable handover report for your side.GET /v1/workspaces/{id}/handoverSupervised, delegated
agent_runs.list, agent_runs.getThe runs people created for this connection, and the state of one (works in every state).GET /v1/agent-runs[/{id}]Any run
agent_runs.pause, agent_runs.completeStop yourself (only a person resumes), or end the run when done.POST /v1/agent-runs/{id}/pause|completeAny live run

Each migration tool takes agent_run_id, declares an output schema (data_trust, tool, tool_version, data) and, on failure, returns error.code with a category (authentication, authorization, agent_policy, agent_run_state, approval_required, not_found, conflict, invalid_request, rate_limited, unavailable) and retryable. The role checks of the API still apply: the run narrows what the connection’s roles allow, never widens it.

Add to Claude

Claude (web and desktop)

Open Settings → Connectors, choose Add custom connector, enter https://mcp.mutualtrust.io/mcp and connect. Claude opens the Mutual Trust consent page; pick the organization and roles.

Claude Code

Add the server to Claude Code
claude mcp add --transport http mutualtrust https://mcp.mutualtrust.io/mcp

Then run /mcp in Claude Code and choose Authenticate for mutualtrust.

Other MCP clients

Any client that supports remote MCP servers over Streamable HTTP with OAuth can connect. Many clients accept a JSON entry like this (check your client’s documentation for the exact file and keys):

Generic client configuration
{ "mcpServers": { "mutualtrust": { "type": "http", "url": "https://mcp.mutualtrust.io/mcp" } } }

Review and revoke access

  • In the portal, Organization → API credentials lists MCP connections as “MCP: <client>” with purpose: mcp, creator, expiry and last use.
  • Revoke one there, or with POST /v1/organizations/{id}/api-credentials/{cid}/revoke. The next tool call fails with 401.
  • Connections expire after 30 days; reconnect from the client to approve a new one.