☰
如何构建一个用于 AI 的 MCP 服务:用 Python + uv 把本地工具接入 TaoToken
2026/10/12 20:43:06 网站建设 项目流程

1. 从本地脚本到 AI 工具:MCP 服务到底解决什么问题

你可能已经写过不少本地 Python 脚本:查数据库、读 CSV、调内部接口、跑一段数据清洗。这些脚本自己跑没问题,但一旦想让 Claude、Cursor 这类 AI 客户端直接调用,就卡住了——每个客户端接入方式不一样,工具描述格式不一样,参数传递也不一样。MCP(Model Context Protocol)就是来统一这件事的。

MCP 是 AI 的 USB-C 接口。在 USB-C 之前,每个设备一个充电口;MCP 之前,每个 AI 客户端接工具都要单独适配。MCP 定义了一套标准协议,让 AI 客户端(Host)通过 MCP Client 连接到你的 MCP Server,Server 把本地能力以「工具(Tool)」的形式暴露出去。AI 决定调用哪个工具、传什么参数,你的 Python 代码负责真正执行,再把结果按协议返回。

这篇要做的,是用 Python + uv 从零搭一个可被 AI 调用的 MCP 服务,并让这个服务在需要访问模型能力时,通过 TaoToken 的统一 Key/API 通道走。适合谁?想让本地脚本、数据库查询、内部 API 被 Claude 等客户端调用的开发者;已经会用 Python,但没写过 MCP Server 的人;以及想把手头零散工具收拢成一个标准入口的人。

我试过把几个查询脚本直接塞进客户端配置,结果每换一个客户端就要重写一遍参数映射,维护成本很高。MCP 的价值就在于:Server 写一次,任何实现了 MCP Client 的宿主都能接。下面从环境准备开始,一步步给出可复制的命令和配置。

2. 用 uv 初始化 MCP 项目并接入 TaoToken 通道

uv 是 Rust 写的 Python 包与项目管理器,装依赖快、虚拟环境管理干净,特别适合 MCP 这种「一个 Server 一个独立环境」的场景。先装 uv:

# macOS / Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows PowerShell powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

装完确认版本:

uv --version

然后初始化项目。我习惯把 MCP Server 单独放一个目录,避免和主项目依赖打架:

uv init mcp-local-tools cd mcp-local-tools uv venv source .venv/bin/activate # Windows: .venv\Scripts\activate uv add "mcp[cli]" httpx

mcp[cli]提供 FastMCP 和命令行调试工具,httpx用于后续调用外部 API。到这里项目骨架就好了。

接下来是 TaoToken 的接入位置。TaoToken 在这里扮演的是「统一模型通道」:当你的 MCP 工具需要调用大模型(比如让模型对查询结果做摘要、做意图解析)时,不用在每个工具里硬编码各家厂商的 Key 和 Base URL,而是统一走 TaoToken 的 API 通道。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api 。

你需要先在控制台创建一个 API Key,然后把它放进环境变量,不要写死在代码里:

# macOS / Linux export TAOTOKEN_API_KEY="sk-你的Key" # Windows PowerShell $env:TAOTOKEN_API_KEY="sk-你的Key"

MCP Server 里读取这个环境变量即可。这样做的好处是:本地工具、数据库查询、模型调用共用一套凭证管理,换客户端时只改配置不改代码。控制台和 Key 管理页面在 https://taotoken.net/console 与 https://taotoken.net/api-keys ,接入细节可查 https://taotoken.net/doc 。

3. 可复制的 MCP Server 配置与工具代码

先写server.py。这里定义两个工具:一个查本地 SQLite 数据(模拟你的数据库查询场景),一个调用 TaoToken 通道让模型对结果做摘要。FastMCP 用装饰器注册工具,类型注解会自动生成参数 schema。

import os import sqlite3 import httpx from mcp.server.fastmcp import FastMCP mcp = FastMCP("local_tools") TAOTOKEN_BASE = "https://taotoken.net/api" TAOTOKEN_KEY = os.environ.get("TAOTOKEN_API_KEY", "") @mcp.tool() async def query_orders(status: str) -> str: """按状态查询本地订单表,status 例如 paid / pending / refunded。""" conn = sqlite3.connect("orders.db") cur = conn.cursor() cur.execute("SELECT id, amount, status FROM orders WHERE status = ? LIMIT 20", (status,)) rows = cur.fetchall() conn.close() if not rows: return f"没有状态为 {status} 的订单" return "\n".join(f"订单 {r[0]} 金额 {r[1]} 状态 {r[2]}" for r in rows) @mcp.tool() async def summarize_text(text: str) -> str: """调用 TaoToken 通道,让模型对给定文本做一句话摘要。""" if not TAOTOKEN_KEY: return "缺少 TAOTOKEN_API_KEY 环境变量" payload = { "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": f"用一句话总结:{text}"}], "max_tokens": 200, } headers = {"Authorization": f"Bearer {TAOTOKEN_KEY}"} async with httpx.AsyncClient(timeout=60) as client: resp = await client.post(f"{TAOTOKEN_BASE}/v1/messages", json=payload, headers=headers) if resp.status_code != 200: return f"调用失败:{resp.status_code} {resp.text[:200]}" data = resp.json() return data["content"][0]["text"] if __name__ == "__main__": mcp.run(transport="stdio")

注意summarize_text里的三件套:Base URL 是https://taotoken.net/api,Key 从环境变量读,Model ID 显式写在 payload 里。这三样缺一不可,后面排障会反复用到。

接着写客户端配置。以 Claude Desktop 为例,编辑claude_desktop_config.json(设置 → 开发者 → 编辑配置):

{ "mcpServers": { "local-tools": { "command": "/full/path/to/uv", "args": [ "--directory", "/full/path/to/mcp-local-tools", "run", "server.py" ], "env": { "TAOTOKEN_API_KEY": "sk-你的Key" } } } }

command用which uv(Windows 用where uv)查到的绝对路径,--directory用项目绝对路径。env里把 Key 传进去,这样 Server 启动时就能读到。如果你用的是 Cline 或支持 MCP 的编辑器,配置结构类似,同样是 command + args + env 三件套。

4. 端到端验证:从 stdio 调试到客户端真实调用

写完之后别急着接客户端,先用 MCP 自带的调试器验证工具能不能被正确发现和调用:

uv run mcp dev server.py

这会启动一个本地调试界面,列出所有注册的工具。点开query_orders,传status=paid,看返回是否符合预期。这一步能排除掉大部分 schema 和依赖问题。

调试通过后,重启 Claude Desktop。界面上会出现工具图标,说明 Server 已被识别。然后发一条自然语言请求:

帮我查一下状态为 paid 的订单,然后总结一下这些订单的情况。

正常流程是:Claude 先调用query_orders拿到订单列表,再把结果作为参数传给summarize_text,后者通过 TaoToken 通道请求模型生成摘要,最后把摘要返回给你。整个过程你能在客户端看到工具调用链。

如果只想单独验证 TaoToken 通道是否通,可以绕过 MCP 直接发一个请求:

curl https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"claude-sonnet-4-20250514","max_tokens":100,"messages":[{"role":"user","content":"说一句你好"}]}'

返回里有content数组且第一项有text,就说明 Key、Base URL、Model ID 三件套都对。这一步过了,MCP 里的模型调用基本不会出问题。想直接在网页里试模型对话,可以打开 https://taotoken.net/model-chat ;长期跑编码类 Agent 任务,可以看 https://taotoken.net/coding-plan 。

5. 常见报错排查:401、local proxy failed 与 reading choices

401 Unauthorized:最常见。先确认TAOTOKEN_API_KEY在 Server 进程里真的读到了。MCP Server 由客户端拉起,环境变量不会自动继承你终端里的 export,必须在配置文件的env字段里显式传。排查方法:在工具里临时返回os.environ.get("TAOTOKEN_API_KEY", "EMPTY")[:8],看前几位对不对。

local proxy failed / connection refused:通常是 Base URL 写错。TaoToken 的 API 基址是https://taotoken.net/api,拼路径时注意是/api/v1/messages,不要写成/v1/messages漏掉/api。另外确认没有多余的尾部斜杠导致双斜杠。

reading 'choices' of undefined:这个报错说明你按 OpenAI 的响应结构去解析了,但实际返回的是 Anthropic 风格结构。TaoToken 的 messages 接口返回的是content数组,取文本要用data["content"][0]["text"],不是data["choices"][0]["message"]["content"]。如果你用的是 OpenAI 兼容端点,则要对应改解析逻辑,别混用。

OAuth / 认证失败:如果你在客户端里配了 OAuth 流程但 Server 走的是 API Key,两者会冲突。MCP Server 用 stdio 传输时,认证应该完全由 Server 内部处理,客户端配置里只传 Key,不要额外挂 OAuth。

工具不出现:检查uv run mcp dev server.py能否列出工具。如果调试器里都没有,说明装饰器或导入有问题;如果调试器有但客户端没有,多半是配置文件路径写错,或者没重启客户端。

Codex auth.json 场景:如果你同时用 Codex 类客户端,它的auth.json里也要保证 Base URL、Key、Model ID 三件套一致,否则会出现「MCP 工具能调、但模型请求 401」的割裂现象。

6. 把工具收拢成标准入口之后

搭完这个 Server,你会发现原本散落的脚本有了统一出口:数据库查询、内部 API、文本处理,都注册成工具,AI 客户端按需调用。模型调用统一走 TaoToken 通道,Key 和 Base URL 只维护一份,换客户端时改配置不改代码。

下一步可以做的:把query_orders换成你真实的数据库连接,加上参数校验和超时;把summarize_text扩展成支持多轮对话;再注册一个写文件的工具,让 AI 能落地产出。工具越具体,AI 调用越准——别做一个「万能查询」工具,而是拆成「按订单号查」「按状态查」「按日期范围查」这种边界清晰的工具。

需要创建和管理 Key 时去 https://taotoken.net/api-keys ,接入细节查 https://taotoken.net/doc ,模型对话验证用 https://taotoken.net/model-chat 。把配置里的绝对路径和 Key 换成你自己的,跑通一次端到端调用,这套 MCP 服务就能长期用了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询