news 2026/9/12 3:30:04

Composio MCP 示例实战:基于 Streamable HTTP 与 Vercel AI SDK 构建可调用工具的 Agent

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Composio MCP 示例实战:基于 Streamable HTTP 与 Vercel AI SDK 构建可调用工具的 Agent

Composio MCP 示例实战:基于 Streamable HTTP 与 Vercel AI SDK 构建可调用工具的 Agent

【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio

本篇技术指南以 ts/examples/mcp 中的 MCP 示例为骨架,完整演示如何用 Composio TypeScript SDK 创建 MCP 配置、为指定用户生成 MCP Server 实例,并通过@ai-sdk/mcp的 Streamable HTTP 传输把工具接入 Vercel AI SDK 的streamText流程。读完本文,你将掌握composio.mcp.create/composio.mcp.generate的完整调用链、环境变量的正确配置方式,以及如何把 Composio 托管的 Gmail 等工具无缝注入任意 AI SDK Agent。

示例概览:一次完整的 MCP 接入闭环

该示例的核心价值在于展示了「创建 MCP 配置 → 生成用户级 Server → 通过 HTTP 传输拉起工具 → 交给 Agent 执行」的全链路:

  • 初始化 Composio SDK,并绑定VercelProvider(位于 ts/packages/providers/vercel/src/index.ts,用于将 Composio 工具包装为 Vercel AI SDK 的ToolSet);
  • 调用composio.mcp.create创建一个仅包含 Gmail 工具包的 MCP 配置;
  • 调用composio.mcp.generate为指定用户生成带用户上下文的 MCP Server 实例;
  • @modelcontextprotocol/sdkStreamableHTTPClientTransport建立连接,并用@ai-sdk/mcpcreateMCPClient拉取工具;
  • 最终把这些工具直接传给streamText,让gpt-4o-mini自主调用「获取最新 2 封邮件并总结」的任务。

完整可运行代码见 ts/examples/mcp/src/index.ts,依赖与脚本声明见 ts/examples/mcp/package.json。

环境准备与运行

1. 安装依赖

示例目录是一个独立的私有 workspace 包(包名为mcp-example),在ts/examples/mcp目录下执行:

pnpm install

若从仓库根目录 ts 出发,也可以一次性安装所有示例的依赖:

cd ts pnpm install

2. 配置环境变量

README 建议复制环境变量模板并编辑:

cp .env.example .env

从示例源码可以确认,实际读取的环境变量有以下三个(缺失时会直接throw并提示):

环境变量作用是否必填
COMPOSIO_API_KEYComposio API 密钥,从 Composio Dashboard 获取
COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID已创建的 Gmail Auth Config ID,用于声明工具包使用的认证配置是(本示例)
COMPOSIO_EXAMPLES_USER_ID你数据库中的外部用户 ID,用于生成该用户的 MCP Server 实例是(本示例)

说明:COMPOSIO_EXAMPLES_*系列变量是整个示例体系的统一约定(详见 ts/examples/README.md),示例会「大声失败」——缺失变量时直接报错并点名缺失项。若你的环境中没有.env.example模板文件,直接手动 export 上述变量即可。

3. 运行示例

# 运行示例 pnpm start # 开发模式(带文件监听自动重启) pnpm dev

从 package.json 的 scripts 可以看到,start实际执行的是bun src/index.tsdev执行的是bun --watch src/index.ts,即运行环境是 Bun。若从仓库根目录运行,可改用:

pnpm --filter mcp-example start

逐步拆解核心代码

第一步:初始化 Composio 与 Provider

import { Composio } from '@composio/core'; import { VercelProvider } from '@composio/vercel'; const composio = new Composio({ apiKey: process.env.COMPOSIO_API_KEY, provider: new VercelProvider(), });

VercelProvider继承自BaseAgenticProvider(见 ts/packages/providers/vercel/src/index.ts),负责把 Composio 的工具包装成 Vercel AI SDK 可识别的ToolSet,并统一处理 JSON Schema 规范化(如toStrictJsonSchemadereferenceJsonSchemanormalizeToolArguments等)。

第二步:声明认证配置与允许的工具

const authConfigId = process.env.COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID; const externalUserId = process.env.COMPOSIO_EXAMPLES_USER_ID; if (!authConfigId || !externalUserId) { throw new Error('Set COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID and COMPOSIO_EXAMPLES_USER_ID'); } const allowedTools = ['GMAIL_FETCH_EMAILS'];

这里先做环境变量守卫,再通过allowedTools白名单把 Agent 的能力收敛到单个工具,最小化权限暴露。

第三步:创建 MCP 配置

const mcpConfig = await composio.mcp.create(`examples-gmail-${Math.floor(Date.now() / 1000)}`, { toolkits: [ { toolkit: 'gmail', authConfigId, }, ], allowedTools, manuallyManageConnections: false, });

create的入参在 ts/packages/core/src/types/mcp.experimental.types.ts 中由MCPConfigCreationParamsSchema校验,各字段含义如下:

参数类型默认值说明
namestring必填MCP 配置唯一名称,API 将名称上限限制为 30 个字符,因此示例使用examples-gmail-<unix秒时间戳>的短标签命名法
toolkitsArray<string \| { toolkit?: string; authConfigId?: string }>必填可传 toolkit slug 字符串(如"gmail"),或带authConfigId的对象,以便绑定指定的认证配置
allowedToolsstring[]可选允许暴露给 Agent 的工具白名单
manuallyManageConnectionsbooleanfalsefalse时 Composio 会向 MCP Server 注入账号管理工具,由 Agent 在对话中请求并完成账号认证;true则由你自行管理连接

从源码看,create内部(见 ts/packages/core/src/models/MCP.ts)会把toolkits拆分为toolkits(slug 列表)、auth_config_idscustom_tools三组,并依据manuallyManageConnections设置managed_auth_via_composio布尔值后调用client.mcp.custom.create。返回的对象上还挂载了一个闭包generate(userId),可以直接基于该配置生成 Server 实例。

关于命名约定:注释与 scripts/examples-provision.mjs 中的清理逻辑都依赖examples-<label>-<unix秒>这一形态——examples-前缀用于标识「示例创建的资源」,时间戳用于区分手工创建的同名前缀配置,垃圾回收(--gc)只会按正则^examples-[a-z0-9-]+-\d{10}$匹配并清理超过 24 小时的残留配置。

第四步:为用户生成 MCP Server 实例

const server = await composio.mcp.generate(externalUserId, mcpConfig.id);

generate(MCP.ts)会先retrieve配置详情,再调用client.mcp.generate.url携带{ mcp_server_id, user_ids: [userId], managed_auth_by_composio }换取用户专属的 Streamable HTTP URL。返回的MCPServerInstance结构(见 mcp.experimental.types.ts)为:

{ id: string; // MCP 配置 ID name: string; // 配置名称 type: 'streamable_http', url: string; // 该用户专属的 MCP 端点 URL userId: string; // 外部用户 ID allowedTools: string[]; authConfigs: string[]; }

第五步:建立 Streamable HTTP 传输并创建 MCP Client

const serverParams = new StreamableHTTPClientTransport(new URL(server.url), { requestInit: { headers: { 'x-api-key': process.env.COMPOSIO_API_KEY! } }, }); const mcpClient = await createMCPClient({ name: 'composio-mcp-client', transport: serverParams, });

这里有两个关键点:

  • 使用@modelcontextprotocol/sdk提供的StreamableHTTPClientTransport(客户端流式 HTTP 传输),而非旧的 SSE 传输;
  • MCP 端点通过x-api-key请求头携带 Composio API Key 完成认证x-api-key正是 Composio 平台统一使用的 API 认证头),这是该托管 MCP Server 与本地 stdio MCP 的最大差异。

第六至八步:拉取工具、交给 Agent、关闭连接

const tools = await mcpClient.tools(); const stream = streamText({ model: openai('gpt-4o-mini'), messages: [ { role: 'user', content: `Fetch the latest 2 emails and provide a detailed summary with sender, subject, date, and brief content overview for each email.`, }, ], stopWhen: stepCountIs(5), tools, }); for await (const textPart of stream.textStream) { process.stdout.write(textPart); } await mcpClient.close();

streamText来自 Vercel AI SDK(ai包),stopWhen: stepCountIs(5)限制 Agent 最多执行 5 步工具调用以避免失控;tools直接传入从 MCP Client 拉取的工具集,模型即可自主决定何时调用GMAIL_FETCH_EMAILS。示例最后显式close()释放连接资源。

源码级原理:MCP 模型层的完整能力

示例只用到了creategenerate,但 ts/packages/core/src/models/MCP.ts 中的MCP类还封装了完整的服务端管理 API,可在你的业务中按需选用:

  • list(options):分页(page/limit,默认 1/10)、按toolkitsauthConfigsname过滤查询 MCP Server 列表;
  • get(serverId):获取单个配置详情,包含commands(Claude / Cursor / Windsurf 各客户端的接入命令)、MCPUrltoolkitIconsserverInstanceCount等;
  • update(serverId, config):增量更新名称、工具包、allowedToolsmanuallyManageConnections,注意工具包列表是整体替换而非合并
  • delete(serverId):永久删除配置(不可恢复,删除前请确认无活跃连接)。

值得留意的是源码中标注的演进方向MCP类被标记为@deprecated,官方建议改用会话级 MCP 端点——即composio.create(userId, { mcp: true })返回的 session 会直接暴露session.mcp.url/session.mcp.headers,MCP 按会话按需开启,独立的composio.mcp服务端管理 API 仅为向后兼容保留。新项目建议优先走 session MCP 端点,示例代码则用于演示兼容路径的完整接法。

环境变量自动供给:examples-provision 脚本

COMPOSIO_EXAMPLES_GMAIL_AUTH_CONFIG_ID等变量不必手工去 Dashboard 逐个创建,仓库提供了幂等的供给脚本 scripts/examples-provision.mjs,在ts/目录下执行:

out=$(node ../scripts/examples-provision.mjs) && eval "$out"

该脚本会检查一个专用的(可丢弃的)Composio 项目:

  • 自动创建缺失的examples-<slug>命名 Auth Config(Gmail/GitHub/Slack 走use_composio_managed_auth,serpapi 走use_custom_auth+ API_KEY);
  • 对尚无活跃连接的 OAuth 工具包,加上--initiate-missing可发起连接并打印浏览器授权 URL;
  • --gc [--dry-run]可清理示例运行残留(未达 ACTIVE 的账号、多余的 serpapi 演示账号、examples-前缀的 MCP 配置),且只清理 24 小时前创建、确属示例创建的资源。

脚本只向 stdout 输出可被evalexport语句,报告走 stderr;注意「先捕获再 eval」,不要写成eval "$(...)",否则会掩盖脚本失败的退出状态。

自定义与扩展建议

README 明确指出示例的扩展方向(见 ts/examples/mcp/README.md),结合源码可进一步落地:

  1. 替换/增加应用:修改toolkits数组,例如换成githubslack,或传入{ toolkit: 'github', authConfigId: '你的配置ID' };同时把allowedTools换成对应工具包的工具名(如GITHUB_CREATE_ISSUE),并补充对应的COMPOSIO_EXAMPLES_GITHUB_AUTH_CONFIG_ID等环境变量。
  2. 实现业务逻辑:把messages内容替换为真实任务,或将tools接入你自己的 Agent 循环(支持 Anthropic、LangChain 等框架,参见下方相关示例)。
  3. 错误处理与日志:为stream.textStream迭代加入 try/catch,打印模型调用失败或工具执行异常;可用stopWhen: stepCountIs(N)控制步数上限,避免长任务失控。
  4. 认证模式切换:将manuallyManageConnections设为true时,Composio 不再注入账号管理工具,需要自行确保用户已建立连接(可参考 connected-accounts 示例 的建连流程)。

相关示例

  • OpenAI Example:展示与 OpenAI(Responses/Agents API)的集成,其中也包含 MCP 接入的变体;
  • LangChain Example:展示与 LangChain 的集成;
  • 更多示例:浏览全部可用的集成示例(Anthropic、Tool Router、Triggers 等)。

小结

本示例用不到 70 行代码打通了「Composio 托管 MCP Server + Streamable HTTP 传输 + Vercel AI SDK Agent」整条链路。核心要点可归纳为:通过composio.mcp.create声明工具包与认证配置、通过composio.mcp.generate换取用户级端点、以x-api-key完成 HTTP 认证、再用createMCPClient把远端工具直接注入streamText。理解这条链路后,你可以把任意 Composio 支持的 1000+ 工具包快速接入现有 AI 应用,而无需自行实现工具服务器与认证逻辑。

【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 3:27:56

TI EV2300 USB驱动在Windows XP下的安装与通信原理

简介&#xff1a;本资源是专为Windows XP/2000系统设计的TI EV2300 USB通信驱动安装包&#xff0c;面向嵌入式开发工程师、工业控制调试人员及高校电子类课程实践者&#xff0c;解决EV2300微控制器在老旧Windows平台下无法识别、无法烧录与调试的核心兼容性问题。压缩包共33个文…

作者头像 李华
网站建设 2026/9/12 3:27:31

免费升级老Mac装最新macOS:OCLP完整操作指南

免费升级老Mac装最新macOS&#xff1a;OCLP完整操作指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher&#xff08;简称 OCLP&…

作者头像 李华
网站建设 2026/9/12 3:27:21

Pytest Fixtures:自动化测试的依赖注入与资源管理利器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华