ARTICLE DETAIL

资讯详情

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

MCP在LangChain中的应用-02:连接MCP Server的多种传输协议与TaoToken统一接入

MCP在LangChain中的应用-02:连接MCP Server的多种传输协议与TaoToken统一接入 1. 为什么 MCP Server 的传输协议选型会卡住你MCP 在 LangChain 里跑不起来十有八九不是模型的问题而是传输协议没选对。MCP 全称 Model Context Protocol是一套让大模型客户端和外部工具服务端对话的约定LangChain 通过langchain-mcp-adapters把 MCP Server 暴露的工具转成 LangChain Tool再交给 Agent 调用。它适合谁适合已经会用 LangChain 写 Agent、但被“工具怎么接进来”卡住的开发者。MCP 的消息交换是双向的客户端要读原语、执行工具服务端也要反向发日志、进度、采样请求。所以传输层必须支持双向通信这也是为什么它不像普通 REST 那样一个请求一个响应就完事。FastMCP 提供了 In-Memory、STDIO、SSE、Streamable-HTTP 四种加上通用的 WebSocketMultiServerMCPClient一共支持四种连接类型StdioConnection、SSEConnection、StreamableHttpConnection、WebsocketConnection。选型的核心判断只有三条服务端和客户端在不在同一台机器、要不要跨网络、要不要服务端主动推送。本地 CLI 工具走 STDIO远程服务优先 Streamable-HTTP需要长连接实时推送再考虑 WebSocketSSE 现在更多是兼容老服务端。这篇就把四种协议的配置片段、TaoToken 统一接入、连通性验证和常见报错一次讲透你可以直接照着改。2. TaoToken 前置统一 Key 与 API 通道怎么准备TaoToken 在这里的角色是统一接入层你不需要为每个模型供应商分别管 Key而是拿一个统一 Key通过同一个 API 通道访问不同模型。MCP Server 里如果要用到 LLM 采样sampling或信息征询就可以把请求打到这个通道上省掉多套凭证的麻烦。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。第二步进控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在 API Keys 页面点新建复制出来的 Key 形如sk-开头的一串字符只显示一次先存到密码管理器。第三步确认你要用的模型 ID可以在模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里试跑一句确认通道通、模型名对。接入信息三件套固定为Base URL 用https://taotoken.net/api注意这个地址不加 UTM 参数直接写进配置API Key 用刚创建的那串Model ID 用你在对话页验证过的名字。如果你后面要长期跑编码类 Agent可以看 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解额度方案接入细节查文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。环境变量建议这样设后面所有配置都引用它避免 Key 硬编码进代码export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows PowerShell 用$env:TAOTOKEN_API_KEYsk-...。设完用echo $TAOTOKEN_API_KEY确认非空。这一步做完MCP Server 里任何需要调模型的地方都能复用这套凭证。3. 四种传输协议的可复制配置片段先装依赖版本要对齐否则连接类型对不上pip install langchain-mcp-adapters0.1.0 langchain0.3 mcp1.2 fastmcp2.03.1 STDIO本地子进程零网络配置STDIO 把服务端当子进程启动通过 stdin/stdout 通信延迟极低、不用端口、不用鉴权适合本地工具和 CLI。配置里transport固定stdiocommand是解释器或可执行文件args是脚本参数。from langchain_mcp_adapters.client import MultiServerMCPClient client MultiServerMCPClient( { local_tools: { transport: stdio, command: python, args: [server.py], env: {TAOTOKEN_API_KEY: sk-你的Key}, cwd: ./mcp_servers, encoding: utf-8, encoding_error_handler: replace, } } ) tools await client.get_tools()env用来把 TaoToken 的 Key 透传给子进程cwd决定脚本相对路径的基准encoding_error_handler建议设replace避免服务端输出非 UTF-8 字符时直接崩掉。3.2 SSE双通道兼容老服务端SSE 是 HTTP 单向推送靠“下行长连接 上行 POST”拼出双向。url指向/sse端点timeout是建连超时默认 5 秒sse_read_timeout是空闲保活上限默认 300 秒。client MultiServerMCPClient( { remote_sse: { transport: sse, url: http://127.0.0.1:8000/sse, headers: {Authorization: Bearer sk-你的Key}, timeout: 10, sse_read_timeout: 600, } } )如果服务端在远端把url换成对应域名即可。headers里放 TaoToken Key 是一种常见做法但更推荐服务端自己持有 Key客户端只传业务鉴权。3.3 Streamable-HTTPSSE 的升级版新项目首选Streamable-HTTP 两个通道共享同一路径如/mcp上行 POST 能直接带回结果下行长连接按需延迟创建还支持 HTTP/2、HTTP/3 多路复用。配置和 SSE 几乎一样只多一个terminate_on_close。client MultiServerMCPClient( { remote_http: { transport: streamable_http, url: https://your-mcp-host/mcp, headers: {Authorization: Bearer sk-你的Key}, timeout: 10, sse_read_timeout: 600, terminate_on_close: True, } } )新项目没有历史包袱直接选它别再从 SSE 起步。3.4 WebSocket全双工长连接WebSocket 在单条 TCP 上全双工握手走 HTTP Upgrade兼容 80/443数据帧头极小。配置最简只有transport和url。client MultiServerMCPClient( { ws_server: { transport: websocket, url: wss://your-mcp-host/ws, } } )需要服务端高频主动推送实时日志、进度流时它最合适代价是要自己维护重连。3.5 多 Server 混用与连接管理一个客户端可以同时挂多个不同协议的 ServerKey 就是 Server 名client MultiServerMCPClient( { local: {transport: stdio, command: python, args: [server.py]}, remote: {transport: streamable_http, url: https://host/mcp}, } )注意MultiServerMCPClient从 0.1.0 起不能当上下文管理器用async with MultiServerMCPClient(...)会直接抛NotImplementedError。正确姿势是单例持有要么tools await client.get_tools()一次性拿工具要么async with client.session(local) as session:在会话内做多步操作。4. 验证请求从连通性到端到端跑通配置写完别急着上 Agent先做三层验证。第一层单独确认 TaoToken 通道通curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY返回模型列表就说明 Key 和 Base URL 没问题。第二层验证 MCP 连接能拿到工具import asyncio from langchain_mcp_adapters.client import MultiServerMCPClient async def main(): client MultiServerMCPClient( {local: {transport: stdio, command: python, args: [server.py]}} ) tools await client.get_tools() print(工具数量:, len(tools)) for t in tools: print(-, t.name, |, t.description[:40]) asyncio.run(main())打印出工具名和描述说明传输层和协议握手都成功。第三层端到端把工具挂到 Agent 上跑一次真实调用from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent llm ChatOpenAI( model你的ModelID, base_urlhttps://taotoken.net/api, api_keysk-你的Key, ) agent create_react_agent(llm, tools) result await agent.ainvoke({messages: [(user, 用工具查一下当前时间)]}) print(result[messages][-1].content)看到 Agent 真的调用了 MCP 工具并返回结果整条链路才算通。如果工具没被调用先看tools是否为空再确认模型是否支持 function calling。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth401 Unauthorized九成是 Key 没传对。检查headers里 Bearer 后面有没有多余空格环境变量是否在当前 shell 生效。STDIO 场景下 Key 在env里别写到args。local proxy failed / connection refusedSSE 或 Streamable-HTTP 的url端口写错或服务端没起。先用curl -v http://127.0.0.1:8000/sse确认端点活着再回来看配置。STDIO 报这个通常是command找不到把python换成绝对路径试试。Error reading choices / 返回体解析失败Base URL 写成了带/v1或带 UTM 的地址。TaoToken 的 Base URL 固定https://taotoken.net/api不要自己拼路径也不要带查询参数。OAuth 相关报错auth字段传了但服务端没配对应认证方式。先去掉auth和headers里的鉴权确认裸连能通再逐步加回。OAuth 场景建议服务端持有凭证客户端只做业务层鉴权。NotImplementedError: cannot be used as a context manager把async with MultiServerMCPClient(...)改成client MultiServerMCPClient(...)再await client.get_tools()或改用client.session(name)。工具列表为空协议通了但服务端没注册工具或tool_name_prefix冲突。先直接连服务端确认它暴露了哪些工具再排查客户端过滤逻辑。6. 按场景选协议把链路固定下来选型口诀本地工具走 STDIO远程新服务走 Streamable-HTTP老服务端兼容走 SSE实时推送走 WebSocket。TaoToken 的统一 Key 和 API 通道负责把模型侧凭证收敛成一套MCP 传输层负责把工具侧连接收敛成一份配置两边解耦之后换模型、换协议都不用大改代码。长期跑编码类 Agent 的话把 Key 和 Base URL 固化进环境变量配置片段抽成独立文件再配合 Coding Plan 控制额度。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。先把 STDIO 那条链路跑通再逐个替换成远程协议比一上来就配四种要稳得多。
返回列表