新闻详情

新闻详情

首页 / 资讯中心 / 详情

MCP协议开发实战:用Python从零搭建AI Agent工具链Server与TaoToken配置

发布时间:2026/9/28 4:20:50来源:尧图网络
MCP协议开发实战:用Python从零搭建AI Agent工具链Server与TaoToken配置
1. 为什么 AI Agent 工具链总在重复造轮子如果你写过两个以上的 AI Agent 项目大概率遇到过同一个尴尬给 Agent 加一个「查天气」工具代码里塞一段函数调用再加一个「单位换算」又塞一段等到第三个、第四个工具进来主流程里全是 if-else 和 JSON schema模型换一个、工具换一个整条链路就得重写。这就是 MCP 协议想解决的问题。MCPModel Context Protocol是一套开放协议它把「模型怎么发现工具、怎么调用工具、怎么拿回结果」这件事标准化了。你可以把它理解成 AI 世界里的 USB-C 接口Server 是各种外设天气、数据库、计算器Client 是主机Agent/模型只要都遵守同一个插口规范谁都能插谁。对开发者来说最直接的好处是工具和 Agent 解耦——工具用 Python 写一次任何支持 MCP 的客户端都能复用。这篇内容聚焦一件事用 Python 从零搭一个 MCP Server把它接进 AI Agent 工具链并用 TaoToken 的统一 Key/API 通道完成模型侧调用配置。适合已经会写 Python、想跑通 MCP 工具链但还没落地的开发者。全程给可复制的骨架、配置片段和验证动作不堆概念。2. TaoToken 前置统一 Key 与 API 通道准备MCP Server 本身只负责「暴露工具」真正决定 Agent 智能程度的是背后的模型。这里我用 TaoToken 作为统一的模型调用通道原因是它把多个模型的 Key 和 endpoint 收敛成一个入口Agent 侧不用为每个模型改配置。你需要先拿到一个 API Key。登录官网后进入控制台在 API Keys 页面创建一个新 Key复制保存。注意 Key 只在创建时完整显示一次丢了就重新建。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content控制台建 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsoleAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocAPI 基地址统一用https://taotoken.net/api这个地址不加任何查询参数直接作为 OpenAI 兼容的base_url使用。也就是说你原来用openai库写的代码只需要改base_url和api_key两个字段其余调用方式不变。注意Key 属于敏感凭证不要写进会提交到 Git 的代码里。下面所有配置我都用环境变量读取你本地可以放到.env或 shell 的 export 里。3. 可复制配置MCP Server 骨架与 settings.json先建项目目录装依赖。MCP 官方 Python SDK 包名是mcp模型调用用openai库即可因为 TaoToken 兼容 OpenAI 协议。mkdir mcp-agent-toolchain cd mcp-agent-toolchain python -m venv .venv source .venv/bin/activate pip install mcp[cli] openai python-dotenv3.1 写一个提供两个工具的 MCP Server新建weather_server.py。这个 Server 暴露两个工具get_weather模拟天气和convert_unit单位换算。工具 Schema 用 SDK 的装饰器声明输入参数用类型注解描述。# weather_server.py import asyncio from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent app Server(weather-tools) # 工具清单tools/list 返回的内容 app.list_tools() async def list_tools() - list[Tool]: return [ Tool( nameget_weather, description查询指定城市的当前天气返回摄氏度, inputSchema{ type: object, properties: { city: {type: string, description: 城市名如 北京} }, required: [city], }, ), Tool( nameconvert_unit, description温度单位换算支持 c2f摄氏转华氏和 f2c, inputSchema{ type: object, properties: { value: {type: number, description: 待换算数值}, mode: {type: string, enum: [c2f, f2c]}, }, required: [value, mode], }, ), ] # 工具调用tools/call 的实际执行逻辑 app.call_tool() async def call_tool(name: str, arguments: dict) - list[TextContent]: if name get_weather: city arguments[city] # 这里用模拟数据真实场景替换为天气 API 请求 fake {北京: 26.0, 上海: 29.0, 广州: 31.0} temp fake.get(city, 25.0) return [TextContent(typetext, textf{city}当前气温 {temp} 摄氏度)] if name convert_unit: v, mode arguments[value], arguments[mode] if mode c2f: result v * 9 / 5 32 return [TextContent(typetext, textf{v}°C {result:.1f}°F)] result (v - 32) * 5 / 9 return [TextContent(typetext, textf{v}°F {result:.1f}°C)] raise ValueError(f未知工具: {name}) async def main(): async with stdio_server() as (read, write): await app.run(read, write, app.create_initialization_options()) if __name__ __main__: asyncio.run(main())这段代码的关键点app.list_tools()负责「工具发现」app.call_tool()负责「工具执行」两者通过name字段对应。传输层用stdio_server也就是标准输入输出这是本地 MCP Server 最常用的方式。3.2 settings.json 配置片段如果你用的是支持 MCP 的客户端比如 Claude Code 这类工具通常通过一个settings.json或mcp.json注册 Server。下面是一个通用片段把上面的 Python Server 挂进去{ mcpServers: { weather-tools: { command: python, args: [/absolute/path/to/weather_server.py], env: { TAOTOKEN_API_KEY: 你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }command和args指向你的 Python 解释器和脚本绝对路径。env里注入 TaoToken 的 Key 和基地址Server 内部如果要调模型就能直接读。3.3 config.toml 配置片段有些工具链用 TOML 管理配置等价写法如下[mcp_servers.weather-tools] command python args [/absolute/path/to/weather_server.py] [mcp_servers.weather-tools.env] TAOTOKEN_API_KEY 你的Key TAOTOKEN_BASE_URL https://taotoken.net/api两种格式选一种即可核心是「命令 参数 环境变量」三要素。4. 验证请求跑通工具发现与调用配置写完别急着接 Agent先用 MCP 自带的 CLI 验证 Server 能不能正常响应。SDK 装了mcp[cli]之后会带一个mcp命令。# 启动并列出工具 mcp dev weather_server.pymcp dev会拉起一个调试界面你能看到get_weather和convert_unit两个工具并手动填参数调用。如果界面里能看到工具列表说明tools/list通了点调用返回文本说明tools/call通了。再写一个最小 Client 脚本模拟 Agent 侧「发现工具 → 调用工具」的完整链路# client_demo.py import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def main(): params StdioServerParameters( commandpython, args[weather_server.py], ) async with stdio_client(params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools await session.list_tools() print(发现工具:, [t.name for t in tools.tools]) result await session.call_tool( convert_unit, {value: 26, mode: c2f} ) print(调用结果:, result.content[0].text) asyncio.run(main())运行python client_demo.py预期输出发现工具: [get_weather, convert_unit] 调用结果: 26°C 78.8°F看到这两行说明 MCP 工具链的 Server 端和 Client 端已经打通。接下来把模型接进来让 Agent 自己决定调哪个工具。4.1 接入 TaoToken 让 Agent 自主选工具Agent 循环的核心是把 MCP 发现的工具转成 OpenAI 的tools格式交给模型决策模型返回tool_calls后执行对应 MCP 工具再把结果喂回模型。# agent_demo.py import asyncio, json, os from openai import OpenAI from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) def to_openai_tools(mcp_tools): return [ { type: function, function: { name: t.name, description: t.description, parameters: t.inputSchema, }, } for t in mcp_tools ] async def main(): params StdioServerParameters(commandpython, args[weather_server.py]) async with stdio_client(params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools (await session.list_tools()).tools oai_tools to_openai_tools(tools) messages [ {role: user, content: 北京今天多少度帮我换成华氏度} ] resp client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolsoai_tools, ) msg resp.choices[0].message messages.append(msg) for call in msg.tool_calls or []: args json.loads(call.function.arguments) result await session.call_tool(call.function.name, args) messages.append({ role: tool, tool_call_id: call.id, content: result.content[0].text, }) final client.chat.completions.create( modelgpt-4o-mini, messagesmessages ) print(final.choices[0].message.content) asyncio.run(main())运行前先导出环境变量export TAOTOKEN_API_KEY你的Key python agent_demo.py预期模型会先调get_weather拿到北京温度再调convert_unit转华氏度最后输出类似「北京当前 26°C约 78.8°F」。这一步跑通整条 MCP 工具链就闭环了。5. 本篇常见错排查报错一ModuleNotFoundError: No module named mcp虚拟环境没激活或者装到了全局 Python。确认which python指向.venv/bin/python再pip install mcp[cli]。报错二Client 连不上 Server卡在 initialize多半是args里的脚本路径不对。stdio_client用的是相对路径时工作目录取决于你从哪运行脚本。建议统一写绝对路径或者用os.path.dirname(__file__)拼。报错三模型返回tool_calls为空检查to_openai_tools转换后的parameters是否是合法 JSON Schema。MCP 的inputSchema一般能直接用但如果你的工具没写required模型可能不敢调。补上必填字段。报错四TaoToken 返回 401Key 没读到或写错。用echo $TAOTOKEN_API_KEY确认环境变量存在注意base_url结尾不要多加/v1直接用https://taotoken.net/api。报错五工具调用结果中文乱码stdio传输默认编码在部分 Windows 环境是 GBK。在 Server 启动参数里加env{PYTHONIOENCODING: utf-8}即可。报错六多个 Server 工具重名当 Agent 同时挂多个 MCP Server工具名冲突会导致调用错乱。给每个 Server 的工具名加前缀比如weather_get_weather、calc_convert_unit在list_tools里统一处理。6. 下一步把工具链接到你的真实场景到这里你已经有了一个能跑的最小闭环Python MCP Server 暴露工具Client 发现并调用TaoToken 提供模型通道。接下来最值得做的不是继续加工具而是把其中一个模拟工具换成真实 API——比如把get_weather里的假数据换成一次 HTTP 请求你会立刻遇到超时、重试、错误码这些生产问题那才是工具链真正开始变有用的地方。如果你要长期跑编码类 Agent建议把模型通道固定成 Coding Plan 模式省得每次调参只是想验证某个模型对工具调用的支持程度直接去模型对话页面手动试几轮更快。接入细节和参数说明都在文档里遇到 401 或工具发现为空先回第 5 节对一遍。模型对话验证https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchatCoding Plan长期编码/Agenthttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Cartographer 2D建图实战:激光雷达与IMU融合标定与避坑指南 2026/9/28 5:34:57

Cartographer 2D建图实战:激光雷达与IMU融合标定与避坑指南

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

阅读更多 →
MATLAB随机森林回归实战:从原理到代码包拆解与避坑指南 2026/9/28 5:34:57

MATLAB随机森林回归实战:从原理到代码包拆解与避坑指南

简介:面向需要对高维数据或非线性关系进行回归建模的MATLAB用户,这份资源提供随机森林回归的完整可运行代码。随机森林作为集成学习方法,通过自助采样与特征随机性构建多棵决策树,能有效降低过拟合风险,并在预测的同时…

阅读更多 →
STM32串口下载全链路解析:从BOOT0握手到一键下载电路 2026/9/28 5:34:57

STM32串口下载全链路解析:从BOOT0握手到一键下载电路

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

阅读更多 →
DMA原理与实战:CPU减负的核心I/O控制机制 2026/9/28 5:34:50

DMA原理与实战:CPU减负的核心I/O控制机制

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

阅读更多 →
不会代码?租车网站模板下载源码实战与报价全解析 2026/9/28 5:34:50

不会代码?租车网站模板下载源码实战与报价全解析

不会代码?租车网站模板下载源码实战与报价全解析 自己不会代码,却想急着把租车业务搬上网,这是很多中小租车公司老板最头疼的局。很多人第一反应是去搜“租车网站模板下载”,想找个现成的壳子改改就能用。但坑就在这:网上大部分所谓的“免费源码下载”,…

阅读更多 →
基于JFM7VX690T80的8通道光纤数据采集与FMC传输平台设计 2026/9/28 5:34:49

基于JFM7VX690T80的8通道光纤数据采集与FMC传输平台设计

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉