Composio MCP Bridge
A remote MCP server that proxies tool calls to the caller's own Composio account, using their own API key for each request to access services like Gmail, Slack, and Google Sheets.
README
Composio MCP Bridge
A remote MCP (Model Context Protocol) server for Poke (or any MCP client) that proxies tool calls straight through to the caller's own Composio account — bring-your-own-key, not a shared quota.
Poke agent --(your Composio API key, every request)--> this server --(fresh Composio client)--> Composio --> Gmail/Slack/Sheets/etc
There is no "connect your account to us" step and no shared Composio project. Each person supplies their own Composio API key on every single request. The server builds a brand new Composio SDK client for that one request, uses it, and throws it away — nothing about the key is ever logged, cached, or written to disk.
Auth flow
- You sign up at composio.dev and grab an API key from Settings → API Keys. That's your own Composio account, your own quota, your own connected apps.
- When setting up the custom MCP integration in Poke, set the Server URL
to:
(Query param, because Poke's custom MCP integrations can't reliably send custom HTTP headers. If your MCP client can send headers,https://<your-deployment>/mcp?composio_api_key=YOUR_COMPOSIO_KEYAuthorization: Bearer <key>orx-composio-api-key: <key>both work too — checked in that order, header wins if both are present.) - From here on, every tool call this server makes runs against your
Composio account:
list_toolkits— see what apps Composio supports (Gmail, Slack, GitHub, Google Sheets, …).connect_toolkit— get a Composio Connect Link (a hosted Google/ Slack/etc sign-in URL) for a toolkit you haven't connected yet. Show that link in chat; once the user finishes sign-in, the connection lives in your Composio account.list_connections— see what's already connected.get_tools— list the exact Composio tool slugs available for a toolkit (and what arguments they expect).execute_tool— actually run one, e.g.tool_slug: "GMAIL_SEND_EMAIL". If the toolkit isn't connected yet, this automatically returns a fresh Connect Link instead of a raw error, so the agent can hand it straight to the user without a second round trip.
- Multiple people under one key (optional): pass an
x-composio-user-idheader oruser_idquery param to separate multiple end users inside the same Composio account/project. If you don't set one, everything uses a singledefaultuser id — the common case for one person automating their own accounts.
Why this shape
- No server-side secrets to steal. The server's own
.envhas zero Composio credentials in it — see.env.example. If this deployment were ever compromised, there's no shared master key sitting in it to leak. - True multi-tenant for free. Anyone with their own Composio key can point their own Poke integration at the same deployed URL and get their own isolated set of connections — no per-user database, no OAuth app registered under your name.
- Real MCP SDK, not hand-rolled JSON-RPC. Built on
@modelcontextprotocol/sdk'sStreamableHTTPServerTransportin stateless mode — a freshMcpServer+ transport per request, torn down right after. This means it correctly speaksinitialize,tools/list,tools/call, andpingper spec, instead of reimplementing the protocol by hand.
Security
- Never logged, cached, or persisted. The API key only ever exists in request-scoped memory, for the lifetime of the one call it arrived with.
- Format validation. Keys are checked against a safe length/charset pattern before ever being used, so obviously malformed input gets a clean 400 instead of hitting Composio.
- Rate limiting per key. An in-memory limiter keyed by a SHA-256
fingerprint of the API key (never the raw key itself) caps requests per
rolling minute (
RATE_LIMIT_PER_MINUTE, default 30). This is best-effort: fine on a single long-running process (Railway/Fly.io); on serverless platforms with multiple isolates (Vercel) each isolate keeps its own counters, so for a hard cross-instance guarantee swap this for a shared store like Upstash Redis. - HTTPS only in production. Requests arriving over plain HTTP (checked
via
x-forwarded-proto) get rejected with 400, unlessALLOW_INSECURE=truefor local testing. - Clean error messages, no stack traces. Bad/expired keys, 429s from
Composio, and unexpected failures are all mapped to short, safe messages —
see
src/errors.ts. Internal exceptions never reach the client verbatim.
Project layout
src/
server.ts entrypoint for standalone Express (Railway/Fly.io/local)
app.ts Express app: HTTPS check, key extraction, rate limit, MCP endpoint
tools.ts the 5 MCP tools, all proxying to the per-request Composio client
composio.ts creates a fresh Composio SDK client per request
keyAuth.ts pulls the API key + optional user id off the request
security.ts key fingerprinting, log scrubbing, rate limiter
errors.ts maps Composio/axios errors to clean user-facing messages
api/mcp.ts Vercel serverless adapter (reuses src/app.ts)
Deploying
Railway or Fly.io (standalone Express)
npm install
npm run build
npm start # or let the platform run `npm run build && npm start`
A Dockerfile and fly.toml are included for Fly.io (fly launch, fly deploy).
Railway auto-detects Node from package.json, no extra config needed.
Your MCP endpoint will be: https://<your-app-domain>/mcp
Vercel
npm i -g vercel
vercel
vercel --prod
vercel.json rewrites /mcp → /api/mcp, so the endpoint is still just:
https://<your-vercel-domain>/mcp
Environment variables
See .env.example. There are no per-user secrets here — only server
behavior config:
| Var | Purpose |
|---|---|
PORT |
Port for the standalone server (ignored on Vercel) |
NODE_ENV |
Set to production to enable the HTTPS-only check |
RATE_LIMIT_PER_MINUTE |
Max requests per key per rolling minute (default 30) |
ALLOW_INSECURE |
Set true only for local HTTP testing |
A note on tool slugs
execute_tool and get_tools pass exact Composio tool slugs straight
through (e.g. GOOGLESHEETS_BATCH_GET, GMAIL_SEND_EMAIL). Always call
get_tools for a toolkit first to confirm the current slug names and
expected arguments — Composio's own catalog is the source of truth, and
slugs occasionally get renamed as toolkits evolve.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。