尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

MCP 协议简单理解与 Python 简单实战:用 TaoToken 统一 Key 跑通第一个 MCP 工具调用

发布时间:2026/9/28 19:05:15

资讯中心
01
ARTICLE

MCP 协议简单理解与 Python 简单实战:用 TaoToken 统一 Key 跑通第一个 MCP 工具调用

MCP 协议简单理解与 Python 简单实战:用 TaoToken 统一 Key 跑通第一个 MCP 工具调用
1. 先搞懂 MCP 到底在解决什么问题如果你写过 Python 函数调用第一反应可能是我直接import一个模块、调个函数不就完了为什么还要搞个 MCP 协议这个问题我当初也卡了很久。简单说普通函数调用是「代码写死」的——你在写程序时就知道要调哪个函数、传什么参数。而 MCPModel Context Protocol要解决的是让一个 AI 客户端在运行时动态发现「现在有哪些工具可用」再根据用户的话自己决定调哪个、传什么参数。MCP 里三个角色要分清。Host 是宿主通常就是那个带界面的 AI 应用比如 Claude Desktop、Cursor 或者你自己写的 Agent 主程序Client 是 Host 内部负责和 Server 通信的连接器Server 才是真正暴露工具的一方它把一个个函数包装成「工具」注册出去。三者关系可以类比成Host 是餐厅前台Client 是服务员Server 是后厨菜单工具列表由后厨提供服务员负责传菜。它和普通函数调用最大的区别在于「发现」和「描述」。MCP Server 暴露的每个工具都带一段 docstring 式的描述Client 拿到这份清单后交给模型模型据此生成调用参数。也就是说调用哪个工具不是程序员写死的而是模型看着工具描述现场决定的。这就是为什么 MCP 特别适合做 Agent——工具可以随时增删模型不用重新训练。这篇面向刚接触 MCP 的 Python 开发者我会先带你把一个最小 MCP Server 跑起来再用 TaoToken 的统一 Key 和 API 通道接上模型最后给一条可复制的验证命令确认 Server 能被正确拉起并返回结果。全程不需要你理解协议底层字节跟着敲就行。2. 用 TaoToken 统一 Key 打通模型通道MCP Server 本身只负责「提供工具」它不负责「理解自然语言」。真正把用户的话翻译成工具调用的是背后的大模型。所以你需要一个能稳定调用模型的通道。我实测下来用 TaoToken 的好处是一个 Key 就能覆盖多种模型不用为每个模型单独申请账号、单独配 base_url配置里改个模型名就行。TaoToken 的定位是统一的模型 API 接入层官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。你需要在控制台创建一个 API Key然后把它写进环境变量别硬编码在代码里。创建 Key 的入口在这里https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后先导出到环境变量export TAOTOKEN_API_KEYsk-你的key如果你更习惯用配置文件可以建一个config.toml把模型通道和 MCP Server 的启动参数都放进去。下面这个骨架你可以直接抄改掉 Key 和路径即可# config.toml [llm] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model claude-3-5-sonnet [mcp_servers.math] command python args [server.py] transport stdio [mcp_servers.math.env] PYTHONUNBUFFERED 1这里base_url指向 TaoToken 的 API 入口api_key_env表示从环境变量读 Key避免明文写进文件。[mcp_servers.math]这一段描述了一个本地 MCP Server 怎么被拉起用python执行server.py走 stdio 传输。stdio 的意思是 Client 和 Server 通过标准输入输出通信适合本地进程不需要开端口。注意base_url结尾不要多加/v1TaoToken 的 API 入口已经处理好了路径多写反而会 404。这个坑我踩过。3. 写一个最小可运行的 MCP Server现在来写 Server。先初始化项目用 uv 会快很多uv init mcp-server-demo cd mcp-server-demo uv add mcp[cli]如果你没装 uv用 pip 也行pip install mcp[cli]。装完之后新建server.py写两个工具一个做加法一个返回问候语。注意工具函数的 docstring 很重要模型就是靠它判断这个工具干什么的。# server.py from mcp.server.fastmcp import FastMCP mcp FastMCP(demo-server) mcp.tool() def add(a: int, b: int) - int: 计算两个整数之和。 Args: a: 第一个加数 b: 第二个加数 Returns: 两数之和 return a b mcp.tool() def greet(name: str) - str: 返回对指定名字的问候语。 Args: name: 用户名 Returns: 问候字符串 return f你好{name}欢迎使用 MCP。 if __name__ __main__: mcp.run(transportstdio)这里FastMCP是官方提供的高层封装mcp.tool()装饰器把普通函数注册成 MCP 工具。参数类型标注a: int会被转成 JSON Schema模型据此知道该传整数还是字符串。mcp.run(transportstdio)启动服务等待 Client 连接。写完之后你可以先用官方 CLI 检查一下 Server 能不能正常列出工具uv run mcp dev server.py这个命令会启动一个开发检查器能看到add和greet两个工具以及它们的参数结构。如果这里就报错说明 Server 本身有问题先别往下走。4. 写 Client 并接上 TaoToken 模型Server 有了接下来写 Client。Client 的职责是连上 Server、拿到工具列表、把工具列表和用户问题一起发给模型、模型返回要调用的工具和参数、Client 执行调用、把结果回传。下面是一个最小版本用 TaoToken 作为模型通道。# client.py import asyncio import os from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client from openai import OpenAI # 用 TaoToken 统一通道 llm OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) server_params StdioServerParameters( commandpython, args[server.py], envNone, ) async def run(): async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() # 1. 拿到 Server 暴露的工具 tools await session.list_tools() tool_specs [ { type: function, function: { name: t.name, description: t.description, parameters: t.inputSchema, }, } for t in tools.tools ] print(可用工具:, [t.name for t in tools.tools]) # 2. 把工具清单交给模型 resp llm.chat.completions.create( modelclaude-3-5-sonnet, messages[{role: user, content: 帮我算一下 12 加 30}], toolstool_specs, ) msg resp.choices[0].message print(模型决定:, msg.tool_calls) # 3. 执行模型选择的工具 for call in msg.tool_calls or []: args eval(call.function.arguments) result await session.call_tool(call.function.name, argumentsargs) print(f工具 {call.function.name} 返回:, result.content[0].text) if __name__ __main__: asyncio.run(run())跑之前确认TAOTOKEN_API_KEY已经导出。执行python client.py你应该看到类似输出可用工具: [add, greet] 模型决定: [ChatCompletionMessageToolCall(... nameadd, arguments{a: 12, b: 30})] 工具 add 返回: 42到这一步一个完整的 MCP 工具调用链路就跑通了Server 提供工具Client 发现工具TaoToken 通道上的模型决定调用哪个工具Client 执行并把结果拿回来。整个过程模型没有硬编码任何函数名全靠工具描述自己判断。5. 本篇常见错排查报错一ModuleNotFoundError: No module named mcp。说明依赖没装到当前解释器。用 uv 的话确认是在项目目录下执行uv run用 pip 的话确认pip install mcp[cli]装的是你运行脚本的那个 Python。虚拟环境切换最容易出这个问题。报错二Client 连不上 Server卡在initialize。九成是args里的server.py路径不对。StdioServerParameters的command和args是相对当前工作目录的如果你在别的目录跑client.py就找不到server.py。解决办法是写绝对路径或者用os.path.dirname(__file__)拼出来。报错三模型返回 401 或 403。检查TAOTOKEN_API_KEY是否真的导出到了当前 shell。export只对当前会话有效换个终端就没了。可以在代码里加一句print(os.environ.get(TAOTOKEN_API_KEY))确认读到了。另外确认base_url是https://taotoken.net/api不要写成别的路径。报错四模型不调用工具直接回文字。这通常是工具描述写得太模糊或者模型本身对 function calling 支持不好。把 docstring 写清楚参数说明具体一点。如果还是不行换一个对工具调用支持更稳的模型名试试。报错五eval解析参数报错。上面示例用eval只是为了演示生产里应该用json.loads(call.function.arguments)因为模型返回的是 JSON 字符串。用eval遇到复杂嵌套会出问题也不安全。6. 接下来怎么继续深入跑通这个最小例子之后你可以往几个方向扩展。一是给 Server 加更多工具比如读文件、查数据库、调 HTTP 接口观察模型怎么在多个工具之间选择。二是把 stdio 换成 SSE 传输让 Server 跑在远端Client 通过 URL 连接这样多个客户端能共享同一个 Server。三是把 Client 换成 LangChain 或 LangGraph 的 Agent让模型自己决定多轮工具调用而不是只调一次。如果你打算长期做编码类 Agent反复调试工具调用会消耗不少额度可以了解一下 TaoToken 的 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用场景。想直接在网页里验证模型对工具调用的理解可以用模型对话页https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数问题先翻这里。最后留一个实用习惯每次改完 Server 的工具定义先用uv run mcp dev server.py确认工具列表和参数 schema 正确再去跑 Client。这样能把「Server 问题」和「模型问题」分开排查效率高很多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。