Overview
MCP (Model Context Protocol) is the open standard that lets AI assistants (Claude, IDEs, agents) use tools and data from external systems safely. Conversa Labs ships native MCP, and you operate all of it from screens — no integration code required.
There are three surfaces:
- Account MCP connections (access profiles) — instead of a single account-wide setting, you create N named profiles. The static Bearer connection for each profile has its own module selection, read-only mode, an acting user (an account member) and its own URL + bearer secret. That static connection operates as the profile's acting user and can only narrow what that user may already do. When native OAuth is enabled by the installation, the same profile also has a separate OAuth URL: its tools remain profile-bounded, but each call operates as the account member who approved that OAuth grant — never as the profile's static acting user.
- Maestro MCP server — exposes Maestro departments as
ask_<department>tools to external clients, under a per-account token. The client never gains more autonomy than the department is already configured for. - Robot as an MCP client — every robot can consume external MCP servers (Linear, Notion, Stripe, GitHub, an internal ERP) as extra tools, under the same approval (HITL), tool-budget and audit rules as any other capability.
The static account connection and the Maestro server use the standard Authorization: Bearer <credential>
header. The examples below configure that static Bearer path: on the account connection the credential
is the profile secret; on the Maestro server it is the Maestro token. They are configuration
examples, not proof that every product or version has been validated against this installation. Native
account OAuth is a separate, conditional resource with discovery, PKCE and browser consent; do not point
an OAuth-capable client at the static URL or assume a client supports this flow before testing it.
Connector branding
During MCP initialization with protocol 2025-11-25, the server sends the installation name and title,
description, website, and brand icons (a primary icon plus light/dark variants). OAuth login and consent
screens use the same identity; if the configured image cannot load, they show the installation initials.
This metadata is published only when the installation has a safe canonical public HTTPS origin. Without
one, the server omits URLs and icons rather than expose an internal or untrusted address.
The client decides whether and how to render these fields. Clients that negotiate an older MCP version still receive the technical server name, but that protocol cannot carry icons. In Claude's Custom Connector, use the name entered in its setup: the UI can continue to show that name until it uses the server metadata. Appearance never changes scopes, consent, or credentials.
The Account, Platform and Super Admin endpoints build this safe snapshot for every MCP initialization.
After a White Label or canonical issuer change, the same versioned snapshot is queued for the direct
Maestro endpoint; its next authenticated request uses the newest persisted valid snapshot. A temporary
Maestro outage never rolls back the saved branding: the scheduled reconciler retries it. If a provider
already created a connector, disconnect and add the server again to force a new initialize request —
this does not rotate a token or change permissions. The icon URL must be a first-party asset on that
canonical origin, publicly fetchable over HTTPS without a login; an external CDN or another host is not
published as MCP brand metadata. A third-party client can cache the icon or elect not to render MCP icon
metadata; the server cannot override that client-side behavior.
Prerequisites
- The MCP feature enabled for the account. Without the flag, the Settings → MCP page simply does not appear in the menu (and the installation's global switch must be on as well).
- An account administrator profile to manage MCP connections (the page and creating/editing profiles are admin-only).
- For the account connection: no personal token. Each profile (MCP connection) generates its own bearer secret at create/rotate time — that is the client's credential. The profile's acting user must be an account member. Robot (AgentBot) tokens and the personal API token are not the account connection's credential.
- For the optional native account OAuth connection: the installation owner must enable native MCP OAuth, apply this release's MCP OAuth database migrations, and configure a valid public HTTPS issuer, in addition to the account MCP feature and global server gate. A feature switch does not replace the schema migration or prove the flow. OAuth has a different URL from the static profile connection; the static profile secret never authenticates it. The person approving the browser consent must be an active member of that account.
- The issuer hostname must resolve and route through the public gateway to this same installation. It must serve the MCP OAuth endpoints and their Protected Resource and authorization-server discovery documents; a syntactically valid HTTPS address that routes elsewhere is not sufficient.
- Before adopting native OAuth in a third-party client, run its discovery, PKCE and consent flow in a controlled environment. A standards-based endpoint is not evidence that a particular client product, desktop app or hosted AI surface supports the required flow.
- For the Maestro server: Maestro provisioned for the account. Without it, the Maestro card is replaced by a hint.
- To connect an external MCP server via OAuth: the robot already saved, and the browser allowed to open pop-ups (the provider's consent screen opens in a window).
Step by step
1. Open the MCP page
Go to Settings → MCP. The screen shows the Account MCP connections card (the access profiles) and the Maestro MCP server card.
2. Create an MCP connection (access profile)
On the Account MCP connections card, click New profile. Each profile is an independent connection:
-
Name the profile (for example
claude-code-supportorbi-read-only) — it helps you tell which client uses which connection. -
Choose the acting user — an account member. The profile runs as that user: the effective tool list is the intersection of your selection with the Super Admin ceiling and with that user's permissions. In other words, a profile only narrows — it never grants more than the user already has. Only routes rooted at
/api/v{N}/accounts/{account}belong to this server: personal profile, MFA, session and notification routes stay outside the account connection even when that user belongs to other accounts. -
Pick the modules to expose. It is the same picker as always: the whole platform (100+ modules), organized into collapsible areas — Conversations & support, Contacts & CRM, Catalog & commerce, Payments, Tasks & calendar, WhatsApp, Channels & integrations, Automation & AI, Growth & sales, Reports, Team & administration, and Content. Use the search to find a module by name or description, and an area's Select all to turn the whole area on at once. Every row says what the module does and how many tools it adds (the price of the checkbox); the summary under the search adds up the current selection and warns you when it goes past the tool cap — which still applies per profile:
A few examples (the full list is on screen, by area):
Example module What it exposes Conversations read, reply, change status, assign, apply labels (on by default) Contacts look up, create and update contacts (on by default) Reports metrics and analytics (read-only) Tasks native tasks module CRM Items deals and pipeline Help Center knowledge base articles Catalog products Follow-up follow-up cadences Media Library media assets Toolsets that are on out of the box carry the default badge. If the Super Admin did not allow a toolset in the global ceiling, the row is shown disabled with a blocked by super admin badge — you cannot check it.
Above the list there are starting-point shortcuts: Essential, Support, Sales and Everything. They only add modules to the current selection — nothing is removed, and no module disappears from the list because a shortcut does not mention it. Use one to start and adjust by hand; modules blocked by the ceiling stay out, as always.
-
Read-only mode: tick the checkbox for the profile to expose only tools that read data (no create, update or delete).
-
ChatGPT deep research compatibility (optional): ChatGPT's deep research connector requires, by name, two tools called
searchandfetch, and refuses a server that lacks them. Tick the box only on the profiles that connector uses. The two tools only describe what the profile already exposes — they grant no extra access — but they take up room in every other client's tool list. Leave it off for Claude, Claude Code and generic clients. -
Save the profile. At that moment the bearer secret is shown in plaintext exactly once (shape
mcp_...) — copy it immediately. Only the hash and last four characters are stored; the platform never shows the secret again. -
Copy the connection URL. Its shape is
https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/c/PUBLIC_ID, wherePUBLIC_IDis a non-secret identifier (a slug in the URL) — the bearer secret is what authenticates, not the URL. This is the static Bearer URL.
If the installation has enabled native MCP OAuth, the same profile has a different exact resource URL:
https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/oauth/c/PUBLIC_ID. Do not replace mcp/c with this
path in an existing static client and do not paste the profile secret into it. The profile still selects
the tool surface, but OAuth calls run as the account member who approves consent.
Afterwards, each profile has, on the card, Edit (change name, acting user, modules and read-only mode), Rotate token (generates a new secret and invalidates the previous one right away) and Delete. Disabling or deleting the profile — or the acting user losing account membership — makes the connection stop responding (401/404).
3. Configure the Maestro MCP server
- On the Maestro MCP server card, look at the status: Token configured or No token yet.
- Click Generate token (or Rotate token if one already exists).
- The token plaintext is shown exactly once — copy it immediately. It is never displayed again. Rotating invalidates the previous token right away.
- Copy the Maestro endpoint URL (it ends in
/mcp). - An external client with that URL + token sees one
ask_<department>tool per active department of the account.
If Maestro is not configured for the account, the card is replaced by a hint — provision Maestro first.
4. Connect a real MCP client with a static Bearer
This section configures only the static Bearer connection: choose Streamable HTTP, the profile's
static URL from step 2 (or Maestro's URL from step 3), and the credential in the
Authorization: Bearer ... header. For the account connection that credential is the profile secret
(the mcp_... revealed when you create or rotate the profile); for Maestro it is the Maestro token.
Client configuration formats change independently of this documentation, so validate the exact client
version in a controlled environment. None of the following snippets configures the native OAuth flow.
Claude Code — from the terminal:
claude mcp add --transport http helpdesk \
https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/c/PUBLIC_ID \
--header "Authorization: Bearer PROFILE_SECRET"
Or in the project's .mcp.json:
{
"mcpServers": {
"helpdesk": {
"type": "http",
"url": "https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/c/PUBLIC_ID",
"headers": { "Authorization": "Bearer PROFILE_SECRET" }
}
}
}
Cursor — in ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"helpdesk": {
"url": "https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/c/PUBLIC_ID",
"headers": { "Authorization": "Bearer PROFILE_SECRET" }
}
}
}
VS Code (agent mode) — in .vscode/mcp.json:
{
"servers": {
"helpdesk": {
"type": "http",
"url": "https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/c/PUBLIC_ID",
"headers": { "Authorization": "Bearer PROFILE_SECRET" }
}
}
}
MCP Inspector — to debug the connection and see the raw tool list:
npx @modelcontextprotocol/inspector
In the panel: Transport Type = Streamable HTTP, URL = the connection URL, and under
Authentication enter the Bearer Token — the profile secret for the account connection, or the
Maestro token for the Maestro server (or an Authorization header whose value is
Bearer <credential>). Click Connect, then List Tools.
Windsurf — same idea: a remote server with the connection URL and headers carrying
Authorization: Bearer PROFILE_SECRET (or the Maestro token).
In all of them the client runs initialize, then tools/list (lists the exposed tools) and finally
tools/call to run one of them. If the client shows fewer tools than expected, that is the display
cap: use search_tools to find any other tool (it returns its input schema) and call_tool to
run it. Nothing is unreachable — it is merely unlisted.
4a. Connect the native account OAuth resource (conditional)
This is a separate connection path, available only when native MCP OAuth is enabled for the installation and the account MCP feature/profile are available. It is not a setting that converts the static Bearer connection, and it is not a fallback for a lost profile secret.
- Configure the client with the exact OAuth resource URL:
https://YOUR-DOMAIN/api/v1/accounts/ACCOUNT_ID/mcp/oauth/c/PUBLIC_ID. - Start with that resource's Protected Resource Metadata, not a guessed host URL:
https://YOUR-DOMAIN/.well-known/oauth-protected-resource/mcp/oauth/accounts/ACCOUNT_ID/connections/PUBLIC_ID. It advertises the canonical authorization server only while the feature is available. - Discover the authorization server at
https://YOUR-DOMAIN/.well-known/oauth-authorization-server/oauth/mcp(or use the issuer advertised by the resource metadata). The server supports the public Authorization Code flow with mandatory S256 PKCE, exact resource binding and no client secret. Its discovery metadata declaresauthorization_response_iss_parameter_supported: validate the canonical issuer returned in theissparameter on successful and redirectable error callbacks. The signed browser handoff accepts at most 1,024 combined bytes across its persisted authorization values (includingclient_id,redirect_uri,resource, andstate). Keepstateshort and opaque; do not try to extend the flow with oversized URLs or state values. - A public client can use verified public Client ID Metadata (CIMD). Dynamic Client Registration (DCR)
is conditional and off by default: it appears in discovery only after a Super Admin enables
Dynamic Client Registration in MCP Settings. When off, discovery omits
registration_endpointand registration returns 404 — that is not an OAuth failure. When on, the operator reviews the client in MCP OAuth clients and can disable it; confirmed disablement with a reason and reauthentication is irreversible and revokes the consent/token family. DCR remains a governed test path, not a promise of vendor compatibility. Never send a profile secret, personal API token, Super Admin credential or a client secret to this flow. - In the browser, when an active dashboard session or Super Admin Console session belongs to a member of the target account, the
server validates and reuses it: you go directly to consent review without entering the password again.
Approval remains mandatory. A Super Admin identity enters this flow only when it also has account
membership, and the grant/token remains limited to the account, profile, and scopes — no global
authority is inherited. If the session is missing, expired, invalid, or belongs to another account, the
manual form appears and requires a valid member identity.
mcp:readis the read scope; write tools also requiremcp:writeand a profile that is not read-only.offline_accessexplicitly requests a rotating refresh token. - In Settings → Profile → MCP connections, a member can review and revoke their own approved connections. An account administrator can review all account grants and must select a closed reason when revoking through the administrator flow. Revocation invalidates the connected credential family.
4b. Verify the public resource before connecting an OAuth client
Before opening Claude.ai, Claude Code, or another remote client, an operator can verify the public contract without supplying any credential:
ruby scripts/mcp_oauth_preflight.rb \
--base-url https://YOUR-DOMAIN \
--account-id ACCOUNT_ID \
--profile-public-id PUBLIC_ID
For the separate Super Admin authority, use:
ruby scripts/mcp_oauth_preflight.rb \
--base-url https://YOUR-DOMAIN \
--super-admin
The verifier accepts only a public HTTPS DNS origin (it rejects IP literals and internal hosts), does not
follow redirects, and checks exact Protected
Resource Metadata, issuer and audience, discovery, Client ID Metadata (CIMD), PKCE S256, the iss
response parameter, scopes, and the 401 challenge from a Bearer-free JSON-RPC tools/list. When
discovery advertises DCR, it also checks the exact endpoint; explicit absence because the gate is off is a
valid state. Proceed to the controlled test only when it finishes with RESULT: PASS. On a failure,
fix the publication before connecting any client. That result confirms server publication; it does not
prove a third-party provider is compatible.
It does not register a client, open consent, exchange/revoke a token, or change a profile, grant, or
credential. The remote installation can append its normal secret-free audit telemetry for discovery and
the 401 challenge; that is observability, not an OAuth client created by the verifier.
Claude.ai — Custom Connector
After an operator enables MCP OAuth and Settings → MCP shows the profile's OAuth connection address, use the Claude connector area for your plan:
Use this as a controlled test for the Claude version available to your organization. Do not offer the connection to other people until discovery, consent,
tools/list, one read, and a successful revocation have been recorded.
Claude's remote connector reaches the server from Claude's cloud infrastructure, including when you use Claude Desktop. The issuer must therefore be public HTTPS and reachable outside a VPN/private network; being reachable only from your own browser is not enough. Remote custom connectors are available in Claude, Cowork, and Claude Desktop on Free, Pro, Max, Team, and Enterprise plans; Free is limited to one custom connector. Also review the current Claude remote-connector guide.
- On Team/Enterprise, an Owner or Primary Owner goes to Organization settings → Connectors → Add → Custom → Web and registers the remote MCP URL. Each member then goes to Customize → Connectors and chooses Connect. On Free/Pro/Max, use Customize → Connectors → + → Add custom connector in your own account (Free allows one connector).
- Give it a clear name, such as
Conversa Labs — Support, and paste the OAuth connection address into Remote MCP URL. Do not use the static Bearer URL. - Advanced settings are optional. On this public-client server, never fill Client Secret or use a Bearer token, profile secret, or Super Admin credential in either field. If the Claude version requires DCR, enable it explicitly through Super Admin first; otherwise it must use CIMD or an already provisioned client.
- Add the connector, sign in as an active member of the account, and read/approve consent. Claude acts as that person, limited by the profile, that person's own roles, and the scopes.
The callback is controlled by the client and is registration information, not a URL you manually replace on the MCP resource. Record the Claude version and the callback actually received during the test; do not put tokens, codes, or callback parameters in evidence.
To disconnect, revoke the grant in Settings → Profile → MCP connections (or, as an administrator, from the same account view). Do not rotate a static bearer token: that is a separate connection type and does not disconnect Claude OAuth.
Do not label a third-party product as compatible merely because it has an MCP or OAuth option. Validate the exact product, version, redirect handling and consent result end to end before enabling it for users.
External connector matrix — controlled test
Every row below is unvalidated on this installation. The matrix explains how to prepare a safe attempt;
it does not claim vendor support. Always begin with mcp:read, initialize, tools/list, and one read
against test data. Test a write only after explicit authorization.
| Client | External prerequisites | Controlled-test steps | Revocation | Status |
|---|---|---|---|---|
| Claude.ai — Custom Connector | Claude plan with custom connectors (Free: one); on Team/Enterprise an Owner/Primary Owner registers it first; public HTTPS issuer reachable from Claude's cloud and passing preflight | Use the exact OAuth URL, keep Advanced settings optional/secret-free, and complete browser/PKCE/consent | Revoke in Settings → Profile → MCP connections and confirm the next call fails | ⏳ unvalidated |
| Claude Desktop | Current Claude Desktop and an account with custom connectors; the server must also be reachable from Claude's cloud, not only the local machine | Configure only the exact OAuth URL and record version, OS, and callback/safe error | Revoke the same grant and test another call | ⏳ unvalidated |
| Codex | Organization/product is eligible for remote MCP and its current connection method is available | Add only the exact OAuth URL through the product's current flow; never use a Bearer secret as a client secret | Revoke the grant and confirm subsequent denial | ⏳ unvalidated |
| ChatGPT / GPT Platform | Eligible plan/workspace, administrator or Developer Mode when applicable, and explicit authorization for the test | Use the connector/app flow actually available, the exact OAuth URL, and browser consent | Revoke the grant and confirm subsequent denial | ⏳ unvalidated |
The Super Admin OAuth resource is a different authority plane and uses a different URL; never replace
the Account URL above with /super_admin/mcp/oauth. Follow the Operator article and run a separate test.
Record version, plan/entitlement, discovery outcome, consent, tools/list, read, audit event, revocation,
and the denied call — without copying tokens, codes, verifiers, or parameterized authorization URLs.
Claude Code: local authorization uses a loopback callback with an ephemeral port. The restricted RFC
8252 redirect policy for that callback already has a local matcher and HTTP test; a fixed
localhost/127.0.0.1 URL alone does not represent the real port. This is not compatibility proof: the
external E2E remains blocked until there is a public HTTPS issuer, Inspector, and evidence from the real
client.
5. Give a robot external MCP servers (the robot as a client)
- Go to Settings → Robots, open the robot and find the MCP servers section.
- Click Add server and fill in:
- Technical name — lowercase letters, numbers and
_, starting with a letter (2 to 33 characters), e.g.github. It prefixes that server's tools. - URL of the MCP server (the one the provider publishes).
- Transport: Streamable HTTP (recommended) or SSE (legacy).
- Timeout in seconds.
- Technical name — lowercase letters, numbers and
- Authentication: choose the type — none, bearer, header, query, basic or OAuth. On the types that use a secret, enter the secret name — never the value. The value stays in the secrets vault and is never sent to the model. The OAuth type has no secret field at all: the credential is obtained in step 6.
- Additional headers (optional): key/value pairs, only if the server requires them.
- Tick Require approval (HITL) so every call to this server's tools goes through human approval.
- Click Discover: the platform connects to the server right now and lists its tools before you save. Large servers (Linear, Notion) return dozens of tools with long descriptions — use the search and Select all / Clear to curate without scrolling the whole list; the counter shows how many you ticked. You may select a subset (allowlist) — if you select none, every tool of that server is available.
- Save the robot. Tools are discovered and stored at save time; the agent's turn never performs network discovery.
For discovery to resolve already-stored secrets, save the robot first, then click Discover.
6. Connect an external server via OAuth (the Connect button)
Some servers (Notion, for example) accept only OAuth — there is no static key. In those cases:
- On the robot's MCP server, choose Authentication → OAuth. The secret fields disappear — there is nothing to fill in.
- Save the robot (the connection is stored per robot + server name).
- Click Connect. A neutral authorization window opens immediately; keep it open. When the platform receives the provider address, that window navigates to the provider's consent screen in an isolated context — the provider cannot access the Studio tab. Sign in and authorize.
- The window closes itself when it is done and the status flips to Connected (with the expiry and the granted scope, when the provider reports them). If it remains open after the provider confirms, close it so the Studio can check the status. If the browser blocks the window, allow popups for this site and try again.
- Click Discover and carry on: the server's tools now apply to the robot.
- Disconnect forgets the credentials of that robot + server pair. To switch provider account: disconnect and connect again.
OAuth credentials are stored encrypted on Maestro, tied to the robot + server pair. They are never stored in Conversa Labs, never shown on screens or logs, and never sent to the model.
Settings & options
-
Profiles (MCP connections) for the account: each profile has a name, a static acting user, a toolset selection, read-only mode, its static URL (with a
public_id) and its own bearer secret (revealed once, rotatable). The static effective selection is alwaysselection ∩ Super Admin ceiling ∩ acting user's permissions. -
Native account OAuth (conditional): the OAuth resource is the separate
/mcp/oauth/c/PUBLIC_IDURL. It uses the same profile tool surface but the consenting account member, not the static acting user. Its grants are visible/revocable in Settings → Profile → MCP connections; existing grants remain visible for revocation if the server is later disabled. -
Read-only mode: per profile, exposes only read tools.
-
ChatGPT deep research compatibility: per profile, adds the two tools
searchandfetchthat this connector requires by name. They only describe what the profile already exposes. They cost two slots of the tool limit (the server reserves four instead of two when it is on), so leave it off for Claude and generic clients. -
Tool cap: there is a per-server cap (512), applied per profile — it caps the listing, not the access. The
search_tools(discover, with the schema) andcall_tool(run it by name) meta-tools reach everything the profile enabled, still honouring read-only mode, the acting user's permissions and the Super Admin ceiling. -
Maestro token: one per account, revealed once, rotatable at any time.
-
External servers per robot: technical name, URL, transport, timeout, authentication, extra headers, approval (HITL) and a tool allowlist.
-
Authentication types (external server):
Type How it works When to use it none nothing is sent genuinely public servers (rare) bearer sends Authorization: Bearer <secret>the most common case — the secret holds the API key header sends a header whose name you choose, valued from the secret the provider uses its own scheme query sends the secret as a URL parameter legacy providers basic username + password (two secrets) internal servers OAuth Connect button → consent on the provider the provider only accepts OAuth (Notion) -
Tool budget: the tools of each external server count towards the robot's tool budget — too many servers blow the limit.
-
SSRF guard: private/internal addresses are blocked when adding an external server.
Use cases
- Operate the inbox from Claude Code or an IDE: list conversations, reply, resolve.
- One profile per client: each IDE, script or partner gets its own connection, with a minimal scope and — for read-only clients — read-only mode on.
- Pull the account's reports into an assistant through a read-only profile, run by a restricted acting user.
- Revoke a single client: rotate (or delete) that client's profile — every other profile keeps working.
- Give a robot access to an internal system (ERP, knowledge base) through an external MCP server, with human approval on sensitive actions.
- Let the robot open Linear issues or read a Notion base while it is handling a conversation.
- Let the data team ask
ask_risk/ask_financeand get the department's findings without opening the dashboard.
Tips, limits & best practices
-
Which authentication to pick per popular external server (most of them answer 401 with an OAuth challenge, yet also accept a plain API key in
Authorization: Bearer— leaving it on none is the number-one cause of a failed discovery):External MCP server Authentication to pick Linear bearer + secret holding the API key Stripe bearer + secret holding the restricted API key GitHub bearer + secret holding a personal access token (PAT) Atlassian (Jira/Confluence) bearer + secret holding the API token Sentry header named Authorization, with a secret whose value isSentry-Bearer YOUR_TOKENNotion OAuth (Connect button) — no static key accepted Your own internal server whatever the server requires -
Static secret versus OAuth consent: the static profile secret carries the static acting user's permissions — never more than they already have. A native OAuth grant instead runs as the consenting account member and is bound to its exact OAuth resource. Treat either value as a credential and never swap them between the two URLs.
-
One profile per client: that way you give each one a minimal scope and can rotate/delete a profile to cut off just that client, without touching the others.
-
Read-only first: start each profile with read-only mode on and enable writes per toolset as you trust the client.
-
Less is more: expose only the toolsets the client really uses — huge tool lists degrade the model's choices.
-
Copy the profile secret immediately: it is never shown again. Lost it? Rotate the profile's token (the old one is invalidated instantly) and update the client that used it.
-
Secrets by reference: on external MCP servers, never paste the secret value into the field — enter the secret's key.
-
Copy the Maestro token immediately: it is never shown again. Lost it? Rotate (and update the clients that used the old one).
-
Approval (HITL): for external servers that write to critical systems, tick Require approval.
Troubleshooting
- The client shows fewer tools than the modules I enabled in the profile: that is the server's
display cap. The rest stay reachable: have the client use
search_tools(finds the tool and returns its input schema) andcall_tool(runs it by name). To see them in the list, uncheck modules or ask the operator to raise the cap. - The Maestro card shows an internal address (amber warning): the installation never declared
Maestro's public address. A client on the same machine connects; an IDE outside the network does not.
The operator must set
MAESTRO_PUBLIC_BASE_URLto Maestro's public address (and restart the app). - The client connects to Maestro's public address and gets "Invalid Host header" (or a 421): Maestro
only accepts the Host the installation declared. It is the same
MAESTRO_PUBLIC_BASE_URL— once it is set, the public host is accepted (DNS-rebinding protection stays on). - A connector still shows an old or generic icon: confirm the canonical public HTTPS origin and icon
URL load without authentication, save the White Label settings, then reconnect the provider so it runs
initializeagain. The server preserves the last valid mark while Maestro retries a temporary outage; a provider may still cache or choose not to display its icon metadata. - The MCP page is not in the menu: the MCP feature is off for the account (ask the operator) or your user is not an administrator.
- 404 on the connection endpoint: the feature is off for the account, the installation's global
switch is disabled, or the URL's
PUBLIC_IDdoes not exist (the profile was deleted or disabled). - 401 on the account connection: the profile secret is wrong or was rotated (the previous one is invalidated instantly), the profile was deleted/disabled, or the acting user lost account membership. Use the secret revealed when you create/rotate the profile — a personal API token and a robot token are not this connection's credential.
- A static client tries to log in through OAuth: the static account URL ends in
/mcp/c/PUBLIC_IDand accepts only its profile secret inAuthorization: Bearer ...; it does not advertise an OAuth server. Keep that client on the static Bearer configuration. - The OAuth resource or discovery returns 404: native OAuth is intentionally dark-shipped. Check the native OAuth enablement, the account MCP feature/profile and the public issuer first, then begin again at the exact Protected Resource Metadata URL. Do not substitute a static secret or a different authority-plane token.
- The OAuth URL returns 401: the OAuth bearer is missing, expired, revoked, or belongs to a different
resource/authority plane. Read
WWW-Authenticate: it identifies the exact Protected Resource Metadata (and includesinvalid_tokenonly when a supplied Bearer was rejected). Restart from that metadata; never paste the profile's static secret into this URL. - The OAuth URL returns 403: the bearer is valid, but the call requested a write-capable tool without
mcp:write. Request that scope during consent and confirm that the profile is not read-only;mcp:writestill does not expose tools outside the profile. - The OAuth URL returns 413: the JSON-RPC request or response exceeds 1 MiB. Reduce the payload or paginate. An oversized request is rejected before execution; a large response is measured only after the operation returns, so do not blindly retry a write — inspect the resource or audit trail first.
- An OAuth-capable client still cannot complete consent: record the client and version, redirect URI, discovery result and safe error code in a controlled test. Do not bypass PKCE, resource binding or browser consent; compatibility is only established after an end-to-end proof.
- Toolset greyed out with a “blocked” badge: the Super Admin did not allow that toolset in the global ceiling. Only they can release it.
- Lost the profile secret: generate a new one with Rotate token on the profile — the previous one is invalidated instantly.
- Lost the Maestro token: generate a new one with Rotate token on the Maestro card — the previous one is invalidated instantly.
- Discovery (“Discover”) fails with 401: authentication is almost always still on none. Pick bearer and point the secret at the provider's API key (Sentry uses header; Notion uses OAuth).
- Discovery fails for another reason: check the URL, the transport (Streamable HTTP or SSE) and the credentials; save the robot first if auth uses a stored secret; private/internal addresses are refused by the SSRF guard.
- The Connect button opens nothing: the browser blocked the pop-up — allow pop-ups for the domain and click again.
- Connected, but the tool fails after a while: the provider's authorization expired — Disconnect and Connect again.
- An external tool fails at runtime: the error comes back as text to the agent (which self-corrects) and never crashes the turn.
ask_<department>answers “disabled”: the department is disabled for the account — enable it on the Account Brain screen.