1. 为什么零基础也能在 5 分钟内跑通一个 MCP 服务
MCP 服务(Model Context Protocol Server)说白了就是给大模型装的一双手:模型本身只会聊天,但通过 MCP 协议,它能调用你写的函数去读文件、查数据库、发请求。你不需要懂协议底层,只要会写 Python 函数,就能把一个能力暴露给支持 MCP 的客户端。适合谁?适合刚接触 AI 工具链、想让自己的脚本被模型直接调用的开发者,也适合想把内部小工具接进 AI 工作流的人。
我试过从零搭一个最小可用的 MCP 服务,整个过程比想象中短。核心就三件事:装 SDK、写工具函数、配客户端。真正卡人的不是代码,而是环境版本和客户端配置路径。这篇就按“能复制、能跑通、能排错”的节奏来,最后把它接到 TaoToken 的统一 Key 通道上,让模型调用走同一个入口,省得每个工具配一套密钥。
先说清楚 MCP 服务能做什么。它把普通函数变成模型可发现的“工具”,模型看到工具名和文档字符串后,会自己决定什么时候调用、传什么参数。比如你写一个say_hello(name),用户在客户端里说“跟张三打个招呼”,模型就会自动调这个函数。这就是 MCP 的价值:不用改模型,只加函数。
环境要求很明确:Python ≥ 3.10,推荐 3.10 或 3.11。低于 3.10 会因为类型注解和异步特性报错。开发工具方面,Cline、Cursor、Claude Desktop 都能作为测试客户端,调试阶段也可以用 MCP Inspector 看消息流。下面从环境准备开始,一步步来。
2. TaoToken 统一 Key 前置准备:一次配置多处复用
在写 MCP 服务之前,先把 TaoToken 的通道准备好,这样后面客户端调用模型时不用来回换 Key。TaoToken 提供统一的 API 入口,兼容主流模型调用格式,你只需要一个 Key 就能在多个工具里复用。
第一步,打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册并登录。登录后进入控制台,找到 API Keys 页面,路径是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。在这里创建一个新的 Key,复制保存好,后面配置客户端和 MCP 服务都要用。
第二步,确认你要用的模型 ID。不同客户端对模型名的写法略有差异,但 TaoToken 的通道统一走 https://taotoken.net/api 这个 Base URL。你可以在模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 先试一下模型能不能正常回复,确认 Key 有效。
第三步,如果你打算长期做编码或 Agent 类任务,可以了解 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它更适合高频调用场景。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各客户端的详细配置说明。
这里要强调一个概念:MCP 服务本身不直接调用模型,它只是暴露工具。真正调用模型的是客户端(比如 Cline)。所以“接入 TaoToken 统一 Key”指的是让客户端走 TaoToken 的通道,而 MCP 服务负责提供工具能力。两者配合,才是完整的端到端链路。
配置时记住三件套:Base URL 填https://taotoken.net/api,API Key 填你刚创建的那串,Model ID 填你要用的模型名。这三样在 Cline、Claude Code、Codex 等客户端里都要填全,缺一个就会报 401 或模型找不到。
3. 可复制配置:MCP 服务初始化与工具注册
这一节是核心,直接给可复制的代码和配置。先建虚拟环境,再装 SDK,然后写服务文件。
创建并激活虚拟环境:
python -m venv mcp-env source mcp-env/bin/activate # Linux/Mac # Windows 用 mcp-env\Scripts\activate安装 MCP SDK:
pip install mcp验证安装:
mcp version正常会返回类似1.5.0的版本号。如果提示命令找不到,说明 SDK 没装进当前环境,检查虚拟环境是否激活。
接下来写服务文件custom_mcp.py。这个文件定义了两个工具、一个资源和一个提示模板,覆盖最常见的三种能力:
from mcp.server.fastmcp import FastMCP import os mcp = FastMCP() @mcp.tool() def list_desktop_files() -> list: """获取当前用户桌面上的所有文件列表""" desktop_path = os.path.expanduser("~/Desktop") return os.listdir(desktop_path) @mcp.tool() def say_hello(name: str) -> str: """生成个性化问候语,输入姓名返回问候""" return f"你好 {name}! (Hello {name}!)" @mcp.resource("config://app_settings") def get_app_config() -> dict: """返回应用配置信息""" return {"theme": "dark", "language": "zh-CN"} @mcp.prompt() def code_review_prompt(code: str) -> str: """生成代码审查提示模板""" return f"请审查以下代码并指出问题:\n\n{code}" if __name__ == "__main__": mcp.run(transport='stdio')关键点说明:工具函数的返回值必须是 JSON 可序列化的类型,字符串、列表、字典都行,别返回自定义对象。文档字符串很重要,模型靠它理解工具用途,写清楚“做什么、参数是什么”。
传输协议选stdio适合本地 IDE 集成,客户端直接拉起进程通信。如果要远程部署,改成transport='sse',但那就需要额外的 Web 服务配置,5 分钟版本先用 stdio。
客户端配置以 Cline 为例,编辑cline_mcp_settings.json:
{ "mcpServers": { "custom_mcp": { "command": "python3", "args": [ "/你的绝对路径/custom_mcp.py" ] } } }注意args里必须是绝对路径,相对路径客户端解析不到。Windows 下command可能要写python而不是python3。
如果你用的是 Claude Code,配置走settings.json,结构类似,但字段名可能不同。Claude Code 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite ,里面有完整的 Base URL、Key、Model ID 三件套写法。Codex 则用auth.json,同样要填全这三项。
4. 验证请求:从本地调试到端到端调用成功
写完代码别急着接客户端,先用 MCP Inspector 看消息流,确认服务本身没问题。
启动 Inspector:
npx @modelcontextprotocol/inspector python custom_mcp.py它会打开一个 Web 界面,你能看到服务注册了哪些工具、资源、提示。点开say_hello,手动传参name=张三,应该返回你好 张三! (Hello 张三!)。如果这里就报错,说明服务代码有问题,先解决再往下走。
本地验证通过后,配置客户端。以 Cline 为例,把上面的 JSON 写进配置文件,刷新客户端。然后在对话框里输入“我的桌面有哪些文件”,模型应该会自动调用list_desktop_files并返回文件列表。
这一步如果模型没调用工具,检查两点:一是工具文档字符串是否清晰,二是客户端是否真的加载了 MCP 服务。可以在客户端日志里搜mcp关键字,看有没有连接成功的记录。
端到端调用时,客户端会先走 TaoToken 的通道请求模型,模型决定调用哪个工具,客户端再通过 stdio 把调用转发给你的 MCP 服务,服务返回结果,模型再组织语言回复。整条链路里,TaoToken 负责模型侧,MCP 服务负责工具侧。
验证模型通道是否正常,可以在模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 发一条消息,确认能收到回复。如果那边正常,客户端这边报错,问题多半在客户端配置或 MCP 服务本身。
实测下来,最容易出问题的是路径和权限。list_desktop_files在 macOS 上可能因为沙箱权限读不到桌面,换成读取项目目录更稳。生产环境记得限制工具访问范围,别让模型随便读整个文件系统。
5. 本篇常见错排查:401、local proxy failed 与 OAuth 报错
这一节对照真实报错来。你大概率会遇到下面几种。
401 Unauthorized:Key 没填对或没带上。检查客户端里的 API Key 是否是 TaoToken 控制台创建的那串,Base URL 是否是https://taotoken.net/api。如果 Key 复制时带了空格,也会 401。重新复制一次,确保三件套齐全。
local proxy failed / connection refused:客户端连不上 MCP 服务。常见原因是args里的路径写错,或者 Python 解释器路径不对。把command改成绝对路径的 Python,比如/usr/bin/python3,args用绝对路径指向custom_mcp.py。Windows 下路径要用双反斜杠或正斜杠。
reading 'choices' 报错:这通常是模型返回格式不符合预期,多半是 Model ID 填错,或者客户端把非 OpenAI 格式的响应当 OpenAI 解析。确认 Model ID 和 TaoToken 文档里写的一致,Base URL 不要多加/v1之类的后缀,除非文档明确要求。
OAuth 相关报错:有些客户端默认走 OAuth 流程,但 TaoToken 用的是 API Key 模式。在客户端设置里把认证方式改成 API Key,别选 OAuth。Claude Code 和 Codex 的配置里都有这个选项,填 Key 而不是走登录。
工具未被识别:客户端刷新后看不到工具。检查@mcp.tool()装饰器是否加上,文档字符串是否存在,函数参数和返回值类型是否明确。Inspector 里能看到但客户端看不到,多半是客户端缓存,重启客户端。
传输协议不兼容:客户端只支持 stdio,你配了 sse,就连不上。5 分钟版本统一用 stdio,远程部署再考虑 sse。
排错时优先看客户端日志,日志里会打印 MCP 服务的启动命令和报错堆栈。如果日志里连启动命令都没有,说明配置文件没被读取,检查文件路径和 JSON 格式。
6. 把 MCP 服务接进你的日常工作流
跑通之后,你可以把这个模式复制到任何工具上。比如把内部 API 封装成 MCP 工具,模型就能直接查数据;把常用脚本注册进去,模型就能帮你执行。关键是把工具函数写小、写清楚,一个函数只做一件事,文档字符串写明白参数含义。
长期做编码或 Agent 任务的话,Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 比按次调用更划算,适合高频场景。接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里有各客户端的完整配置示例,遇到字段不确定时直接对照。
最后留一个实用技巧:MCP 服务的工具函数尽量做成幂等的,模型可能会重复调用同一个工具。读操作无所谓,写操作要加确认逻辑,避免模型误触发。把custom_mcp.py放进版本控制,每次改完用 Inspector 验一遍再接客户端,能省掉大量调试时间。