Composio:把 1000+ 应用工具、使用者授权与 MCP 接进 AI Agent
Composio:把 1000+ 应用工具、使用者授权与 MCP 接进 AI Agent
很多 AI Agent 示范在模型吐出第一个 tool call 时就结束了。但只要把它放进真实产品,问题很快会从「模型会不会呼叫工具」变成「这个使用者能不能安全地呼叫正确工具,而且下一轮对话还能延续同一个连线」。
我认为 Composio 值得看的地方,不只是它列出 1000+ 个可用 toolkit,而是它把工具发现、帐号连接、每位使用者的 session、agent framework 整合与实际执行,整理成一个可以被程式重复使用的边界。这让 Agent 不必把所有工具定义一次塞进 context,也不必由每个应用团队重新处理 OAuth 与 provider 格式。
本文以 GitHub 上的 Composio SDK monorepo 与官方文件为准,拆解它解决的问题、程式模型、上手方式,以及我认为导入前必须先厘清的限制。
先讲结论:Composio 的价值在「工具生命周期」
Composio 官方把自己定位成给 AI agents 使用的工具与连接层,提供 1000+ 个预先整合的 toolkits、每位使用者的 sessions、authentication、triggers 与 sandbox。开源 repo 本身则是 SDK monorepo,包含 TypeScript SDK、Python SDK、Composio CLI,以及面向 OpenAI Agents、Claude Agent SDK、Vercel AI SDK、LangChain 等框架的 provider adapters。
这个定位和单纯的 API wrapper 不同。API wrapper 通常只处理「如何送出请求」;Composio 还要处理「工具从哪里找到」、「用哪个使用者身分连线」、「怎么把工具转成目前 agent framework 看得懂的格式」,以及「如何在后续回合重用同一个 session」。
因此,它最适合的不是一次性的函式呼叫,而是需要让 Agent 代表不同使用者操作外部服务的产品:例如整理某位使用者的信件、更新 CRM、建立工作项目,或把一个多步骤流程交给 Agent 执行。
它把哪几件容易失控的事放在一起?
工具发现:不要把数百个 schema 全塞进 context
官方 quickstart 说明,session 预设会取得用来 discovery、authentication 与 execution 的 meta tools。换句话说,Agent 可以在执行期间搜寻需要的应用工具,而不是在每次 prompt 一开始就携带一大包工具定义。
这个设计有两个直接效果。第一,context 不会因为整合数量增加而线性膨胀。第二,工具选择可以变成一个明确的执行步骤:先找工具,再确认连线状态,最后执行。这不代表模型永远会选对工具,却让应用程式有机会在每个阶段加上限制、记录与人工确认。
身分与 session:把「谁在操作」变成显式参数
Composio 的 quickstart 以 user_123 建立 session,并强调每个 session 会以你的使用者为范围。你可以保存 session.session_id,在下一轮透过 composio.use() 重用它,也可以在建立 session 时限制可用的 toolkits、auth configs 与 connected accounts。
这是导入企业流程时很重要的抽象。若把 OAuth token、工具清单与对话历史全部散落在应用程式各处,权限边界很容易变成隐含规则;把 session 当成边界,至少能让「使用者识别」、「连线状态」与「可用工具范围」进入同一个设计讨论。
但「预先整合」不等于「使用者已授权」。正式产品仍需要设计登入、连接帐号、重新授权、撤销权限与错误回报流程;Composio 负责提供这些能力的接点,产品仍要决定何时要求使用者确认。
Provider adapters:让工具进入既有 Agent framework
repo 内的 provider adapters 对应多种框架。TypeScript 有 OpenAI、OpenAI Agents、Anthropic、Claude Agent SDK、Vercel、Google、LangChain、LlamaIndex、Mastra、Cloudflare 等整合;Python 也提供 OpenAI Agents、Anthropic、Google、LangChain、LangGraph、LlamaIndex、CrewAI 与 AutoGen 等套件。
这些 adapter 的价值不是新增一个模型,而是把 Composio session 产出的工具转成框架原生格式。团队可以保留既有的 Agent runner、prompt 与 tracing 方式,只替换工具取得与连接层。若框架不在清单中,官方文件也提供 custom provider 的方向;另一条路则是直接使用 MCP。
实作模型:Session → Tools → Agent
用最小模型看,流程可以拆成三步:
1. 以你的使用者识别建立 Composio session。
2. 从 session 取得工具,交给 agent framework。
3. 由 Agent 根据自然语言意图选择工具,Composio 处理对应的连线与执行。
TypeScript 的官方 quickstart 以 OpenAI Agents 为例:
import { Composio } from "@composio/core";
import { OpenAIAgentsProvider } from "@composio/openai-agents";
import { Agent, run } from "@openai/agents";
const composio = new Composio({ provider: new OpenAIAgentsProvider() });
const session = await composio.create("user_123");
const tools = await session.tools();
const agent = new Agent({
name: "Personal Assistant",
instructions: "Use Composio tools to take action.",
tools,
});
const result = await run(agent, "Summarize my emails from today");
console.log(result.finalOutput);
这段程式最值得注意的不是 run,而是 session.tools()。工具不是全域常数,而是从一个使用者范围的 session 产生。当你的产品开始支援多租户时,这个差异会直接影响授权与快取设计。
Python 的概念相同,官方范例使用 composio、composio-openai-agents 与 openai-agents:
from composio import Composio
from composio_openai_agents import OpenAIAgentsProvider
from agents import Agent, Runner
composio = Composio(provider=OpenAIAgentsProvider())
session = composio.create(user_id="user_123")
tools = session.tools()
agent = Agent(
name="Personal Assistant",
instructions="Use Composio tools to take action.",
tools=tools,
)
result = Runner.run_sync(
starting_agent=agent,
input="Summarize my emails from today",
)
print(result.final_output)
真正上线前,我会在这个最小流程外再加三层:对高风险动作要求确认、在 server 端记录 tool call 与回应摘要,以及对每个使用者保存可撤销的连线状态。不要因为 demo 只有一个 user_123 就把它当成全域 API key。
三种接入方式:SDK、CLI 与 MCP
SDK:适合应用程式内的细致控制
TypeScript 与 Python SDK 都适合放进后端服务。你可以在建立 session 时处理使用者范围,再按产品需求限制 toolkits 或 connected accounts。若应用已经选定 Agent framework,provider adapter 能减少自行转换 tool schema 的程式码。
SDK 路线的代价是你必须自己设计 session ID 的保存、并发控制、重试、审计纪录与 UI。Composio 提供能力边界,不会自动替你决定哪些外部动作必须二次确认。
CLI:把外部工具带给 coding agent
repo README 将 composio CLI 定位成 shell 里的工具面,提供 search、execute、link 与 run 等命令。官方安装入口是:
curl -fsSL https://composio.dev/install | sh
composio login
composio search
这条路径对 coding agent 特别有吸引力:Agent 可以先搜寻工具,再透过 CLI 执行或连接帐号。不过把能改动外部系统的 CLI 暴露给自动化 Agent 时,我会把 shell 权限、可用帐号与审计纪录分开管理,并为破坏性动作设定明确的 allowlist。
MCP:把 session 暴露成标准工具端点
官方 README 指出,每个 session 也能提供 hosted MCP endpoint;建立 session 时传入 mcp: true,再把 session.mcp.url 提供给 Claude、Cursor 或其他 MCP client。这让 Composio 的连线与授权逻辑,能和支援 MCP 的客户端分离。
MCP 的好处是整合面清楚:client 不必理解每一个应用的 OAuth 细节,只需要连到 session endpoint。代价则是你要更仔细处理 endpoint 的生命周期、权限、来源验证与撤销;MCP 不是把安全问题消失,而是把工具边界搬到协定层。
我会怎么评估它,而不是只看 toolkit 数量?
先看「你的 Agent 是否真的需要跨应用动作」
如果产品只是读取一个内部资料库,自己写一个狭窄的 typed client 可能更容易测试与控权。Composio 的价值会在整合数量、使用者授权与 Agent framework 变成主要成本时放大。
再看权限是否能被限制与观测
官方文件提供限制 toolkits、auth configs 与 connected accounts 的方向,但落地时仍要确认每个动作的权限模型、错误格式与回应资料是否符合你的要求。我会把下列项目列入验收:
- 不同使用者建立的 session 是否真的隔离。
- 工具 discovery 是否只返回产品允许的范围。
- 授权失效时,Agent 是否能得到可理解且不泄漏敏感资料的错误。
- 写入、寄送、删除等动作是否有额外确认。
- 每次 tool call 是否有 request ID、使用者与 session 的可追溯纪录。
最后才看开发体验
Composio repo 的 layout 把 TypeScript workspace、Python SDK、provider packages、CLI 与文件放在同一个 monorepo。这对想同时维护两种语言的团队很方便,也意味着升级时要留意 SDK、provider adapter 与 CLI 的版本配合。README 建议以 mise 管理 pinned toolchain,并以 pnpm 执行 build 与 test;Python 部分则从 python/ 目录操作。
常见限制:它不是 Agent 的完整答案
第一,工具数量不等于任务成功率。模型仍可能选错工具、填错参数,或在需要多步骤确认时过早执行。你仍然需要 schema 验证、重试策略、人工审核与 domain-specific guardrails。
第二,授权流程是产品工作,不是一次设定。你需要决定连接帐号的 UI、token 过期后的处理、使用者撤销权限后如何让 session 失效,以及企业客户如何稽核操作。
第三,外部服务本身会改变。第三方 API 的配额、栏位、权限与错误格式都可能更新;在 production 不能只测「模型最后说了什么」,还要测实际 tool call、外部副作用与回滚方式。
第四,Composio 的快速上手依赖 API key 与官方 dashboard。这使它更像一个开源 SDK 加上托管连线服务,而不是完全离线、只靠本机套件就能完成所有整合的工具。若你的部署要求所有凭证与执行都留在内网,应先确认架构与合规边界。
适合谁先试?
我会建议以下团队做一个小型 spike:
- 已有 Agent,但卡在多个 SaaS OAuth 与工具 schema 维护。
- 需要让每位使用者以自己的帐号操作外部服务。
- 同时支援 TypeScript/Python,或正在比较 provider adapter 与 MCP。
- 想把工具 discovery 与实际执行拆成可观测的流程。
第一个 spike 不要从「让 Agent 控制所有应用」开始。选一个低风险、可回放的任务,例如列出今日信件摘要;完成登入、session 保存、tool call 记录与失败重试后,再加入写入型动作。
相反地,如果需求只有单一 API、完全不需要每位使用者的授权,或部署环境不能接受托管连线服务,那么直接维护一个小型 typed integration,通常更容易保持可预测。
结语:把 Agent 从「会回答」推进到「能负责任地行动」
Composio 的核心贡献不是替模型增加一个神奇按钮,而是把 Agent 行动时会遇到的几个边界集中起来:工具怎么找、使用者是谁、连线怎么保存、框架怎么接,以及 MCP 如何对外暴露。
我会把它理解成一个工具生命周期层,而不是单纯的工具目录。当你的产品开始面对多使用者、多框架与多个外部应用时,这种抽象可以缩短第一个可运作版本的距离;但在正式导入前,仍要用权限隔离、审计、失败处理与资料边界验证它,而不是只用 GitHub stars 或 toolkit 数量做决策。
参考资料