
你照着 MCP 入门教程写完weather.py在claude_desktop_config.json里加了weather服务保存后重启 Claude for Desktop然后问“纽约州现在有什么天气警报”。结果界面转了两圈没反应工具列表里看不到weather或者看到了但模型说无法调用。这个现象最容易把人带偏你以为是get_alerts写错了其实可能是 MCP 服务根本没起来也可能是客户端的模型通道没通。如果你把 Claude Code 当 MCP 客户端还要多查一层Claude Code 自己能不能通过 TaoToken 发出模型请求。先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 API Key后面把 Base URL 填成 https://taotoken.net/api把模型通道和 MCP 通道拆开排才不会越修越乱。1. claude_desktop_config.json 没反应时先把三块拼图分开1.1 MCP 客户端、MCP 服务、模型通道是三条线claude_desktop_config.json只是注册表。它告诉客户端有个叫weather的 MCP 服务用uv启动工作目录在哪入口文件是weather.py。它不负责请求 NWS也不负责让模型回话。真正干活的有三个角色MCP 服务weather.py里的 FastMCP 实例暴露get_alerts工具。MCP 客户端Claude Desktop 或 Claude Code。它读取claude_desktop_config.json或项目级.mcp.json拉起 MCP 服务把工具列表交给模型。模型通道客户端把对话和工具描述发给哪个模型端点。Claude Code 默认走 Anthropic 官方通道你要换成 TaoToken就得改ANTHROPIC_BASE_URL。原文教程通常写到“保存后重启 Claude for Desktop即可调用天气工具”就结束了。但真实排障时重启之后没反应你得先判断是哪条线断了。最省时间的顺序是先让weather.py在终端里独立跑起来再让 Claude Code 的模型通道能回话最后才去查claude_desktop_config.json里的注册项。1.2 从 get_alerts 的调用链倒推谁没说话把一次“查纽约天气警报”拆开看你在客户端输入“调用 weather 的 get_alertsstate 用 NY。”客户端把这句话、系统提示、MCP 工具列表一起发给模型。模型决定调用get_alerts返回一个工具调用请求。客户端收到请求通过 stdio 转给weather.py。weather.py向 NWS 发 HTTP 请求拿回 JSON。结果沿原路返回模型组织成人话。任何一步断了现象都可能是“没反应”。但报错位置不同如果第 2 步就失败通常会有 401、404 或模型不存在如果第 4 步失败工具列表里可能根本没有weather如果第 5 步失败你会看到工具调用返回了错误字符串比如 NWS 403 或超时。先别急着改get_alerts的 Python 代码。先在终端跑一遍uv run weather.py把 MCP 服务从客户端里摘出来。这一步能排除一半问题。2. 手动跑 uv run weather.py让 MCP 服务先离开客户端2.1 FastMCP 里的 get_alerts 该怎么写才容易被调用原文用 FastMCP 写weather.py在get_alerts里请求 NWS。这里给一个可以直接运行的最小版本。注意函数名、参数名和 docstring 都会影响模型能不能正确调用所以别只写def f(a)这种。from mcp.server.fastmcp import FastMCP import httpx mcp FastMCP(weather) NWS_ALERTS_URL https://api.weather.gov/alerts/active mcp.tool() async def get_alerts(state: str) - str: 获取指定美国州的天气警报例如 NY、CA、TX。 url f{NWS_ALERTS_URL}?area{state.upper()} headers { User-Agent: weather-mcp-demo/0.1 (youexample.com), Accept: application/geojson, } async with httpx.AsyncClient(timeout15) as client: resp await client.get(url, headersheaders) resp.raise_for_status() data resp.json() features data.get(features, []) if not features: return f{state.upper()} 当前没有生效的天气警报。 lines [] for item in features[:5]: props item.get(properties, {}) event props.get(event, 未知事件) headline props.get(headline, 无标题) lines.append(f{event}{headline}) return \n.join(lines) if __name__ __main__: mcp.run()几个要点mcp.tool()必须加在模块顶层函数上state参数要有类型标注docstring 写清楚用途。NWS 的 API 对User-Agent有要求空着或随便填可能返回 403这是天气服务特有的坑。2.2 uv 启动日志里最常见的四行报错在终端里进入weather.py所在目录先手动跑cd /absolute/path/to/weather-server uv run weather.py如果服务正常终端会停住等待 stdio 输入没有花哨的输出。这时你在claude_desktop_config.json里注册同样的命令客户端才能拉起来。手动跑的时候常见四类报错第一类ModuleNotFoundError: No module named mcp。说明当前环境没装 MCP SDK。在同一个目录执行uv add mcp httpx或者按原文的依赖方式装好。第二类uv: command not found。终端里能跑不代表 Claude Desktop 启动时能找到uv。在配置里写绝对路径例如command: /Users/you/.local/bin/uv。先用which uv查出来。第三类FileNotFoundError: weather.py。claude_desktop_config.json里的--directory必须是绝对路径不要写~/code/weather-server也不要用相对路径。客户端的工作目录和你终端不一样。第四类NWS 返回 403。加上带联系方式的User-Agent再重试。如果终端里能返回警报列表说明 MCP 服务和 NWS 请求这条线是通的。接下来才轮到模型通道。3. 给 Claude Code 补模型通道settings.json 里的 ANTHROPIC_BASE_URL3.1 在 TaoToken 创建 Key 并确认模型 ID如果你只用 Claude Desktop模型通道由桌面客户端自己管理。但你把 Claude Code 当 MCP 客户端时Claude Code 需要单独配置模型端点。打开 TaoToken 注册账号在控制台创建 API Key记成YOUR_API_KEY。同时看一眼模型广场选一个你要用的模型 ID不要凭记忆编造带日期后缀的名字。模型 ID 以页面当时列表为准。Claude Code 的配置可以放在~/.claude/settings.json用env字段注入环境变量{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_ID } }ANTHROPIC_BASE_URL填https://taotoken.net/api末尾不要加/v1。ANTHROPIC_AUTH_TOKEN用你刚创建的 Key。ANTHROPIC_MODEL换成模型广场里看到的 ID。保存后新开一个 Claude Code 会话先问一句“你好”确认模型能正常回话。3.2 把 Base URL 填 https://taotoken.net/api不要带 /v1这一步的验证很简单如果 Claude Code 连“你好”都回不了或者报 401、404先别去动get_alerts。401 通常是 Key 没填对404 常见原因是 Base URL 多写了/v1。Claude Code 会自己在https://taotoken.net/api后面拼路径你手动加/v1反而会拼出重复路径。还有一个容易忽略的点settings.json里的环境变量只对新会话生效。你改完文件最好退出 Claude Code 再重新进。如果仍然报模型不存在回 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的模型广场核对 ID确认没有把显示名称当成模型 ID。模型通道通了以后Claude Code 才有能力处理 MCP 工具列表。否则你注册再多的claude_desktop_config.json条目模型也看不到或者看到了也没法回话。排障顺序一定是先模型后 MCP。4. 把 weather 服务注册进 Claude CodemcpServers 与 claude_desktop_config.json 同构4.1 Claude Desktop 的 claude_desktop_config.json 示例假设你原先是在 Claude Desktop 里配置文件位置通常是macOS~/Library/Application Support/Claude/claude_desktop_config.jsonWindows%APPDATA%\Claude\claude_desktop_config.json内容长这样{ mcpServers: { weather: { command: uv, args: [ --directory, /absolute/path/to/weather-server, run, weather.py ] } } }weather是服务名模型调用时会看到这个名字。command是启动命令args是参数。--directory后面必须是绝对路径。保存后重启 Claude Desktop如果模型通道正常工具列表里应该出现weather。4.2 Claude Code 项目级 .mcp.json 的写法Claude Code 的 MCP 配置可以放在项目根目录.mcp.json字段和claude_desktop_config.json的mcpServers同构。也就是说你可以把上面那段mcpServers直接搬过来{ mcpServers: { weather: { command: uv, args: [ --directory, /absolute/path/to/weather-server, run, weather.py ] } } }把这个文件放在你当前项目根目录然后用 Claude Code 打开这个项目。它读取.mcp.json后会尝试启动weather服务。如果启动失败Claude Code 通常会提示 MCP 服务连接异常。你也可以在 Claude Code 里用/mcp查看当前连接状态。注意这里改的是 MCP 注册不是模型通道。Base URL 仍然在~/.claude/settings.json里填https://taotoken.net/api。两套配置各管各的别混在同一个文件里。5. 让 Claude Code 调 get_alerts(stateNY)验证顺序与排障清单5.1 先验证模型能回话再验证 MCP 工具能出现新开 Claude Code 会话先输入一句普通对话比如“用一句话说明你现在能调用哪些 MCP 工具”。如果模型正常回话说明ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL这一层没问题。如果它连普通对话都失败先回到第 3 节检查模型通道。模型能回话后再问“调用 weather 的 get_alertsstate 用 NY。” 观察三种结果工具列表里有weather模型也发起了调用最终返回了纽约州警报或“当前没有警报”。说明 MCP 服务、NWS 请求、模型通道全部打通。工具列表里没有weather。说明.mcp.json或claude_desktop_config.json没被读到或者uv run weather.py启动失败。回到终端手动跑一遍。工具列表里有weather但调用时报错。说明 MCP 服务起来了但get_alerts内部请求 NWS 失败。检查User-Agent、网络超时和州代码格式。5.2 工具出现了但调用失败查 NWS 请求与 User-AgentNWS 的接口不是随便就能匿名拉取的。get_alerts里如果没带User-Agent或者带的是空字符串可能直接返回 403。你可以在终端里单独用httpx或curl试一下curl -H User-Agent: weather-mcp-demo/0.1 (youexample.com) \ https://api.weather.gov/alerts/active?areaNY如果命令行能返回 JSON但 MCP 工具里报错检查weather.py里的 headers 是否写对。如果命令行也 403检查你的网络出口是否能访问api.weather.gov。这不是 TaoToken 通道的问题而是 MCP 服务自己在请求第三方 API。另外state参数只接受两个字母的州代码。传New York可能拿不到结果。让 Claude Code 调get_alerts(stateNY)不要让它自由发挥成城市名。5.3 改了配置没生效重启、重连、路径三件事MCP 配置修改后Claude Desktop 需要完全退出再启动不是关窗口。Claude Code 可能需要重新打开项目或者用/mcp重连。如果仍然没生效按下面三项检查第一JSON 语法。claude_desktop_config.json和.mcp.json都不允许尾随逗号。用编辑器格式化一下或者python -m json.tool验证。第二路径和命令。uv是否在客户端启动时的 PATH 里最稳的办法是写绝对路径。--directory是否是绝对路径weather.py是否真的在目录下第三日志。Claude Desktop 的 MCP 日志通常在~/Library/Logs/Claude/mcp.log或类似位置。Claude Code 启动 MCP 失败时也会打印 stderr。把weather.py手动跑一遍看到的报错和日志里的通常一致。6. 配通之后去控制台对一下这次调用6.1 用同一把 Key 在模型对话里发一条测试消息当 Claude Code 能调get_alerts(stateNY)并返回警报后你可以拿同一把 Key 到 TaoToken 模型对话 里发一条测试消息确认模型 ID 和 Base URL 没填错。模型对话页面相当于一个独立的验证入口如果这里正常说明 Key 和模型通道没问题如果这里也报错回到settings.json检查ANTHROPIC_BASE_URL是否误写成https://taotoken.net/api/v1。6.2 长期跑 MCP 工具看 Coding Plan 还是按量MCP 天气服务只是第一步。你后面可能还会接文件系统、Git、数据库查询辅助等 MCP 工具Claude Code 的模型调用次数会上去。如果准备长期在 Claude Code 里跑 MCP 工作流可以打开 Coding Plan 看套餐是否够用Key 在 控制台 API Keys 创建Claude Code 环境变量对照见 接入文档。配通的是 Claude Code 的模型通道weather.py里的get_alerts仍然负责请求 NWS两者各司其职排障时也按这个边界去查。