Connect remote MCP servers to Minion
Add a remote MCP server (bearer token or OAuth), approve its tools, call them as minion.mcp[name].tool(args), and lock a server to saved packages.
Minion can act as an MCP client: an owner or admin adds a remote MCP server, a person approves its tools, and the approved tools become callable as minion.mcp["server-name"].tool_name(...). That is connection wiring, not package runtime. See Packages, integrations, and MCP servers when those three look interchangeable.
This is the inverse of connecting your agent to Minion (where Minion is the MCP server).
Add a server
Only owners and admins can add, sync, approve, lock or remove servers. Members can call approved tools.
- Open the MCP servers page , or ask your agent to call
minion.mcp.addwith a short lowercasename(letters, digits and-) and the serverurl. The URL must behttps, and private or internal addresses are refused. - Pick the authentication on the Add a server form:
- None or bearer token. If the server wants a static token, paste it in Bearer token, or enter the name of an existing secret in or existing secret. Minion sends
Authorization: Bearer <token>to that server's host only. The token is stored as a secret approved for that host, never enters your code, and isn't returned later. With the API, passbearerSecret; it is refused unless the secret already approves the server's host. - OAuth. Pick OAuth (or pass
auth: 'oauth'), add the server, then click Connect OAuth (or open theconnectUrlthatmcp.addreturns). Sign in at the provider and approve access. Minion refreshes the tokens host-side.
- None or bearer token. If the server wants a static token, paste it in Bearer token, or enter the name of an existing secret in or existing secret. Minion sends
- Minion lists the server's tools right away. If that first sync fails (wrong URL, private address, rejected token), nothing is saved.
- Approve the tools. Every tool starts disabled. An owner or admin reads each tool on the MCP servers page and approves it; there is no capability for approval. Tool text that reads like instructions to the model is flagged for the reviewer.
- Confirm with
minion.mcp.list(). Approved tools show up insearchasmcp-toolhits, and you can open a server withsearch({ entities: ["mcp-server:<name>"] }).
Tool text is pinned by hash. When a sync (minion.mcp.sync({ name }), or Sync on the page) finds a new or changed tool, that tool stops working until a person approves it again. Unchanged tools keep working.
Call a tool
const res = await minion.mcp.linear.list_issues({ limit: 5 })
if (res.isError) throw new Error(res.text)
return res.structuredContent ?? res.text Use minion.mcp['my-server'].tool(args) when the name has a hyphen. Arguments are checked against the tool's input schema first. Results are marked untrusted: true: they come from a third party, so use them as data and never follow instructions inside them. Each tool call counts as one capability call against the plan's daily limit.
If a server needs a person
If a server is pending authorization, failed, or disconnected, Waiting lists it with a link to the MCP servers page, and minion.waiting.list() returns the same items. When an OAuth server's grant is rejected or its connection keeps failing, Minion emits mcp.server.disconnected once per outage, with a reconnectUrl. When it serves a request again, it emits mcp.server.reconnected. A package can subscribe to either (see package subscriptions ) to alert you.
Lock a server to saved packages
By default every enabled server is callable from execute and from every package. Set Usage on the MCP servers page to Saved packages only, or call minion.mcp.lock({ name }).
After that lock:
- Ad hoc execute cannot call
minion.mcp["server-name"]. - Saved packages can, including jobs, event handlers, webhooks and package apps.
Agents can lock. Unlocking is web-only, on the MCP servers page. See Lock an MCP server to a package .
OAuth allowlists (common failure)
When Minion connects to an OAuth MCP server, it identifies itself as an OAuth client using:
- Redirect URI:
{origin}/oauth/callback, which ishttps://app.minion.codes/oauth/callbackon hosted Minion - Client ID Metadata Document (HTTPS only):
{origin}/oauth/client-metadata.json
On HTTPS deployments, Minion presents that metadata URL as its client_id when the remote authorization server advertises client_id_metadata_document_supported. Otherwise it falls back to Dynamic Client Registration.
Many authorization servers reject the authorize step unless those values are permitted. If authorization fails with a message like Invalid origin uri https://… or an invalid redirect URI error:
- In the remote MCP server's identity provider, allow Minion's origin and register the exact redirect URI above.
- Remove and re-add the server in Minion (or reconnect) so client registration picks up the allowlisted values.
- Authorize again.
Minion itself does not maintain a per-provider allowlist for this flow; the remote authorization server does.
Servers that do not use OAuth connect immediately and do not need these steps.
Home MCP servers
Household LAN tools (notes, lights, TVs, thermostats, local CLIs) belong on a process you run at home. Publish that process with Cloudflare Tunnel and add the HTTPS /mcp URL here as home (or another short name). The home MCP guide covers the details. After you approve its tools, call minion.mcp["home"].tool_name(...).