ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

agentscope 以 STUDIO 方式调用 MCP 服务:TaoToken 统一 Key 配置与 STDIO 联调指南

agentscope 以 STUDIO 方式调用 MCP 服务:TaoToken 统一 Key 配置与 STDIO 联调指南 1. 为什么你的 AgentScope 连不上本地 MCP 服务如果你正在用 AgentScope 做本地智能体开发大概率会遇到这样一个场景MCP 服务在终端里跑得好好的日志里也明确打印了Transport: STDIO但 AgentScope 客户端一发起调用就报httpx.ConnectError: All connection attempts failed。这个报错看起来像是网络问题实际上跟网络一点关系都没有核心矛盾在于传输方式不匹配。MCP 协议支持多种传输层常见的有 STDIO 和 Streamable HTTP 两类。STDIO 模式下MCP 服务进程通过标准输入输出与客户端通信客户端需要负责把服务进程拉起来而 HTTP 模式下服务是一个常驻的 HTTP 端点客户端通过 URL 去连。很多同学在写 AgentScope 代码时习惯性地用了HttpStatelessClient配streamable_http但服务端其实是 FastMCP 默认的 STDIO 启动方式两边协议对不上自然连不通。这篇内容聚焦的就是这个链路AgentScope 以 STDIO 方式调用 MCP 服务同时把模型调用的 Key 统一收敛到 TaoToken避免在代码里散落多个平台的 API Key。适合正在做本地联调、想把 MCP 工具接进 ReActAgent 的开发者。读完之后你能拿到一份可直接复制的config.toml骨架、一段能跑通的 STDIO 客户端代码以及一套验证和排障动作。2. TaoToken 前置准备统一 Key 与 config.toml 骨架在动手改客户端代码之前先把 Key 的事情理清楚。AgentScope 里模型调用和 MCP 工具调用是两条线模型这条线需要一个兼容 OpenAI 协议的 API Key。TaoToken 提供的就是这样一个统一入口你可以在官网注册后拿到 Key然后在config.toml里集中管理代码里只读环境变量或配置文件不硬编码。先看配置文件骨架。AgentScope 本身没有强制的config.toml规范但社区里比较常见的做法是用一个 TOML 文件承载模型和 MCP 的元信息再由启动脚本读取。下面这份骨架你可以直接放到项目根目录# config.toml [model] provider openai_compatible model_name qwen-max base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY stream true [mcp.local_echo] transport stdio command python args [server.py] cwd ./mcp_server connect_timeout 30这里有几个点值得说明。base_url填的是https://taotoken.net/api注意这个地址不带任何查询参数是纯 API 入口。api_key_env指向环境变量名而不是把 Key 写死在文件里这样你提交代码时不会泄露。MCP 段落里transport stdio明确告诉后续代码该用哪种客户端command和args就是启动 MCP 服务进程的命令等价于你在终端里手动敲python server.py。拿到 Key 的路径是访问官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content注册后在控制台创建 API Key。创建完成后把它写进环境变量export TAOTOKEN_API_KEYsk-你的实际key如果你更习惯用命令行管理也可以直接在控制台里查看和轮换 Key地址是https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite。模型对话的调试入口在https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite联调阶段可以先用它确认 Key 本身是通的再去排查 MCP 链路。注意不要把 Key 直接写进config.toml的api_key字段再提交到 Git。用环境变量是最省事的做法CI 里也容易注入。3. 可复制配置STDIO 客户端与 MCP 服务端代码配置骨架有了接下来是真正干活的部分。AgentScope 里跟 STDIO 传输匹配的客户端类是StdIOStatefulClient不是HttpStatelessClient。这个类需要你提供启动 MCP 服务的命令、参数和工作目录它会自己把子进程拉起来通过标准输入输出通信。先写 MCP 服务端。用 FastMCP 起一个带 echo 和天气查询的最小服务保存为mcp_server/server.py# mcp_server/server.py from fastmcp import FastMCP mcp FastMCP(Echo Server) mcp.tool def echo_tool(text: str) - str: 原样返回输入文本 return text mcp.tool def get_weather(city: str) - str: 查询城市天气演示版固定返回晴 25 度 return f城市 {city} 的天气晴气温 25 度。 if __name__ __main__: mcp.run()这个服务默认就是 STDIO 传输mcp.run()不带参数时走标准输入输出。你可以在终端里单独跑一下python server.py看到它挂起等待输入说明服务本身没问题然后 CtrlC 退出因为接下来客户端会自己拉起它。再写 AgentScope 客户端。关键改动有三处导入StdIOStatefulClient、用command/args/cwd构造客户端、显式connect()和close()。完整代码如下# mcp_stdio_integration.py import asyncio import os from agentscope.agent import ReActAgent from agentscope.formatter import OpenAIChatFormatter from agentscope.memory import InMemoryMemory from agentscope.message import Msg from agentscope.model import OpenAIChatModel from agentscope.tool import Toolkit from agentscope.mcp import StdIOStatefulClient async def integrate_local_mcp(): # 1. 构造 STDIO 客户端命令等价于 python server.py mcp_client StdIOStatefulClient( namelocal_echo_mcp, commandpython, args[server.py], cwd./mcp_server, ) # 2. STDIO 客户端必须显式连接 await mcp_client.connect() # 3. 注册 MCP 工具到 Toolkit toolkit Toolkit() await toolkit.register_mcp_client(mcp_client) print(已注册的 MCP 工具) for tool in toolkit.get_json_schemas(): print(f - {tool[function][name]}) # 4. 用 TaoToken 统一 Key 初始化模型 agent ReActAgent( nameMCP_Studio_Agent, sys_prompt你可以调用 echo_tool 重复文本调用 get_weather 查询天气。, modelOpenAIChatModel( model_nameqwen-max, api_keyos.environ[TAOTOKEN_API_KEY], client_args{base_url: https://taotoken.net/api}, streamTrue, ), formatterOpenAIChatFormatter(), toolkittoolkit, memoryInMemoryMemory(), enable_meta_toolTrue, ) # 5. 依次测试工具调用 test_messages [ Msg(user, 重复STDIO 连接成功, user), Msg(user, 查询北京天气, user), ] for msg in test_messages: print(f\n用户请求{msg.content}) await agent(msg) # 6. 关闭客户端释放子进程 await mcp_client.close() if __name__ __main__: asyncio.run(integrate_local_mcp())跟 HTTP 版本相比这里最容易被忽略的是await mcp_client.connect()和await mcp_client.close()。STDIO 客户端不会在构造时自动连接也不会在对象销毁时自动关闭子进程必须手动成对调用否则要么连不上要么跑完一次后残留僵尸进程。4. 验证请求从工具注册到成功响应代码写完之后按顺序做三步验证能快速定位问题出在哪一层。第一步单独验证 MCP 服务端。在mcp_server目录下执行python server.py如果进程挂起不报错说明 FastMCP 服务本身正常。这一步不要跳过很多连接失败其实是服务端脚本本身有语法错误或依赖缺失。第二步跑客户端脚本观察工具注册输出。执行export TAOTOKEN_API_KEYsk-你的实际key python mcp_stdio_integration.py如果配置正确你会先看到类似这样的输出已注册的 MCP 工具 - echo_tool - get_weather这说明 STDIO 子进程已经被拉起工具 schema 也成功注册进 Toolkit。如果这一步为空说明connect()或register_mcp_client()出了问题重点检查cwd和args是否指向了正确的server.py。第三步观察模型响应。工具注册成功后Agent 会依次处理两条消息。正常情况下第一条会触发echo_tool返回你输入的文本第二条会触发get_weather返回固定天气文案。终端里能看到 ReActAgent 的思考过程和工具调用记录最终输出类似用户请求重复STDIO 连接成功 AgentSTDIO 连接成功 用户请求查询北京天气 Agent城市 北京的天气晴气温 25 度。到这里一次完整的 STDIO 调用链路就跑通了。模型侧走的是 TaoToken 的统一入口MCP 侧走的是本地子进程两边互不干扰。5. 本篇常见错排查联调过程中最容易踩的坑集中在传输方式、路径和生命周期三块下面按报错现象逐一拆解。报错httpx.ConnectError: All connection attempts failed。这是最典型的传输不匹配。你的服务端是 STDIO客户端却用了HttpStatelessClient或streamable_http客户端在尝试连一个根本不存在的 HTTP 端点。解决办法就是把客户端换成StdIOStatefulClient并确认command/args能正确启动服务。工具列表为空但没有任何报错。通常是cwd或args路径不对子进程启动后立刻退出客户端拿不到工具 schema。建议把cwd写成绝对路径先验证一次确认无误后再改回相对路径。另外args里的脚本名要和实际文件名完全一致大小写敏感。模型调用报 401 或鉴权失败。检查TAOTOKEN_API_KEY是否真的注入到了当前 shell可以用echo $TAOTOKEN_API_KEY确认。如果是在 IDE 里跑注意 IDE 的终端环境变量可能和系统 shell 不一致必要时在运行配置里手动加环境变量。脚本跑完终端卡住不退出。这是 STDIO 子进程没被关闭导致的。确认await mcp_client.close()在asyncio.run()结束前被执行如果中间抛了异常导致close()被跳过可以用try/finally包一层。base_url写错导致模型请求 404。TaoToken 的 API 入口是https://taotoken.net/api不要多加/v1或其他后缀具体路径由 SDK 自己拼接。如果你用的是其他兼容库确认它拼接后的完整 URL 是https://taotoken.net/api/chat/completions这类标准路径。提示排障时优先看 MCP 服务端的 stderr 输出FastMCP 会把启动信息和异常打到标准错误客户端日志里往往看不到这些细节。6. 下一步把 Key 和 MCP 都收敛到统一入口跑通一次 STDIO 调用之后建议把项目里的 Key 管理再规范一层。模型侧统一走 TaoTokenMCP 侧的工具注册也集中在一个 Toolkit 里这样后续加新工具时只需要在config.toml里加一段 MCP 配置客户端代码基本不用动。如果你打算长期做编码类 Agent或者要把这套链路接进 CI可以看一下 Coding Plan地址是https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite它更适合需要稳定配额和统一计费的场景。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有各语言 SDK 的 base_url 配置示例照着改client_args就行。API Key 的创建和轮换入口在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite建议给本地开发和 CI 分别建不同的 Key方便单独吊销。实际用下来STDIO 模式最适合本地开发和单机联调服务进程随客户端生命周期起停不用额外管端口和防火墙。等你要部署到多实例环境时再考虑把 MCP 服务改成 HTTP 传输那时候客户端类也要相应换成 HTTP 版本这个切换点心里有数就行。
返回列表