1. 周末两天,把 MCP 服务器跑起来到底值不值
MCP 服务器(Model Context Protocol Server)说白了就是给 AI 装的一根「USB 线」:模型本身只会聊天,但通过 MCP 协议,它可以调用你写的工具去查数据库、读文件、抓网页、调内部接口。你不需要改模型,只要按协议暴露几个 tool,Claude、Cursor、各类 Agent 客户端就能直接调用。适合谁?适合想给 AI 加「手脚」的后端、全栈、独立开发者,也适合只想周末折腾点新东西的技术爱好者。
我自己的判断是:MCP 现在处于「协议已定、生态刚起」的阶段,写一个能跑通的服务器,成本大概是一个下午,但你能因此理解 Agent 工具调用的完整链路——这比看十篇概念文章都值。这篇不聊商业化画饼,只交付一件事:从零搭一个本地 MCP 服务器,用 TaoToken 统一 Key/API 通道做模型侧调用,半天内跑通第一个服务,并且能验证它真的连通。
整篇会给你可复制的config.toml骨架、settings.json配置片段、启动命令、验证动作,以及我踩过的几个坑。你跟着做,周末结束前一定有一个能响应请求的 MCP 服务。
2. 前置准备:TaoToken 统一 Key 与 API 通道
MCP 服务器本身不绑定模型,但你要验证「AI 能调用我的工具」,就得有一个模型客户端去连它。这里用 TaoToken 做统一入口,好处是一个 Key 走通对话、编码、Agent 多条链路,不用在多个平台之间来回切。
先拿 Key。打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台创建 API Key。控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。Key 只在创建时完整显示一次,复制到本地环境变量里,别写进代码提交。
API 基地址是 https://taotoken.net/api ,注意这个地址不带任何查询参数,配置时直接填这一串。模型对话入口在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,你可以先在那里确认账号能正常出话,再去接 MCP。
环境变量建议这样设,Linux/macOS 写进~/.zshrc或~/.bashrc,Windows 用系统环境变量:
export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"注意:Key 属于凭证,任何截图、日志、Git 提交前都要检查一遍。我见过有人把 Key 打进
settings.json然后推到公开仓库,几分钟就被扫走。
如果你后面要长期跑编码类 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 ,参数细节以文档为准。
3. 可复制配置:config.toml 骨架与 settings.json 片段
先建项目目录,我用 Python 写 MCP 服务器,因为标准库够用、依赖少,周末不想折腾编译。
mkdir -p ~/mcp-weekend/src cd ~/mcp-weekend python3 -m venv .venv source .venv/bin/activate pip install "mcp[cli]" httpxconfig.toml放服务自身参数,包括监听方式、工具开关、上游模型通道。下面这份可以直接抄,改 Key 和端口即可:
# ~/mcp-weekend/config.toml [server] name = "weekend-mcp" version = "0.1.0" transport = "stdio" # 本地调试用 stdio,部署可换 sse log_level = "INFO" [upstream] # TaoToken 统一通道,模型侧调用走这里 base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" default_model = "claude-sonnet" timeout_seconds = 60 [tools] enable_echo = true enable_time = true enable_http_get = true http_allow_hosts = ["api.github.com", "httpbin.org"]settings.json是给 MCP 客户端(比如 Claude Desktop、Cursor)读的,用来告诉它「去哪启动这个服务器」。片段如下,路径换成你自己的:
{ "mcpServers": { "weekend-mcp": { "command": "/Users/you/mcp-weekend/.venv/bin/python", "args": ["/Users/you/mcp-weekend/src/server.py"], "env": { "TAOTOKEN_API_KEY": "sk-你的Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api" } } } }提示:
command一定要写虚拟环境里的 python 绝对路径,写python3经常因为客户端不继承你的 shell PATH 而启动失败,这是最高频的坑。
服务器主文件src/server.py,实现三个工具:echo 回显、time 取时间、http_get 做受限请求。核心是@server.tool()装饰器,每个函数就是一个可被 AI 调用的工具:
# ~/mcp-weekend/src/server.py import os, sys, json, datetime, tomllib import httpx from mcp.server.fastmcp import FastMCP CFG_PATH = os.path.join(os.path.dirname(__file__), "..", "config.toml") with open(CFG_PATH, "rb") as f: cfg = tomllib.load(f) server = FastMCP(cfg["server"]["name"]) @server.tool() def echo(text: str) -> str: """原样返回输入文本,用于连通性验证。""" return f"echo: {text}" @server.tool() def now_time() -> str: """返回服务器当前 UTC 时间。""" return datetime.datetime.utcnow().isoformat() + "Z" @server.tool() def http_get(url: str) -> str: """对白名单内的地址发起 GET,返回前 500 字符。""" allow = cfg["tools"]["http_allow_hosts"] host = httpx.URL(url).host if host not in allow: return f"blocked: {host} not in allowlist" r = httpx.get(url, timeout=15) return r.text[:500] if __name__ == "__main__": server.run(transport=cfg["server"]["transport"])启动命令就一句:
cd ~/mcp-weekend && .venv/bin/python src/server.pystdio 模式下它不会打印花哨的启动横幅,进程挂住等输入就是正常状态。想看日志把log_level调到DEBUG。
4. 验证请求:确认 MCP 服务真的连通
光启动不算跑通,要看到工具被真实调用。分两步验证。
第一步,用官方 Inspector 做协议层自检:
npx @modelcontextprotocol/inspector .venv/bin/python src/server.py浏览器打开它给的本地地址,在 Tools 面板里应该能看到echo、now_time、http_get三个工具。点echo,参数填hello mcp,返回echo: hello mcp就说明协议层通了。这一步不涉及模型,纯验证服务器实现。
第二步,接模型客户端。把第 3 节的settings.json片段合并进 Claude Desktop 的配置(设置 → 开发者 → 编辑配置),重启客户端。然后在对话里说:「调用 weekend-mcp 的 echo 工具,参数是 weekend-ok」。如果客户端弹出工具调用确认,并且返回echo: weekend-ok,整条链路就通了。
想顺带验证模型通道,可以在模型对话入口 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 先确认账号出话正常,再回到客户端测工具调用。实测下来,工具调用失败十有八九是客户端配置路径问题,不是服务器代码问题。
成功结果长这样:Inspector 里工具列表齐全、调用有返回;客户端里能看到工具名被高亮、参数被正确传入、结果回填到对话。两个都满足,你的第一个 MCP 服务器就算跑通了。
5. 本篇常见错排查
启动即退出,日志报ModuleNotFoundError: mcp:客户端用的 python 不是你装依赖的那个。检查settings.json里的command是否指向.venv/bin/python绝对路径。用which python在激活虚拟环境后确认。
Inspector 能连,客户端连不上:客户端不继承 shell 环境变量,TAOTOKEN_API_KEY必须在settings.json的env字段里显式写一遍,别指望它读你的~/.zshrc。
工具列表为空:@server.tool()装饰的函数必须在server.run()之前完成定义,且不能有语法错误。把log_level调成DEBUG,看启动阶段有没有异常被吞掉。
http_get返回 blocked:白名单没加目标域名。改config.toml的http_allow_hosts后重启服务。这是故意的安全设计,别为了图省事改成通配。
改了 config.toml 不生效:stdio 模式下配置在进程启动时读取一次,改完必须重启服务器和客户端。我踩过这个坑,对着旧配置调了半小时。
Key 报 401:确认base_url是https://taotoken.net/api,不要多加斜杠或路径;Key 前后不要有空格,复制时容易带上换行。
6. 下一步:把周末项目接进长期工作流
跑通之后,你有两条路可以走。一条是继续加工具:把公司内部 API、本地文件检索、数据库查询封装成 tool,让 AI 真正能操作你的环境。另一条是把它接进日常编码流程,让 Agent 在写代码时能调用你的工具链。
如果你打算长期跑编码类 Agent,建议看下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,配合统一 Key 能省掉不少切换成本。接入细节和参数以文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Key 管理在控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,需要新建或轮换 Key 时去那里操作。
最后给个实用建议:先把echo和now_time这两个「无副作用」工具跑稳,再去接真实数据源。工具一旦能改数据,调试成本会翻倍。周末项目嘛,先让它动起来,再让它有用。