ARTICLE DETAIL

资讯详情

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

爆火的MCP!手把手教你用langchain打造自己的AI服务并接入TaoToken

爆火的MCP!手把手教你用langchain打造自己的AI服务并接入TaoToken 1. 为什么我要把 MCP 和 langchain 拼在一起用MCP 是 Model Context Protocol 的缩写你可以把它理解成一套「工具插头标准」以前给大模型加能力得在代码里手写 Function Call 的 JSON Schema模型换了、工具改了schema 就得跟着重写。MCP 把「工具怎么描述、怎么被调用、怎么返回结果」抽成协议服务端只管暴露工具客户端只管发现和调用两边解耦。适合谁适合想自建 AI 服务、又不想被某一家模型 SDK 绑死的开发者。但光有 MCP 还不够。真实项目里你往往要同时挂好几个 MCP Server文件、天气、数据库、内部 API还要让模型自己决定调哪个、调几次、拿到结果后继续推理。这时候 langchain 生态里的langchain-mcp-adapters就派上用场了它把 MCP 工具自动转成 langchain 的 Tool 对象再交给langgraph的 ReAct Agent 调度。你写的是标准 MCP Server跑起来却是一个能自主编排工具的 Agent。我这次的目标很具体本地起两个 MCP Server一个算数、一个查天气用 langchain 客户端把它们聚合成一个 Agent模型调用统一走 TaoToken 的 OpenAI 兼容通道。整条链路跑通后你换模型只需要改一个base_url和一个 Key工具代码一行不动。下面从环境准备一路写到排错命令都能直接复制。2. TaoToken 前置一个 Key 打通模型调用在写 MCP 之前先把模型通道定下来。langchain 的ChatOpenAI需要一个base_url和api_keyTaoToken 提供 OpenAI 兼容接口所以不用装额外的 SDK直接复用langchain_openai就行。这样做的好处是MCP 工具链和模型供应商彻底解耦哪天想换模型只动配置不动业务代码。你需要先去控制台拿一个 API Key。打开 https://taotoken.net/api-keys 登录后创建一个 Key复制出来形如sk-开头的一串。注意这个 Key 只在创建时完整显示一次先存到环境变量里别硬编码进代码提交到仓库。拿到 Key 后把接口地址和 Key 写进环境变量后面所有脚本都从这里读export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1如果你更习惯用配置文件管理可以在项目根目录建一个.env用python-dotenv加载。我实测下来环境变量最省事尤其是同时开多个终端跑 Server 和 Client 的时候不用每个文件都改一遍。注意base_url结尾的/v1别漏langchain 的 OpenAI 客户端会在这个地址后面拼/chat/completions少一段就会 404。模型名怎么填TaoToken 的模型列表在文档里有常见的就是gpt-4o-mini、gpt-4o这类。你可以在 https://taotoken.net/doc 查到当前支持的模型标识填错模型名会直接返回 400报错信息里会写model not found很好定位。3. 可复制配置从 MCP Server 到 langchain Client3.1 环境与依赖安装Python 版本要大于 3.10我用的是 3.12。MCP 的 Python SDK 用到了较新的类型语法3.9 会报TypeError。依赖装这几个pip install mcp[cli] langchain-mcp-adapters langchain-openai langchain langgraph python-dotenvmcp[cli]带上了命令行调试工具后面验证 Server 能不能单独跑起来会用到。langchain-mcp-adapters是核心负责把 MCP 工具转成 langchain Tool。3.2 写第一个 MCP Servermath_server.pyMCP Server 的本质是「注册工具 启动传输层」。用FastMCP装饰器注册工具最直观# math_server.py from mcp.server.fastmcp import FastMCP import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) mcp FastMCP(Math) mcp.tool() def add(a: int, b: int) - int: logger.info(add called: a%d, b%d, a, b) return a b mcp.tool() def multiply(a: int, b: int) - int: logger.info(multiply called: a%d, b%d, a, b) return a * b if __name__ __main__: logger.info(starting Math MCP server via stdio) mcp.run(transportstdio)transportstdio表示这个 Server 通过标准输入输出和客户端通信适合本地进程调用。工具函数的类型注解a: int会被自动转成 JSON Schema模型就是靠这个知道参数类型的所以注解别省。3.3 第二个 MCP Serverweather_server.py再写一个天气服务结构一样只是工具不同# weather_server.py from mcp.server.fastmcp import FastMCP import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) mcp FastMCP(Weather) mcp.tool() def get_weather(city: str) - str: logger.info(get_weather called: city%s, city) return f{city}天气晴朗25℃ if __name__ __main__: logger.info(starting Weather MCP server via stdio) mcp.run(transportstdio)这里返回的是模拟数据真实项目里换成调用气象 API 即可MCP 层不用改。3.4 langchain Client聚合多个 MCP Server关键来了。MultiServerMCPClient用一个字典描述所有要挂载的 Server每个 Server 指定启动命令、参数和传输方式# remote_client.py import asyncio import os from dotenv import load_dotenv from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent load_dotenv() llm ChatOpenAI( modelgpt-4o-mini, api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], ) def print_result(agent_response): for message in agent_response.get(messages, []): if message.type ai and message.content: print(最终答案:, message.content) async def main(): client MultiServerMCPClient({ math: { command: python, args: [./math_server.py], transport: stdio, }, weather: { command: python, args: [./weather_server.py], transport: stdio, }, }) tools await client.get_tools() print(已加载工具:, [t.name for t in tools]) agent create_react_agent(llm, tools) while True: user_input input(\n请输入问题exit 退出).strip() if user_input.lower() exit: break resp await agent.ainvoke({messages: user_input}) print_result(resp) if __name__ __main__: asyncio.run(main())create_react_agent(llm, tools)是 langgraph 的预构建模块它把工具列表塞进一个 ReAct 循环模型先想「要不要调工具」要调就发工具调用拿到结果再想直到能直接回答。你不需要手写这个循环。3.5 关于 config.toml 与 settings.json 骨架如果你用 MCP 官方 CLI 或某些客户端比如 Claude Desktop 类工具来管理 Server它们读的是 JSON 配置。一个通用的settings.json骨架长这样{ mcpServers: { math: { command: python, args: [./math_server.py] }, weather: { command: python, args: [./weather_server.py] } } }而如果你用 Rust 版或某些支持 TOML 的宿主config.toml等价写法是[mcpServers.math] command python args [./math_server.py] [mcpServers.weather] command python args [./weather_server.py]两种格式描述的是同一件事Server 名字、启动命令、参数。langchain 的MultiServerMCPClient用的是 Python 字典字段名和上面一致所以你在不同宿主之间迁移配置时改的是外壳工具代码不动。4. 验证请求跑通一次完整调用先单独验证每个 Server 能不能起来。开一个终端python math_server.py如果没报错、光标停住不返回说明 stdio Server 正常在等输入。按CtrlC退出。天气服务同理。然后跑客户端python remote_client.py启动后你会先看到一行已加载工具: [add, multiply, get_weather]这说明 langchain 成功从两个 MCP Server 里发现了三个工具。接着输入问题北京天气怎么样另外帮我算 12 乘 8预期行为是Agent 先调get_weather(city北京)再调multiply(a12, b8)最后把两个结果拼成一句话回答。你会在 Server 那边的终端看到日志2025-xx-xx - INFO - get_weather called: city北京 2025-xx-xx - INFO - multiply called: a12, b8客户端这边打印最终答案: 北京天气晴朗25℃。12 乘 8 等于 96。一次请求里模型自主调了两个不同 Server 的工具这就是 MCP langchain 的价值工具分散在不同进程Agent 统一编排。如果你只问「3 加 5」它只会调add不会碰天气服务说明工具选择是按需的。5. 本篇常见错排查报错ModuleNotFoundError: No module named mcp依赖没装全。注意包名是mcp[cli]不是mcp-server。重装一遍pip install mcp[cli] langchain-mcp-adapters。报错openai.BadRequestError: model not found模型名填错了。去 https://taotoken.net/doc 核对当前可用模型标识别凭记忆写。报错401 UnauthorizedKey 没读到或已失效。先确认echo $TAOTOKEN_API_KEY有输出再确认.env里没有多余空格和引号。Key 泄露了就去 https://taotoken.net/api-keys 删掉重建。工具列表是空的已加载工具: []多半是args里的路径不对。MultiServerMCPClient启动子进程时的工作目录可能和你终端不一致建议把./math_server.py换成绝对路径或者用os.path.abspath拼出来。Agent 一直不调工具直接瞎编答案检查工具函数的类型注解是否完整。def add(a, b)没有注解生成的 schema 参数类型是空的模型不知道传什么就不敢调。补上a: int, b: int。Server 启动后立刻退出mcp.run(transportstdio)必须在if __name__ __main__:里否则被 import 时就会执行。另外 stdio 模式下不要往 stdout 打印调试信息会污染协议流日志走logging到 stderr。中文输入乱码Windows 终端默认编码可能是 GBK。跑之前执行chcp 65001切到 UTF-8或者在 Python 里设置PYTHONIOENCODINGutf-8。6. 把这条链路用起来跑通之后你手里其实有了一个可复用的骨架新增能力 新增一个 MCP Server 文件 在MultiServerMCPClient字典里加一项模型侧完全不用动。想把模型换成更强的版本改ChatOpenAI的model参数即可base_url和 Key 还是那一套。如果你打算长期跑编码类或 Agent 类任务可以看看 Coding Plan 的额度方案 https://taotoken.net/coding-plan 比按次调用更适合高频场景只是想先验证模型对话效果直接开 https://taotoken.net/models 试就行。接入文档在 https://taotoken.net/doc 遇到协议层的细节可以对照查。我踩过的一个坑是一开始把两个 Server 写在同一个文件里用不同端口结果 stdio 模式下进程管理很乱。后来拆成独立文件、每个 Server 一个进程日志清晰出问题也好定位。工具多了之后建议按领域拆文件别堆在一起。
返回列表