Python实现一个简单的MCP:从零搭建可调试的MCP Server与TaoToken接入实践
1. 从零理解 MCPPython 手写一个可调试的 MCP Server 到底在做什么MCPModel Context Protocol说白了就是一套“让模型调用外部工具”的约定。你可以把它想成模型和你的代码之间的一份菜单模型看到菜单上有哪些工具、每个工具要什么参数然后决定点哪道菜你的 MCP Server 负责把这道菜做出来再把结果端回去。Python 实现一个简单的 MCP核心就三件事注册工具、路由请求、把结果按协议格式返回。很多人第一次接触 MCP 会以为它很玄其实底层交互非常朴素。以常见的客户端为例你在对话框里提问客户端把你的问题连同“当前可用的 tools 列表”一起发给模型模型分析后决定调用哪个 tool并给出参数客户端通过 MCP Server 执行这个 tool执行结果回传给模型模型再用自然语言把结果组织成回答展示给你。整条链路里MCP Server 就是那个“真正干活”的角色。这篇面向的是想自己动手写一个最小可用 MCP Server 的 Python 开发者。你不需要先精通协议细节只要会写异步函数、懂一点类型注解就能跟着把 server.py 骨架搭起来注册两个工具本地跑通再把 endpoint 切到 TaoToken 完成一次真实的工具调用验证。适合谁适合正在做 Agent、想让模型调用自己业务接口、又不想被复杂框架绑住的人。我试过用官方 SDK 的 FastMCP 类来搭体验是它用 Python 的 type hints 和 docstring 自动生成 tool definition省掉了手写 JSON Schema 的麻烦。你只要写一个带类型注解的 async 函数加个装饰器它就能被模型识别。下面从环境准备开始一步步来。2. TaoToken 前置准备Python MCP Server 接入大模型 API 的 Base URL 与 Key 配置在写 Server 之前先把“模型侧”的接入准备好。MCP Server 本身只负责执行工具真正决定调用哪个工具的是模型所以你需要一个能访问模型 API 的入口。这里用 TaoToken 来做模型接入它的接口兼容主流协议Base URL 和 Key 配好之后客户端或你的调试脚本就能直接调模型。先拿到 API Key。打开 https://taotoken.net/api-keys 登录后创建一个 Key复制保存。注意 Key 只在创建时完整显示一次丢了就重新建一个。这个 Key 后面会写进配置里别硬编码进 Git 仓库。Base URL 用 https://taotoken.net/api 这是接口根地址不要在后面乱加斜杠。模型 ID 按你实际要用的填比如 claude 系列或 gpt 系列的模型标识具体以控制台模型列表为准。你可以到 https://taotoken.net/console 查看可用模型和额度情况。如果你用的是 Claude Code 这类工具配置方式略有不同可以参考接入文档 https://taotoken.net/doc 里的说明。文档里对 Base URL、Key、Model ID 三件套的填法讲得比较清楚。对于本篇的 MCP 调试我们主要用 Python 脚本直接请求所以只要保证 Base URL 和 Key 正确即可。这里要强调一个容易踩的点MCP Server 和模型 API 是两个独立的东西。Server 负责执行工具模型 API 负责决策。很多人把两者混在一起结果调试时不知道是工具没注册成功还是模型没调通。分开验证问题就好定位。先把模型 API 用 curl 或 Python 请求通再回来调 MCP 工具链路。3. 可复制配置server.py 骨架、依赖清单与 MCP 工具注册这一节是核心直接给可复制的代码和配置。先建项目目录用 uv 管理环境用 conda 也行命令自行替换。uv init mcp-demo cd mcp-demo uv venv # Windows 激活 .venv\Scripts\activate # macOS/Linux 激活 source .venv/bin/activate uv add mcp[cli] httpx依赖清单里mcp[cli] 提供 FastMCP 和命令行调试能力httpx 用来发异步 HTTP 请求。装完后新建 server.py写入下面的骨架from typing import Any import httpx from mcp.server.fastmcp import FastMCP # 初始化 FastMCP server名字会出现在客户端工具列表里 mcp FastMCP(demo-server) # 模型 API 配置实际使用时从环境变量读取更安全 TAOTOKEN_BASE_URL https://taotoken.net/api TAOTOKEN_API_KEY sk-你的Key async def call_model(prompt: str) - str: 调用 TaoToken 模型接口返回文本结果。 headers { Authorization: fBearer {TAOTOKEN_API_KEY}, Content-Type: application/json, } payload { model: 你的模型ID, messages: [{role: user, content: prompt}], } async with httpx.AsyncClient() as client: resp await client.post( f{TAOTOKEN_BASE_URL}/v1/chat/completions, headersheaders, jsonpayload, timeout60.0, ) resp.raise_for_status() data resp.json() return data[choices][0][message][content] mcp.tool() async def echo(text: str) - str: 原样返回输入文本用于验证工具链路是否打通。 Args: text: 任意字符串 return fecho: {text} mcp.tool() async def ask_model(question: str) - str: 把问题转发给 TaoToken 模型并返回回答。 Args: question: 要问模型的问题 try: return await call_model(question) except Exception as e: return f调用模型失败: {e} if __name__ __main__: mcp.run(transportstdio)这段代码里mcp.tool()装饰器把普通 async 函数注册成 MCP 工具函数名就是工具名docstring 会成为工具描述参数类型注解会生成参数 schema。echo用来做链路自检ask_model演示在工具内部再调模型 API这是很多 Agent 场景的典型结构。如果你用 Cline 或 Claude Code 这类客户端配置通常是一个 JSON 片段路径和字段名要对齐。以常见的 MCP 客户端配置为例{ mcpServers: { demo-server: { command: uv, args: [run, server.py], env: { TAOTOKEN_API_KEY: sk-你的Key } } } }注意 Base URL、Key、Model ID 三件套要齐全Base URL 是 https://taotoken.net/api Key 从 API Keys 页面拿Model ID 按控制台实际模型填。少任何一个工具调用都会失败。4. 验证请求本地启动 MCP Server 并完成一次工具调用代码写好后先本地跑起来。用官方 CLI 调试最方便uv run mcp dev server.py这会启动一个调试界面能看到已注册的工具列表。如果echo和ask_model都出现了说明注册成功。接着在调试界面里调用echo输入hello应该返回echo: hello。这一步验证的是 MCP 协议链路本身不涉及模型。然后验证ask_model。调用它并传入用一句话解释什么是 MCP如果返回一段模型生成的解释说明工具内部调用 TaoToken 模型 API 也通了。这一步同时验证了两条链路MCP 工具执行 模型 API 请求。如果你想用脚本方式验证可以写一个简单的 stdio 客户端或者直接用 curl 先单独测模型 APIcurl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:你的模型ID,messages:[{role:user,content:ping}]}返回里有choices字段就说明模型侧没问题。再回到 MCP 调试界面调ask_model成功结果应该是一段自然语言回答。实测下来把两条链路分开验证排错效率高很多。成功结果长这样调试界面显示工具调用状态为 completed返回内容是你问的问题的模型回答。如果echo通了但ask_model不通问题一定在模型 API 配置上而不是 MCP 协议。5. 本篇常见错排查401、local proxy failed、reading choices 与 OAuth 报错调试 MCP Server 时报错基本集中在几类。下面按真实报错对照排查。第一类401 Unauthorized。这通常是 Key 不对或没带上。检查Authorization头是不是Bearer sk-xxx格式Key 有没有多余空格环境变量有没有真的传进去。如果你在客户端配置里写了env确认字段名和代码里读取的变量名一致。第二类local proxy failed或连接被拒。这多半是 Base URL 写错比如多加了/v1或结尾斜杠。Base URL 就用 https://taotoken.net/api 路径拼接交给代码。另外确认本机网络能正常访问该地址公司网络限制也可能导致连接失败。第三类reading choices相关报错比如KeyError: choices或list index out of range。这说明请求返回了但结构不是预期的 chat completions 格式。常见原因是 Model ID 填错或者请求体字段名不对。打印完整响应体再定位别只看异常信息。第四类OAuth 相关报错。如果你用的是 Claude Code 这类带 OAuth 流程的工具报错可能出现在授权环节。这时候检查接入文档里的配置步骤确认 Base URL 和 Key 的填法符合要求。OAuth 和 API Key 是两种不同的鉴权方式别混用。还有一个隐蔽的坑MCP Server 用 stdio 传输时任何print输出都会污染协议流导致客户端解析失败。调试信息一律用sys.stderr或日志文件别用print。这个坑我踩过排查了半天才发现是调试打印惹的祸。6. 语义一致 CTA把 MCP Server 接到真实模型与长期编码场景工具链路跑通后下一步就是把它接到真实使用场景。如果你主要做模型对话验证可以到 https://taotoken.net/chat 直接体验模型对话确认模型侧行为符合预期。如果你要把 MCP 用在长期编码或 Agent 任务里建议看 Coding Plan https://taotoken.net/coding-plan 它更适合持续性的开发场景。接入文档在 https://taotoken.net/doc 里面覆盖了 Base URL、Key、Model ID 的完整配置说明遇到鉴权或路径问题先查这里。API Key 管理在 https://taotoken.net/api-keys Key 泄露或额度异常时及时轮换。控制台 https://taotoken.net/console 可以看用量和模型列表。回到代码本身一个实用的技巧是把call_model里的模型 ID 和 Base URL 抽成环境变量这样本地调试和线上部署用同一份代码只换配置。另外给工具函数加超时和重试模型 API 偶尔抖动时不会直接把整个 MCP 调用拖死。最后工具描述docstring写清楚模型选工具的准确率会明显提升这比调参管用。

相关新闻

AI编程工具中Skill与Rule的区别及配置技巧详解

AI编程工具中Skill与Rule的区别及配置技巧详解

项目标题: 【AI编程工具】-Skills和Rule傻傻分不清?(一文带你读懂)项目正文: (无)关键词: AI编程, Skill, Rule, 工具配置, 使用技巧摘要描述: 针对AI编程工具中Skills与Rule功能容易混淆的问题,系统拆解两者的定义边界、运作逻辑、配置方式与适用场景,…

2026/10/17 23:57:52 阅读更多 →
【爆肝万字】SalesGPT 完全指南(一):从零搭建你的第一个 AI 销售代理

【爆肝万字】SalesGPT 完全指南(一):从零搭建你的第一个 AI 销售代理

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

2026/10/17 23:57:52 阅读更多 →
openclaw 部署指南:手动 Docker 详细版 + TaoToken 统一 Key 接入

openclaw 部署指南:手动 Docker 详细版 + TaoToken 统一 Key 接入

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

2026/10/17 23:57:52 阅读更多 →

最新新闻

NPDP BOK第二版:七大知识领域解析与产品开发实战应用

NPDP BOK第二版:七大知识领域解析与产品开发实战应用

简介:这是PDMA(产品发展与管理协会)官方编译的NPDP知识体系指南第二版,面向计划参加NPDP认证考试的产品经理与产品开发专业人士,是系统了解产品创新与管理核心内容的权威参考书。全书围绕七大领域展开:策略…

2026/10/18 0:45:28 阅读更多 →
CATIA三维文字制作:从CAD空心字到凸台拉伸的版本兼容全攻略

CATIA三维文字制作:从CAD空心字到凸台拉伸的版本兼容全攻略

简介:面向机械制造与产品设计人员的CATIA三维文字制作教程,重点解决在零件表面创建空心标识文字的难题。文档以AutoCAD辅助生成空心字为主线,详细介绍通过“t”新建文字,使用“textfill”“txtexp”分解文字、再以“x”“e”清理多…

2026/10/18 0:45:28 阅读更多 →
KingSCADA图形组态实战:液位罐、管道流动与阀门控制四步落地

KingSCADA图形组态实战:液位罐、管道流动与阀门控制四步落地

简介:本资源是一份面向工业自动化领域初学者与现场工程师的KingSCADA系统实操教程,聚焦SCADA组态开发核心能力培养,解决从画面构建到数据监控的全流程落地问题。文档为单个Word文件(.doc),大小2.65MB&#…

2026/10/18 0:45:28 阅读更多 →
图书订购与考务系统数据流图绘制指南:分层设计与避坑要点

图书订购与考务系统数据流图绘制指南:分层设计与避坑要点

简介:围绕图书订购与考务系统数据流图设计,提供了一套二十四页PPT教学资料,从顶层DFD、一层DFD到二层DFD逐级拆解,覆盖学生注册课程系统、图书订购系统、资格和水平考试考务处理系统三大案例,详细讲解加工、数据流、文…

2026/10/18 0:45:28 阅读更多 →
智能家居语音控制MVP开发:从需求分析到交付的实战指南

智能家居语音控制MVP开发:从需求分析到交付的实战指南

简介:一份产品经理项目实战案例的Word文档,以互联网平台产品开发、智能家居设备MVP落地等典型项目为主线,面向产品新人、转岗从业者以及需要沉淀完整产品流程经验的产品团队。案例围绕市场调研、竞品分析、产品定位、需求优先级划分、路线图制…

2026/10/18 0:45:28 阅读更多 →
MATLAB实现ARIMA-BP组合模型:小样本时间序列预测实战

MATLAB实现ARIMA-BP组合模型:小样本时间序列预测实战

简介:一份基于MATLAB实现的ARIMA-BP组合模型时间序列预测文档,面向具备一定数学统计基础、初步了解机器学习的研究生或数据分析师,适用于经济、天气预报等多领域长期趋势预测场景。内容系统讲解ARIMA模型(p、d、q参数)…

2026/10/18 0:44:27 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →