MCP (Model Context Protocol) is the standard the Engine uses to talk to external tool providers. Each “connector” is an MCP server — locally or remotely hosted — that exposes a set of actions to the agent. Slack, Gmail, Notion, Linear, GitHub: anything with an MCP server can be connected. This page covers what MCP looks like to your application, how to connect a server, and how the resulting tools behave.Documentation Index
Fetch the complete documentation index at: https://septemberai.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
The model’s view
Once connected, MCP actions appear in the agent’s tool catalog like any other tool:slack.send_messagegmail.read_threadlinear.create_issuegithub.create_pr
Lifecycle of a connection
For static-credential servers (API key instead of OAuth), step 3 returns “connected” immediately and you skip steps 4–6.Listing servers
Initiating a connection
auth_url. After they grant access, the provider
redirects to <OAUTH_REDIRECT_BASE_URL>/assets/oauth/callback, which
completes the flow.
For static-credential servers:
Listing connections
Disconnecting
MCP_CONNECTION_FAILED.
What MCP actions look like to the model
Each action surfaces as a tool with the server’s prefix in the name:Credentials
MCP credentials live inconnections.credentials, encrypted at rest
with Fernet using AD_ENCRYPTION_KEY. They’re only decrypted when the
Engine makes an outbound call to the MCP server. They never appear in:
- The prompt to the LLM.
- The SSE stream.
- The Engine’s logs.
ENGINE_LOG_LEVEL=DEBUG, you’ll see MCP request/response
traces, but the credentials are still redacted.
Refresh and circuit breaker
OAuth tokens expire. The refresh scheduler (asset_directory/refresh_scheduler.py) refreshes them in the
background before they expire. If refresh fails (the user revoked
access, the provider’s API changed), the connection moves to expired
and tool calls error with MCP_TOKEN_EXPIRED.
The circuit breaker (asset_directory/circuit_breaker.py) tracks
failure rates per connection. If a connection fails repeatedly, the
breaker opens and rejects subsequent calls for a cooldown period. This
prevents one broken connector from generating runaway error traffic.
Per-user vs. per-tenant
Each Engine instance is single-user, so its connections are per-user by definition. The MCP credentials in this Engine’s brain belong to this user. Multi-user setups run multiple Engines, each with its own brain and its own connection set.Adding a new MCP server type
To add a server the Engine doesn’t know about yet:- Add a JSON entry to the catalog with the server’s metadata (name, transport, auth method, OAuth config).
- If the server is custom (you wrote it), point the Engine at its transport endpoint.
- Hot-reload with
POST /admin/reload-catalog. - The new server appears in
GET /assets/servers.
<OAUTH_REDIRECT_BASE_URL>/assets/oauth/callback) in the provider’s
OAuth app settings.
Pitfalls
- OAuth callback URL mismatch. If
OAUTH_REDIRECT_BASE_URLdoesn’t match what’s registered with the provider, the OAuth flow fails with aredirect_uri_mismatcherror. - Encryption key rotation. Rotating
AD_ENCRYPTION_KEYwithout a re-encrypt step invalidates every stored credential. Plan rotation with a migration. - Scope drift. A connection grants specific scopes. If the agent needs a scope the connection doesn’t have, the MCP call fails. Keep scopes in mind when defining the agent’s expected workflow.
- Server-side rate limits. MCP servers (especially Slack, Gmail) have their own rate limits. The circuit breaker mitigates the worst cases but doesn’t eliminate them. Design for retry.
See also
- Asset Directory endpoints — full API surface for MCP management.
- Permissions — how MCP calls interact with the permission system.
- Threat model — what we defend against in MCP integrations.

