1. 为什么 LangChain 调 MCP 服务总在本地卡住MCP 服务如何给 LangChain 调用这个问题的核心其实不在 LangChain 本身而在于模型侧和工具侧是两套协议。MCP 负责把外部工具数据库查询、文件读写、HTTP 请求暴露成标准能力LangChain 负责编排 Agent 的思考与行动循环但两者中间缺一个稳定的模型入口。很多人第一次搭的时候MCP Server 跑起来了LangChain 也装好了结果 Agent 一执行就报连接错误或者模型返回的内容根本触发不了工具调用。我试过的典型场景是这样的本地起了一个 MCP Server用 stdio 或 SSE 暴露了三个工具然后想用 LangChain 的create_react_agent把它接进来。问题立刻出现——LangChain 的 Agent 需要一个 LLM 来驱动推理而这个 LLM 如果直连某个不稳定的通道工具调用的 JSON 结构经常被截断Agent 就卡在思考阶段反复重试。更麻烦的是MCP 工具的描述和 LangChain 的 Tool 格式不完全对齐需要一层适配。所以真正可复现的最小工程骨架应该把模型侧统一到一个 OpenAI 兼容的入口上让 LangChain 用标准的ChatOpenAI去调用MCP 工具则通过 LangChain 的 Tool 接口注册。这样职责就清晰了TaoToken 提供统一的 Key 和 API 通道作为模型侧接入点MCP Server 提供工具能力LangChain 做编排。三者各司其职本地验证时只需要关注工具是否被正确触发。这篇文章面向的是已经了解 MCP 基本概念、想把它接进 LangChain Agent 的开发者。你会拿到一份可以直接跑的配置从环境变量、MCP Server 注册、LangChain Agent 组装到一次完整的工具调用验证。全程本地可复现不需要改动 LangChain 核心逻辑。适合谁做过 LangChain 基础调用、手里有 MCP Server或想用现成的 filesystem MCP、希望把模型通道统一管理的开发者。如果你还没搭过 MCP Server文章里也会给出一个最小可用的配置片段。2. TaoToken 统一 Key 接入模型侧只配一次2.1 为什么模型侧要单独抽出来LangChain Agent 的执行链路里模型调用发生在每一轮推理。如果模型通道不稳定Agent 的工具调用就会断断续续。把模型侧统一到 TaoToken 的 OpenAI 兼容接口后LangChain 只需要一个 Base URL、一个 Key、一个 Model ID剩下的交给通道处理。这样 MCP 工具的注册和模型通道的配置就解耦了排障时也能快速定位是工具侧还是模型侧的问题。TaoToken 的 API 地址是https://taotoken.net/api兼容 OpenAI 的/v1/chat/completions规范。LangChain 的ChatOpenAI类通过openai_api_base参数指向这个地址即可不需要额外写适配层。2.2 拿到 Key 和确认模型 ID进入控制台创建 API Key地址是https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite。创建后复制 Key形如sk-开头的一串字符。模型 ID 在模型列表里选常用的有gpt-4o-mini、claude-3-5-sonnet等具体以控制台展示为准。如果你要用 Claude Code 或 Coding Plan 做长期编码任务模型 ID 要和控制台里开通的保持一致。2.3 环境变量统一管理本地开发建议用.env管理避免 Key 硬编码。在项目根目录创建.env# TaoToken 模型通道 TAOTOKEN_API_BASEhttps://taotoken.net/api TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_MODEL_IDgpt-4o-mini # MCP Server 配置以 filesystem MCP 为例 MCP_SERVER_COMMANDnpx MCP_SERVER_ARGS-y,modelcontextprotocol/server-filesystem,/tmp/mcp-demo这里把模型侧和工具侧的配置分开后面 LangChain 读取时各取所需。注意MCP_SERVER_ARGS里的路径/tmp/mcp-demo是你允许 MCP 访问的目录本地验证时换成自己的临时目录即可。2.4 安装依赖pip install langchain langchain-openai langchain-mcp-adapters python-dotenv mcplangchain-mcp-adapters是 LangChain 官方提供的 MCP 适配包负责把 MCP Server 的工具转成 LangChain 的 Tool 对象。mcp是 MCP 协议的 Python SDK适配包依赖它。2.5 验证模型通道是否通在接 MCP 之前先单独验证 TaoToken 通道。写一个最小脚本import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() llm ChatOpenAI( openai_api_baseos.getenv(TAOTOKEN_API_BASE), openai_api_keyos.getenv(TAOTOKEN_API_KEY), model_nameos.getenv(TAOTOKEN_MODEL_ID), temperature0, ) resp llm.invoke(只回复两个字通了) print(resp.content)跑通后再往下走。如果这一步就报 401说明 Key 或 Base URL 有问题先解决模型通道不要急着接 MCP。3. 可复制配置MCP Server 注册到 LangChain Agent3.1 MCP Server 的启动配置MCP Server 有两种常见传输方式stdio 和 SSE。本地验证推荐 stdio因为不需要额外开端口。以 filesystem MCP 为例它的启动命令是npx -y modelcontextprotocol/server-filesystem /tmp/mcp-demo。在 LangChain 里我们用MultiServerMCPClient来管理连接。创建一个mcp_config.json把 Server 配置结构化{ mcpServers: { filesystem: { command: npx, args: [ -y, modelcontextprotocol/server-filesystem, /tmp/mcp-demo ], transport: stdio } } }这个 JSON 的路径和字段要和langchain-mcp-adapters的读取方式一致。transport字段显式写stdio避免适配包默认行为变化导致连接失败。3.2 LangChain Agent 组装代码创建agent_mcp.pyimport asyncio import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain import hub from langchain_mcp_adapters.client import MultiServerMCPClient load_dotenv() async def main(): # 1. 初始化模型通道TaoToken 统一入口 llm ChatOpenAI( openai_api_baseos.getenv(TAOTOKEN_API_BASE), openai_api_keyos.getenv(TAOTOKEN_API_KEY), model_nameos.getenv(TAOTOKEN_MODEL_ID), temperature0, ) # 2. 连接 MCP Server 并拉取工具 client MultiServerMCPClient({ filesystem: { command: npx, args: [ -y, modelcontextprotocol/server-filesystem, /tmp/mcp-demo, ], transport: stdio, } }) tools await client.get_tools() print(f已加载工具: {[t.name for t in tools]}) # 3. 组装 ReAct Agent prompt hub.pull(hwchase17/react) agent create_react_agent(llm, tools, prompt) executor AgentExecutor( agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue, max_iterations5, ) # 4. 执行一次工具调用 result await executor.ainvoke({ input: 在 /tmp/mcp-demo 目录下创建一个 hello.txt内容写 MCP via LangChain }) print(最终结果:, result[output]) if __name__ __main__: asyncio.run(main())这段代码的关键点MultiServerMCPClient负责启动 MCP Server 子进程并建立 stdio 通道get_tools()返回 LangChain 标准的 Tool 列表create_react_agent用这些工具组装 Agent。模型侧完全走 TaoToken 的 OpenAI 兼容接口不需要为 MCP 单独改模型配置。3.3 三件套配置对照如果你用的是 Cline MCP 或 Claude Code 的 MCP 配置三件套的写法略有不同但核心字段一致配置项LangChain 写法Cline MCP 写法Claude Code 写法Base URLopenai_api_basebaseUrlANTHROPIC_BASE_URLKeyopenai_api_keyapiKeyANTHROPIC_API_KEYModel IDmodel_namemodelmodelTaoToken 的 Base URL 统一是https://taotoken.net/apiKey 在控制台创建Model ID 按控制台开通的填。这三件套在任何支持 OpenAI 兼容接口的客户端里都是通用的。3.4 用 settings 片段固化配置如果你在 Django 或 FastAPI 项目里集成可以把 MCP 配置写进 settings# settings.py MCP_SERVERS { filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, /tmp/mcp-demo], transport: stdio, } } TAOTOKEN_CONFIG { base_url: os.getenv(TAOTOKEN_API_BASE, https://taotoken.net/api), api_key: os.getenv(TAOTOKEN_API_KEY), model_id: os.getenv(TAOTOKEN_MODEL_ID, gpt-4o-mini), }这样 LangChain Agent 初始化时直接读 settings不用散落在各处。4. 验证请求跑通一次完整的工具调用4.1 准备测试目录mkdir -p /tmp/mcp-demo确保这个目录存在且可写MCP filesystem Server 启动时会校验路径。4.2 运行 Agentpython agent_mcp.py预期输出分几段。首先是工具加载已加载工具: [read_file, write_file, list_directory, create_directory, ...]然后是 Agent 的推理过程因为verboseTrue Entering new AgentExecutor chain... 我需要使用 write_file 工具来创建文件。 Action: write_file Action Input: {path: /tmp/mcp-demo/hello.txt, content: MCP via LangChain} Observation: Successfully wrote to /tmp/mcp-demo/hello.txt Thought: 文件已创建成功 Final Answer: 已在 /tmp/mcp-demo 目录下创建 hello.txt内容为 MCP via LangChain Finished chain. 最终结果: 已在 /tmp/mcp-demo 目录下创建 hello.txt内容为 MCP via LangChain4.3 验证文件确实被创建cat /tmp/mcp-demo/hello.txt输出MCP via LangChain就说明整条链路通了LangChain 把用户请求交给 TaoToken 通道的模型模型决定调用write_file工具MCP Server 执行文件写入结果回传给 Agent 生成最终回答。4.4 流式输出验证如果你想让 Agent 的推理过程实时可见把executor.ainvoke换成executor.astreamasync for chunk in executor.astream({ input: 列出 /tmp/mcp-demo 目录下的所有文件 }): if output in chunk: print(chunk[output])流式模式下模型的 token 会逐段返回但工具调用的边界仍然由 LangChain 控制。注意流式模式下handle_parsing_errorsTrue仍然要保留否则模型输出格式抖动时 Agent 会直接崩。4.5 多工具串联验证再试一个需要两步的请求result await executor.ainvoke({ input: 先列出 /tmp/mcp-demo 目录然后读取 hello.txt 的内容 })Agent 会先调list_directory再调read_file最后汇总。这一步能验证 MCP 工具在 LangChain 里的串联能力也是实际业务里最常见的模式。5. 本篇常见错排查5.1 401 Unauthorized报错原文openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key}}原因通常是TAOTOKEN_API_KEY没读到或者.env没被load_dotenv()加载。检查两点一是.env文件在项目根目录且和脚本同级二是 Key 没有多余空格。如果用的是 Cline MCP 或 Claude Code检查apiKey字段是否填对。5.2 local proxy failed / connection refused报错原文httpx.ConnectError: [Errno 111] Connection refused这种一般是 Base URL 写错。TaoToken 的 API 地址是https://taotoken.net/api不要漏掉/api也不要写成带 UTM 的官网地址。LangChain 的openai_api_base会自动拼/v1/chat/completions所以 Base URL 到/api为止。5.3 reading choices 报错报错原文KeyError: choices说明返回的 JSON 结构不是 OpenAI 兼容格式。常见原因是 Base URL 指向了一个非兼容接口或者 MCP Server 的 SSE 端口被误当成模型接口。确认TAOTOKEN_API_BASE指向的是 TaoToken 的 API 地址而不是本地 MCP Server 的地址。5.4 OAuth 相关报错报错原文Error: OAuth token expired如果你在 Claude Code 里配置 MCP可能会遇到 OAuth 过期。Claude Code 的 MCP 配置里模型侧走ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY工具侧走 MCP Server 配置。两者不要混。TaoToken 的 Key 是 API Key 模式不涉及 OAuth 刷新如果报 OAuth 错误检查是不是误用了其他客户端的登录态。5.5 MCP Server 启动失败报错原文Error: Cannot find module modelcontextprotocol/server-filesystemnpx第一次拉包需要网络如果本地缓存没有会下载。确保npx可用或者提前npm install -g modelcontextprotocol/server-filesystem。另外args里的路径必须是绝对路径相对路径会导致 Server 启动后立即退出。5.6 Agent 不调用工具如果 Agent 直接回答而不调工具检查create_react_agent的 prompt 是否包含工具描述。hub.pull(hwchase17/react)拉的是标准 ReAct prompt它会自动注入工具列表。如果工具列表为空说明get_tools()没拿到工具回到 5.5 检查 MCP Server 是否正常启动。5.7 Codex auth.json 配置如果你用 Codex 类客户端auth.json里要写全三件套{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: gpt-4o-mini }字段名按客户端文档来但 Base URL、Key、Model ID 三个值不能少。缺任何一个都会导致 401 或模型找不到。6. 把这条链路用起来本地验证跑通后你可以把agent_mcp.py里的 MCP Server 配置换成自己的服务。如果是自建的 MCP Server把command和args改成你的启动命令transport按实际选 stdio 或 SSE。模型侧不用动TaoToken 的 Base URL 和 Key 保持统一。长期做编码或 Agent 任务的话可以考虑用 Coding Plan模型通道和额度管理会更省心入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite。如果只是想快速验证模型对话效果模型对话页面在https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite。API Key 管理在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。实际用下来这套骨架最省事的地方在于模型侧只配一次MCP 工具可以随时增删。你可以在MultiServerMCPClient里加多个 Server比如同时接 filesystem 和 fetchLangChain 会把所有工具合并成一个列表交给 Agent。唯一要注意的是工具名不要冲突冲突时后加载的会覆盖前面的。