1. 先复现:MCP inspector 的 localhost 连接失败现场
MCP inspector 的 SSE 地址填错,最典型的表现就是 Transport Type 选了 SSE,URL 填 localhost:8000/sse,Connect 一直转圈最后失败。想用走 TaoToken 的 Codex 来查这个问题,先到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建 API Key,再把 Codex 的 Base URL 填成 https://taotoken.net/api。配好之后,让它对照 FastMCP 的 host/port/sse_path 与 inspector 地址,定位连接失败的原因。这个错和模型通道、API Key 没有关系,根源在本地地址解析:inspector 用 Node 启动,解析 localhost 时可能走了 IPv6 的 ::1,而 FastMCP 监听的是 IPv4 的 0.0.0.0,两边不在同一张回环网卡上,所以连不上。把这一点想清楚,再让 Codex 帮你查脚本里的传输配置,问题就好解决了。
1.1 报错表现:Connect 一直转圈然后失败
浏览器打开 http://127.0.0.1:6274 后,左侧 Transport Type 默认是 Stdio,要手动切成 SSE。切完之后 URL 栏出现输入框,如果你填的是 http://localhost:8000/sse,点击 Connect 之后,页面上的状态会停留很久,最后变成错误状态。不同版本表现略有差异:有的直接显示 connection failed,有的只在 History 里留下一串请求记录迟迟没有响应。第一次遇到时很容易误判成 Codex 的模型通道有问题,或者以为 MCP server 根本没启动。实际上只要把 localhost 换成 127.0.0.1,同一个 server、同一份配置,立刻就能连上。
这个现象在 Windows 上最明显,因为 Node 对 localhost 的解析顺序会先尝试 IPv6 的 ::1;Python 的 FastMCP 默认绑在 0.0.0.0,属于 IPv4 地址族。IPv6 的回环请求发不进去,连接就在握手阶段被重置。MCP Python SDK 的调试文档里写的是 127.0.0.1,但很多教程把 URL 原样复制时,常常把 localhost 一起带进去。遇到这种情况,先不要怀疑密钥或额度,第一反应应该是把地址写完整。
1.2 为什么 localhost 与 127.0.0.1 结果不同
localhost 是一个主机名,不是 IP 地址。系统解析它时,可能先返回 IPv6 的 ::1,也可能返回 IPv4 的 127.0.0.1,取决于 /etc/hosts 和 DNS 解析顺序。Node 的 HTTP 客户端在连接时会根据地址族参数决定走哪一个,MCP inspector 底层用 Node 运行,遇到 localhost 默认会尝试 ::1。如果你的 FastMCP server 只监听 IPv4 的 0.0.0.0 或 127.0.0.1,来自 ::1 的请求根本进不来,页面表现就是 Connect 转圈或超时。
另一个容易踩的点是:FastMCP 构造函数里 host 参数默认是 "0.0.0.0",它监听的是 IPv4 通配地址,并不包含 IPv6 回环。把 host 改成 "::" 确实能同时监听 IPv6 和 IPv4,但没必要为了调试 inspector 去改 server 监听地址。更稳妥的做法是让 inspector 精确指定 127.0.0.1:8000/sse,让连接请求固定走 IPv4 回环。以后凡是在浏览器地址栏或工具配置里写本地服务地址,优先用 127.0.0.1 而不是 localhost,能避开一整类隐性兼容问题。
1.3 排障需要模型通道:先到 TaoToken 拿 Key
当你想直接让 AI 对照脚本和报错给出结论,而不是一行一行对着文档猜时,需要先给 AI 工具配上可用的模型访问通道。打开 TaoToken 注册并创建 API Key,拿到 YOUR_API_KEY 占位对应的真实值。这条通道只解决「Codex 能不能访问大模型」的问题,不代替你连本地 server。配好之后,真正连接 FastMCP 的还是 inspector 和你本机的 Python 进程,Codex 只是那个帮你分析报错、检查 host/port/sse_path 是否对齐的助手。
2. 让 Codex 走 TaoToken:只改 config.toml,不动本地网络
本地调试 MCP server 时,网络链路越简单越好。Codex 通过 https://taotoken.net/api 这个 Base URL 访问模型,而不是直接连到你本机的 8000 端口。所以配置 Codex 不会影响 inspector 与 FastMCP 之间的连接;反过来,inspector 连不上本地 server 的时候,Codex 依然能正常回答问题。两层连接互相独立,这是排障时最有用的一条认知。
2.1 从控制台创建 API Key
先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 完成注册,进入控制台后找到 API Keys 页面,创建一个新 Key。创建后记得立即复制保存,很多平台只在创建时展示一次完整 Key。然后打开本机的 Codex 配置文件:macOS/Linux 在 ~/.codex/config.toml,Windows 在 %USERPROFILE%.codex\config.toml。文件不存在就新建一个,Codex 会在启动时自动读取。
2.2 给 Codex 填上 Base URL 的完整配置
把下面的片段写进 config.toml,其中 model 一栏按模型广场当时列出的模型 ID 填写,不要沿用网上其它教程里的旧型号:
model = "MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"模型 ID 以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场为准。base_url 末尾不要加 /v1,也不要加斜杠,Codex 会自己拼后面的路径。env_key 的作用是告诉 Codex 从环境变量 TAOTOKEN_API_KEY 读取密钥,避免把 Key 明文写进配置文件。设置环境变量的命令如下:
export TAOTOKEN_API_KEY=YOUR_API_KEYWindows 命令行对应的是set TAOTOKEN_API_KEY=YOUR_API_KEY,PowerShell 则用$env:TAOTOKEN_API_KEY="YOUR_API_KEY"。Key 的值为你在控制台复制的那串真实字符串,本文统一以 YOUR_API_KEY 占位。
2.3 先验证 Codex 能正常回答再继续
配置保存后,先别急着进入 MCP 排障。在终端里给 Codex 提一个与 MCP 无关的简单问题,比如让它解释 Python 的类型提示如何用于 FastMCP 工具定义。如果 Codex 正常返回,说明模型通道已经打通。如果提示认证失败,多半是环境变量没被当前 shell 加载,重开终端或 source 一下配置文件再试。确认 Codex 可用之后,再开始对照检查 inspector 的连接地址。
3. 给 Codex 的排障素材:FastMCP 的 host/port/sse_path 与 inspector URL
走 TaoToken 的 Codex 已经能访问模型,但它看不到你屏幕上的 inspector 页面。你需要把现场信息整理成它能读懂的文字,它才能给出有效分析。
3.1 喂给 Codex 三段信息
第一段是 inspector 左侧的配置:Transport Type 选了 SSE,URL 填的是什么,Connect 之后的状态是转圈还是报错。第二段是你的 Python 脚本里 FastMCP 实例化那几行代码,以及启动命令。第三段是浏览器开发者工具或 inspector History 里的报错文本。这三样东西凑齐,Codex 就能做基本的交叉比对。
如果报错信息特别长,可以只贴包含 error、failed、ECONNREFUSED 或 pending timeout 的那几行。Codex 会先根据 URL 判断你填的是 localhost 还是 127.0.0.1,再根据端口和 sse_path 判断与 FastMCP 实例化参数是否一致。整个过程只做文本分析和代码对照,执行动作都在你的终端里发生。
3.2 实例化参数与 URL 的对应关系
FastMCP 构造函数里这四个参数直接决定 inspector 该连哪个地址:
# server.py from mcp.server.fastmcp import FastMCP mcp = FastMCP( name="demo_server", host="0.0.0.0", # 监听地址,默认 0.0.0.0 port=8000, # 监听端口,默认 8000 sse_path="/sse", # SSE 连接路径,默认 /sse message_path="/messages/", # 消息回传路径,默认 /messages/ ) @mcp.tool(description="返回示例结果") async def ping() -> list: return ["pong"] if __name__ == "__main__": mcp.run(transport="sse")按照这段代码,inspector 里应该填 http://127.0.0.1:8000/sse。如果你把 sse_path 改成了 /mcp/sse,inspector 的 URL 也要跟着改成 http://127.0.0.1:8000/mcp/sse。如果把 port 换成了 9000,URL 的端口部分也要换。Codex 看到你的代码实例化参数后,会直接生成一条对应 URL,省得你手动对照。
3.3 Codex 只做对照,不替你连本地 server
走 TaoToken 的模型通道只负责让 Codex 拿到大模型的返回,Codex 通过这个通道分析你贴过去的代码和报错。它不会也不能替你去连接 http://127.0.0.1:8000/sse,那条连接始终发生在你的浏览器和本地 Python 进程之间。你在让 Codex 排查时,要自己执行重启 server、修改脚本这些操作,再把结果贴回对话。这也是本地排障该有的安全边界:AI 辅助分析,人在回路执行。Codex 给出的结论如果指向 URL 不一致,你改完脚本后还要手动重启 mcp dev 或直接运行 python server.py,让新配置生效。
4. 从 mcp dev 到 Connect:完整验证流程
确认 Codex 可用、脚本参数也贴清楚了,接下来按验证流程走一遍,把「localhost 连不上」这个问题收口。
4.1 启动 MCP inspector 的命令与端口
先确保 MCP Python SDK 以 CLI 模式安装:
pip install mcp[cli]然后进入放有 FastMCP 实例的目录,执行:
mcp dev server.py注意 server.py 里需要有一个名为 mcp 的 FastMCP 或 Server 实例,脚本文件必须在当前目录下。mcp dev 启动后,日志会显示 Proxy server listening on port 6277 和 MCP Inspector is up and running at http://127.0.0.1:6274。浏览器打开 6274 那个地址,才是 inspector 的操作界面。如果你的脚本本身语法有问题,页面可能都打不开,那就先把脚本跑通再说。
4.2 确认 server 在监听:lsof 与 netstat
inspector 页面正常起来,不等同于你的 FastMCP server 已经就绪。很多时候 inspector 只是界面工具,你需要另外确认 8000 端口上确实有 Python 进程在监听。打开终端执行:
lsof -i :8000Windows 用netstat -ano | findstr :8000。如果没有任何输出,说明 FastMCP 进程没起来,inspector 不管填 localhost 还是 127.0.0.1 都会失败。如果输出显示有四五个监听记录,说明你起了多个 server 实例,建议全部停掉,留一个干净的进程再测。
4.3 Tools 列表出现说明握手成功
确保 Python server 在跑,inspector 也打开了,再回到页面操作:Transport Type 选 SSE,URL 填 http://127.0.0.1:8000/sse,点击 Connect。正常情况下,左侧的 Resources、Prompts、Tools、Ping、Sampling、Roots 等标签会从灰色变成可用。点击 Tools 标签,再点 List Tools,能看到脚本里用 @mcp.tool 注册的方法名列表。看到工具名出现,说明 SSE 握手完成,工具调用链路已经打通。如果 List Tools 报错,把 History 里的请求体和响应体贴给 Codex,它会帮你分析是初始化握手没完成还是协议版本不匹配。
5. 排障清单:先把本地链路走通,再查 Key 与 Base URL
localhost 连不上通常不是单一原因,把检查顺序固定下来,比反复试 IP 省时间。
5.1 先确认监听地址与端口
FastMCP 的 host 参数如果写成 127.0.0.1,那么只有本机回环流量能访问;写成 0.0.0.0 则所有网卡都会监听。Inspector 和 server 在同一台机器上时,host 两种写法都能连,但 inspector 的 URL 必须回指 127.0.0.1。先跑lsof -i :8000或netstat -ano | findstr :8000,确认监听地址里包含 8000 端口。如果监听地址是 [::]:8000,说明 server 走的是 IPv6,inspector 填 127.0.0.1 反而可能失败,这时要回头看 host 参数是不是被设置成了 "::"。
5.2 再对齐 sse_path 与 URL 路径
默认 sse_path 是 /sse,所以 inspector URL 是 http://127.0.0.1:8000/sse。如果你改了 sse_path,比如改成 /event-stream,inspector 里还填 /sse 就会一直 pending。Codex 可以帮你检查这两处是否一致,方法就是把脚本里的 sse_path 一行和 inspector 的 URL 一起贴给它。类似地,message_path 一般不用改,保持默认 /messages/ 即可,除非你的服务端做了自定义路由。
5.3 最后查 Codex 通道:环境变量与 Base URL
本地链路走通之后,如果 Codex 仍然无法回答,再回头看模型通道。TAOTOKEN_API_KEY 是否正确导出,config.toml 里 base_url 是否写成了 https://taotoken.net/api 而不是 https://taotoken.net/api/v1。多出来的 /v1 会导致 Codex 请求 404。检查环境变量是否在当前 shell 生效,可以用echo $TAOTOKEN_API_KEY(Windows 为echo %TAOTOKEN_API_KEY%)。确认 Codex 本身没问题是排障的最后一步,因为它只影响 AI 能否给你答复,不影响 inspector 与 FastMCP 的连接。
6. 排障收尾:回控制台确认这次调用
6.1 模型对话验证 Key 与用量
刚才让 Codex 检查 FastMCP 参数的那几轮对话,应该在控制台的用量页面里留下记录。如果没找到记录,说明那次调用可能没走通模型通道,回到上一节复查环境变量是否被 Codex 进程读到。想快速验证 Key 本身还能用,点开 模型对话 发一条测试消息,能正常回复就表示 Key 有效。这条链路与本地 inspector 没有交点,所以即使 MCP server 还没起来,模型对话也能正常做诊断。
6.2 Coding Plan 与接入文档
如果你打算长期让 Codex 参与本地 MCP 调试,建议在确认 Key 可用的同时,打开 Coding Plan 看套餐够不够日常消耗。Key 的创建、停用、用量明细都在 控制台 API Keys 里。如果你同时在使用 Claude Code,可以参考 Claude Code 接入文档,环境变量的思路与 Codex 的 env_key 类似,只是变量名和配置文件路径不同。
到这里,localhost 连不上和 Codex 通道两个问题都收口了:MCP 侧用 127.0.0.1 解决地址族错位,Codex 侧用模型通道解决访问问题。回到 inspector 的 Tools 标签,把 List Tools 刷出来的函数逐个跑一遍,返回结果符合预期,就可以继续写你的业务工具了。