
What MCP is
Model Context Protocol (MCP) is an open protocol for exposing tools, resources, and prompts from an external server to an LLM agent. OpenSail uses MCP to wire real third-party systems (Slack, Gmail, Google Drive, Linear, GitHub, Brave Search, Postgres, filesystems, and more) into any agent’s tool registry. From the agent’s perspective, MCP tools look identical to built-in tools. The agent callsslack__post_message or linear__create_issue exactly like it calls write_file. The protocol is open, so nothing in your stack is locked to Tesslate.
Real integrations
Slack, Gmail, Drive, Linear, GitHub, Brave, Postgres, filesystem, and more
Per-user credentials
You install a connector with your credentials, encrypted at rest with Fernet
Per-agent binding
Attach a connector to a specific agent or reuse across many
Open protocol
Standard MCP server; BYO server for internal tools
Architecture
OpenSail’s MCP layer has three pieces, all on the orchestrator side.- MCP client
- MCP bridge
- MCP manager
orchestrator/app/services/mcp/client.py opens a streamable-HTTP connection to an MCP server, initializes the session, and lists its tools, resources, and prompts. Streamable HTTP is the only supported transport (see “Why not stdio” below).Why streamable HTTP only
MCP defines two transports: stdio (child process per user per call) and streamable HTTP (stateless HTTP). OpenSail supports only streamable HTTP. Stdio was designed for single-user desktop apps. In a multi-tenant environment it requires Node.js on every orchestrator pod, spawns a process per call per user, and doesn’t scale horizontally. Streamable HTTP offloads load to the connector provider, works identically across replicas, and adds zero dependencies to the backend container. When adding a new MCP server to the seed catalog, verify the server publishes a streamable-HTTP endpoint. If it’s stdio-only, OpenSail cannot use it until the maintainer ships an HTTP transport.The user journey
Browse
Open the Marketplace and filter to MCP Servers. Each card shows the server name, the tools it exposes, the auth type (none, bearer), and any required credential fields.
Install
Click Install. The connector lands in your Library as a
UserMcpConfig. If the server requires credentials, you are prompted to enter them. Credentials are encrypted at rest with Fernet before being stored.Test
From the Library MCP card, click Test Connection. OpenSail opens a streamable-HTTP session to the server, lists capabilities, and returns tool/resource/prompt counts.
Attach to an agent
From the Library MCP card, click Add to Agent and pick from your agent list. This creates an
AgentMcpAssignment row linking the connector to the agent.Per-user limits apply: the
mcp_max_servers_per_user setting (default 20) caps how many connectors any one user can install. Enough for most workflows, prevents registry bloat.Real connectors
OpenSail’s marketplace ships or is adding official support for:Slack
Post messages, read channels, manage threads
Gmail
Read, send, label, draft, thread operations
Google Drive
List, search, read, write, and share files
Linear
Create and update issues, comments, projects, cycles
GitHub
Issues, PRs, files, commits, releases
Brave Search
Web search with privacy-first provider
Filesystem
Scoped filesystem access for local workflows
Postgres
Read-only or read-write SQL access
Context7
Library documentation and code examples
Managing connectors
Every connector is stored as aUserMcpConfig row for your user. Key operations:
| Operation | Where |
|---|---|
| Install | Marketplace detail page, click Install |
| Update credentials | Library MCP card, Credentials button |
| Test connection | Library MCP card, Test button |
| Re-discover capabilities | Library MCP card, Details panel, Refresh |
| Attach to agent | Library MCP card, Add to Agent dropdown |
| Detach from agent | Agent detail page, MCP tab, remove |
| Uninstall | Library MCP card, Uninstall (soft-delete) |
mcp_tool_cache_ttl seconds (default 300). When you rotate credentials or change enabled capabilities, the cache is automatically invalidated.
Attaching to an agent
Click Add
Pick from your installed connectors. Attachment is idempotent; re-adding a previously disabled assignment re-enables it.
Confirm the bridge
Open a chat with that agent. The session header shows a purple plug badge for each attached MCP. The tool list in the agent’s first turn includes prefixed tool names like
slack__post_message.Authoring your own connector
For internal tools, you can run your own MCP server and install it on OpenSail exactly like a marketplace connector.Implement MCP over streamable HTTP
Use the official MCP SDK (Python, TypeScript, or another language) and expose a streamable-HTTP endpoint. Stdio transport is not supported.
Declare auth type
Supported auth:
none or bearer. If bearer, your clients pass a token via the Authorization header.Host it
Run it anywhere reachable over HTTPS. You can run it inside an OpenSail project if you want it co-located.
OpenSail as an MCP server
OpenSail also exposes itself as an MCP server. External coding agents (Claude Code, Cursor, Codex, or your own) can connect to your OpenSail instance and get sandboxed compute, invoke your agents, and manipulate projects through a standard MCP interface. See the Gateway API section of the platform docs for details.Security
Credential encryption
Credential encryption
All MCP credentials are encrypted at rest using Fernet symmetric encryption. The encryption key is held server-side in
CHANNEL_ENCRYPTION_KEY. Credentials are decrypted only at call time and never logged.Per-user scoping
Per-user scoping
Every MCP install and attachment is scoped to your user. Other users (even on the same team) never see your credentials or your attachments.
Approval still applies
Approval still applies
MCP tools participate in the standard edit-mode gating. If you’re in Ask Before Edit, dangerous MCP tools still prompt for approval before execution.
Rotation and revocation
Rotation and revocation
Rotate credentials in the Library. Uninstall to soft-delete the config and invalidate the schema cache. Tokens can be revoked at the provider at any time; OpenSail will fail closed on the next call.
Troubleshooting
Agent doesn't see the connector tools
Agent doesn't see the connector tools
Check that the
AgentMcpAssignment exists and is enabled. Verify the chat is using the expected agent (worker logs show MCP context query: agent_id=...). Re-run Test Connection from the Library to force a fresh discovery.Connection refused or timeout
Connection refused or timeout
The MCP server is unreachable. Check the configured URL, the server’s uptime, and any network restrictions. Some servers rate-limit by user key; verify your credential is still valid.
Stdio MCP transport is not supported
Stdio MCP transport is not supported
This error means the connector’s config specified stdio. Only streamable HTTP is supported. If the connector’s maintainer doesn’t ship an HTTP endpoint, OpenSail cannot install it.
Tool call timed out
Tool call timed out
Default MCP tool timeout is 30 seconds (
mcp_tool_timeout). Some tools (large Drive searches, complex Postgres queries) need longer. The setting is orchestrator-wide; contact your admin if you’re self-hosting.Stale tool schemas
Stale tool schemas
Schemas are cached in Redis for 5 minutes by default. If a connector added new tools and the agent isn’t seeing them, run Re-discover from the Library card. This invalidates the cache and fetches fresh schemas.
Next steps
Customizing Agents
Bind connectors to custom agents
Skills
Pair connectors with skill playbooks for end-to-end workflows
API Keys
Manage external API keys for model BYOK and agent invocation
Using Agents
See MCP tool calls in the chat transcript