☰
使用 Python 构建基础 MCP 服务器:TaoToken 统一 Key 接入与本地调试
2026/10/7 19:26:29 网站建设 项目流程

1. 从零搭一个 Python MCP 服务器,为什么还要接统一 Key

你可能已经在 Claude Desktop 或 Cline 里见过 MCP 这个词。MCP 全称 Model Context Protocol,说白了就是给 AI 客户端开的一个“本地小接口”:你写几个 Python 函数,注册成工具,AI 就能在对话里调用它们,去读你电脑上的文件、查数据库、跑统计。它不是什么远程大服务,更像你自己电脑上跑的一个 mini API,只给本地 AI 助手用。

我这次要做的,是一个叫mix_server的本地 MCP 服务器,用 Python + MCP SDK 写两个工具:summarize_csv_file和summarize_parquet_file,分别对 CSV 和 Parquet 文件做行列摘要。做完之后,AI 就能用自然语言问“sample.csv 有多少行多少列”,服务器返回真实数据。

但这里有个现实问题:MCP 服务器本身只负责“工具”,它不负责模型调用。你真正让 AI 跑起来,还是得有一个能访问大模型的通道。很多人在这一步卡住——要么本地没配好模型入口,要么每个项目各写一套 Key,乱得不行。我的做法是把它接到 TaoToken 的统一 Key/API 通道上,一个 Key 管住模型调用,MCP 服务器专心做工具,两边解耦。TaoToken 的 API 地址是https://taotoken.net/api,官网在https://taotoken.net/?utm_source=taotoken_aicg_blog_end,下面会给出可复制的配置。

这篇适合谁:会一点 Python、想让 AI 读本地数据、但不想折腾一堆模型配置的人。全程本地运行,不依赖 web 框架,主要靠 Python 和 pandas。你跟着敲,最后能拿到一个可被客户端发现并调用的 MCP 服务。

2. TaoToken 前置:把统一 Key 和 MCP 服务器接起来

在写工具之前,先把“模型通道”这件事定下来。MCP 服务器负责暴露工具,客户端负责发起对话,而对话背后要调模型。如果你用 Claude Desktop,它自带模型;但如果你想像我一样,在 Cline、Codex 或者自建客户端里复用同一套 Key,就需要一个统一的入口。TaoToken 在这里扮演的就是这个角色:它提供兼容的 API 通道,你拿一个 Key,就能在多个客户端里调模型,不用每个工具单独配。

先说清楚它不是什么:它不是 MCP 服务器本身,也不替代你的编辑器。它就是一个模型调用的统一入口。MCP 服务器和它是并列关系——一个管工具,一个管模型。

你需要准备的东西:

  • 一个 TaoToken 账号,去官网注册后进控制台
  • 在控制台里创建一个 API Key
  • 记下 Base URL:https://taotoken.net/api
  • 选一个你要用的 Model ID,比如对话类或编码类模型

具体操作路径:打开https://taotoken.net/api-keys(这是 API Keys 页面),新建一个 Key,复制出来。注意 Key 只显示一次,存好。然后去https://taotoken.net/console可以看到你的用量和额度。如果你主要做长期编码或 Agent 类任务,可以看下https://taotoken.net/coding-plan,它更适合持续调用的场景。

为什么要在 MCP 教程里讲这个?因为很多人搭完 MCP 服务器,发现客户端连上了但模型调不动,报 401 或者 local proxy failed。根因往往不是 MCP 写错了,而是模型通道没配好。把 TaoToken 的 Base URL + Key + Model ID 这三件套先备齐,后面配置里直接填,能省掉一半排障时间。

这里给一个通用的三件套对照,后面无论你接 Claude Code、Cline 还是 Codex,都是这三个值:

配置项值说明
Base URLhttps://taotoken.net/api统一 API 入口,不加 UTM
API Key控制台生成只显示一次,妥善保存
Model ID按需选择对话/编码类按场景挑

注意:Base URL 用https://taotoken.net/api,不要带查询参数。Key 不要写进会提交到 Git 的文件里,用环境变量或本地配置文件。

如果你用的是 Claude Code 这类工具,它的配置里同样需要这三件套。Claude Code 的接入文档在https://taotoken.net/doc,里面有对应客户端的填写位置。把这一步做完,你的 MCP 服务器才有“后端模型”可调。

3. 可复制配置:项目结构、依赖与 server 配置片段

现在进入动手环节。我用uv管理项目,它比 pip + venv 省事,依赖、虚拟环境、脚本运行一条龙。

先装 uv:

curl -LsSf https://astral.sh/uv/install.sh | sh

装完重开终端,验证:

uv --version

然后初始化项目:

uv init mix_server cd mix_server uv venv source .venv/bin/activate

加依赖,三个就够:

uv add "mcp[cli]" pandas pyarrow

mcp[cli]是 MCP SDK 和命令行工具,pandas处理 CSV,pyarrow给 pandas 加 Parquet 支持。

目录结构建议这样,后面加工具不用改主入口:

mix_server/ ├── data/ # CSV 与 Parquet 数据文件 ├── tools/ # MCP 工具定义 ├── utils/ # 可复用的数据读取逻辑 ├── server.py # MCP 服务器主入口 └── README.md

建目录和文件:

mkdir data tools utils touch server.py

先造示例数据。data/sample.csv:

id,name,email,signup_date 1,Alice Johnson,alice@example.com,2023-01-15 2,Bob Smith,bob@example.com,2023-02-22 3,Carol Lee,carol@example.com,2023-03-10 4,David Wu,david@example.com,2023-04-18 5,Eva Brown,eva@example.com,2023-05-30

再写个转换脚本generate_parquet.py,把 CSV 转成 Parquet:

import pandas as pd df = pd.read_csv("data/sample.csv") df.to_parquet("data/sample.parquet", index=False)

跑一下:

uv run generate_parquet.py

现在data/下应该有sample.csv和sample.parquet两个文件。

接下来是关键的 server 配置片段。server.py里创建全局 MCP 实例,并导入工具模块:

from mcp.server.fastmcp import FastMCP mcp = FastMCP("mix_server") import tools.csv_tools import tools.parquet_tools if __name__ == "__main__": mcp.run()

工具通过装饰器在导入时自动注册,所以只要server.py里 import 了工具模块,它们就生效。

读取逻辑放utils/file_reader.py,避免重复代码:

import pandas as pd from pathlib import Path DATA_DIR = Path(__file__).resolve().parent.parent / "data" def read_csv_summary(filename: str) -> str: file_path = DATA_DIR / filename df = pd.read_csv(file_path) return f"CSV 文件 '{filename}' 包含 {len(df)} 行,{len(df.columns)} 列。" def read_parquet_summary(filename: str) -> str: file_path = DATA_DIR / filename df = pd.read_parquet(file_path) return f"Parquet 文件 '{filename}' 包含 {len(df)} 行,{len(df.columns)} 列。"

然后是两个工具文件。tools/csv_tools.py:

from server import mcp from utils.file_reader import read_csv_summary @mcp.tool() def summarize_csv_file(filename: str) -> str: """对 CSV 文件进行摘要统计,返回文件行列数量。""" return read_csv_summary(filename)

tools/parquet_tools.py:

from server import mcp from utils.file_reader import read_parquet_summary @mcp.tool() def summarize_parquet_file(filename: str) -> str: """对 Parquet 文件进行摘要统计,返回文件行列数量。""" return read_parquet_summary(filename)

到这里,MCP 服务器代码就齐了。如果你还要在客户端里配模型通道,比如 Cline 或 Codex,记得把三件套填全:Base URL 用https://taotoken.net/api,Key 用你控制台生成的,Model ID 按场景选。Codex 的auth.json里同样需要这三个值,具体字段位置看https://taotoken.net/doc。

4. 验证请求:启动服务器并跑一次端到端调用

代码写完,先本地跑起来:

uv run server.py

启动后终端不会刷很多日志,这是正常的,说明它在等客户端连接。

接下来配置客户端。以 Claude Desktop 为例,Mac/Linux 的配置文件在:

~/Library/Application Support/Claude/claude_desktop_config.json

Windows 在:

%APPDATA%\Claude\claude_desktop_config.json

写入如下 JSON,把路径换成你的项目绝对路径:

{ "mcpServers": { "mix_server": { "command": "uv", "args": [ "--directory", "/ABSOLUTE/PATH/TO/mix_server", "run", "server.py" ] } } }

重启 Claude Desktop,界面上会出现工具图标(通常是锤子),点开能看到summarize_csv_file和summarize_parquet_file两个工具。

现在做一次端到端验证。在对话里输入:

请总结 sample.csv 文件的内容。

客户端会选中summarize_csv_file,通过你的 MCP 服务器调用,返回类似:

CSV 文件 'sample.csv' 包含 5 行,4 列。

再试 Parquet:

sample.parquet 文件有多少行?

返回:

Parquet 文件 'sample.parquet' 包含 5 行,4 列。

如果你用的是 Cline 或带 MCP 支持的编辑器,配置方式类似,在 MCP 设置里加一个 server,command 填uv,args 填--directory /你的路径 run server.py。Cline 的 MCP 配置里同样可以引用 TaoToken 的三件套来调模型,Base URL 填https://taotoken.net/api。

验证成功的标志有三个:客户端工具列表里出现你的两个工具;自然语言提问能触发工具调用;返回结果里的行列数和你的数据文件一致。三个都满足,说明 MCP 服务可被正常发现与调用。

如果你想单独验证模型通道,可以打开https://taotoken.net/model-chat做一次对话测试,确认 Key 和 Base URL 没问题,再回到 MCP 客户端里联调。这样能把“工具问题”和“模型问题”分开定位。

5. 本篇常见错排查:401、local proxy failed、reading choices

搭 MCP 服务器时,报错基本集中在几类。我按真实遇到的顺序列一下,你对照着查。

401 Unauthorized。这个几乎都是 Key 的问题。检查三件事:Key 是不是复制完整(有没有多空格);Base URL 是不是写成了https://taotoken.net/api,有没有误加斜杠或参数;Key 是不是已经失效或在控制台被删了。如果你在客户端里配了模型通道,401 说明模型侧没通过,跟 MCP 工具本身无关。去https://taotoken.net/api-keys重新生成一个,替换掉旧值。

local proxy failed。这个报错通常出现在客户端尝试走本地代理连模型时。先确认你的 Base URL 填的是https://taotoken.net/api,而不是某个本地地址。然后检查客户端配置里有没有残留的代理设置,把它清掉。如果你在 Codex 的auth.json里配置,确认字段名和层级没写错,Base URL、Key、Model ID 三件套要齐全。缺任何一个都可能触发这个错。

reading 'choices' 报错。这通常意味着返回体结构和你预期的不一致,常见原因是 Model ID 填错,或者请求发到了不兼容的端点。检查你填的 Model ID 是否在可用列表里,Base URL 是否是https://taotoken.net/api。如果你在 Cline 里遇到,去 MCP 设置确认 server 配置和模型配置是分开的两块,别把 MCP 的 command 和模型的 Base URL 混在一起。

OAuth 相关报错。有些客户端会尝试 OAuth 流程,如果你用的是 Key 方式,就不需要走 OAuth。检查配置里是不是误开了 OAuth 选项,关掉它,改用 Key。Claude Code 的接入方式在https://taotoken.net/doc里有说明,按文档填 Key 即可。

工具不出现。客户端重启后工具列表为空,先确认uv run server.py没异常退出;再确认配置文件里的绝对路径正确;然后确认data/下有sample.csv和sample.parquet。如果工具出现了但调用报错,看服务器终端有没有 Python 异常,多半是文件路径或 pandas 读取问题。

CC Switch / Cline MCP / Codex auth.json 配置不全。这三个场景只要出现,就必须写全三件套:Base URL + Key + Model ID。少一个都会在调用时报错。CC Switch 里切换配置时,确认每个 profile 都带全这三个值。Cline 的 MCP 配置和模型配置分开填,别混。Codex 的auth.json里字段层级要对,具体参考https://taotoken.net/doc。

排障的顺序建议:先单独验证模型通道(用https://taotoken.net/model-chat),再验证 MCP 服务器(uv run server.py不报错),最后联调。这样能把问题范围缩小到具体一层。

6. 继续扩展:从两个工具到一套工作流

到这里,你已经有一个能跑的 MCP 服务器,两个工具,一套统一 Key 通道。接下来可以往上加东西。

加更多工具很简单,在tools/下新建文件,用@mcp.tool()装饰函数,然后在server.py里 import 就行。比如加一个统计均值的工具,或者列出字段名的工具。结构不用动。

想暴露静态数据给 AI 做上下文,可以用@mcp.resource()。想定义可复用的提示模板,用@mcp.prompt()。如果工具要调外部 API 或数据库,把函数改成async def,FastMCP 支持异步。

模型通道这边,如果你要长期跑编码或 Agent 任务,可以看下https://taotoken.net/coding-plan,它更适合持续调用的场景。日常调试和验证用https://taotoken.net/model-chat就够了。Key 管理在https://taotoken.net/api-keys,用量看https://taotoken.net/console。

最后说个实用技巧:把 Base URL、Key、Model ID 放在环境变量或本地.env里,别硬编码进代码。MCP 服务器和模型通道解耦之后,你换客户端、换模型,都只改配置,不动工具代码。这套模板可以直接复用到下一个项目里。

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

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

立即咨询