1. 本地 MCP 服务跑通,Cursor 里却连不上,问题多半不在 fastapi-mcp
你按官方示例把 FastAPI 服务挂上了/mcp,浏览器打开http://127.0.0.1:8000/mcp能看到响应,uvicorn main:app --reload也没报错,可一到 Cursor 里发消息,工具调用就是不通——要么转圈,要么提示鉴权失败,要么干脆说连不上服务器。这时候最容易怀疑的方向是add_mcp_server没挂上、路径写错了、SSE 没生效。
我踩过的坑是:本地 MCP URL 和模型通道是两条独立的链路。http://127.0.0.1:8000/mcp只负责让 Cursor 找到你的工具,而 Cursor 自己调模型(决定要不要发起工具调用、怎么解析返回)走的是另一条通道。如果模型通道的 Key 或 Base URL 没配对,表现就是「MCP 明明在跑,但对话里工具永远不触发」。这篇就按排障视角,把 FastAPI + fastapi-mcp 的 MCP 服务、Cursor 的 MCP 配置、以及模型 Key 通道这三件事拆开讲清楚,让你能一条条对照着查。
适合谁看:已经能用 Python 起 FastAPI、想在 Cursor 里接自己写的 MCP 工具、但卡在「服务在跑、对话不通」这一步的开发者。核心检索词就三个:FastAPI 搭 MCP 服务器、Cursor 配置 MCP、模型 Key 通道排查。
2. 先把两条链路分清楚:MCP URL 与模型 Key 各管什么
很多人把「连不上」当成一个故障,其实它是两类问题叠在一起。
第一类是 MCP 连接层:Cursor 通过mcpServers里的url去访问你的 FastAPI 服务,走的是 SSE/HTTP。这一层出问题,Cursor 的 MCP 面板会直接显示红色或「failed to connect」,跟模型无关。
第二类是模型通道层:Cursor 在对话时要把「有哪些工具可用」告诉模型,模型返回「我要调用某个工具」,Cursor 再去执行。这一层依赖模型服务的 Key 和 Base URL。如果 Key 无效、Base URL 写错,模型根本收不到工具列表,或者收到也不返回工具调用,表现出来就是「MCP 连上了但工具不触发」。
所以排查顺序应该是:先确认 MCP 面板是绿的,再确认模型通道能正常对话,最后才看工具调用。TaoToken 在这里的角色是模型 Key 的来源——你去官网注册后创建一个 Key,把 Cursor 的模型通道指到 TaoToken 的接口地址,让模型这一层先通。注意 Base URL 用https://taotoken.net/api,不要自己加/v1,也不要带任何查询参数。
注意:MCP 的
url和模型的 Base URL 是两个完全不同的字段,填错位置是最高频的低级错误。MCP 填http://127.0.0.1:8000/mcp,模型 Base URL 填https://taotoken.net/api。
3. 可复制配置:FastAPI 挂载 /mcp + Cursor 双通道设置
3.1 起一个带 /mcp 的 FastAPI 服务
先装依赖,建议用虚拟环境:
python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install fastapi uvicorn fastapi-mcp写一个最小可用的main.py,除了根路径,再加一个真正能被模型调用的工具端点,方便后面验证工具调用是否触发:
from fastapi import FastAPI from fastapi_mcp import add_mcp_server app = FastAPI() @app.get("/") async def root(): return {"message": "MCP is supercool"} @app.get("/add") async def add(a: int, b: int): """把两个整数相加,返回结果。""" return {"result": a + b} add_mcp_server( app, mount_path="/mcp", name="MyAPIMCP", )启动:
uvicorn main:app --reload --host 127.0.0.1 --port 8000启动后先自己验证 MCP 端点活着:
curl -i http://127.0.0.1:8000/mcp只要不是连接被拒绝、不是 404,就说明挂载成功。这一步过了,MCP 连接层基本没问题。
3.2 Cursor 里配置 MCP 服务器
打开 Cursor 设置,找到 MCP 配置入口,添加一个新的 MCP,在 JSON 里写:
{ "mcpServers": { "MyFirstMCPserver": { "url": "http://127.0.0.1:8000/mcp" } } }保存后回到 MCP 面板,确认这个 server 显示为已连接(绿色)。如果这里就是红的,先别管模型,去查服务是否在跑、端口是否被占、路径是不是/mcp。
3.3 把 Cursor 的模型通道指到 TaoToken
这一步是很多人漏掉的。在 Cursor 的模型设置里,选择自定义模型通道,填入从 TaoToken 拿到的 Key,Base URL 填:
https://taotoken.net/api不要写成https://taotoken.net/api/v1,也不要带 UTM 参数。Key 的获取入口在官网,注册后在控制台创建即可。填完保存,先在 Cursor 里发一句普通对话(不涉及工具),确认模型能正常回话——这一步通了,才说明模型通道没问题。
4. 验证请求:发一条会触发 /mcp 工具的对话
配置完成后,回到 Cursor 对话窗口,发一条明确会用到工具的请求,比如:
帮我调用 add 工具,计算 3 加 5 等于多少。预期结果是:Cursor 先展示「正在调用工具 add」,然后返回8。如果模型通道正常、MCP 连接正常,这个流程会完整走通。
如果工具没触发,可以回到终端直接验证工具端点本身是否正常:
curl "http://127.0.0.1:8000/add?a=3&b=5"返回{"result":8}说明业务逻辑没问题,那问题就在 Cursor 的模型通道或 MCP 配置上。再检查 MCP 面板是否绿色、模型通道是否能单独对话。两个都正常,工具调用基本就会触发。
5. 本篇常见错排查:鉴权失败、连不上、工具不触发
错误一:MCP 面板显示连不上。先看uvicorn是否还在前台运行,--reload模式下改代码会重启,重启瞬间 Cursor 可能掉线,等几秒重连即可。再看端口是不是被别的进程占了,lsof -i :8000查一下。路径必须是/mcp,写成/mcp/有些客户端会 404。
错误二:对话报鉴权失败(401/403)。这几乎都是模型通道的 Key 问题,跟 MCP 无关。检查 Key 是否复制完整、有没有多余空格、Base URL 是否误加了/v1。TaoToken 的 Base URL 就是https://taotoken.net/api,多一段少一段都会鉴权失败。
错误三:MCP 是绿的,但工具永远不触发。说明模型通道虽然能对话,但没拿到工具列表,或者模型没返回工具调用。先确认 Cursor 里这个 MCP server 是启用状态,再确认模型通道用的是支持工具调用的模型。有些模型对 function calling 支持不完整,换一个支持工具调用的模型再试。
错误四:本地 curl 通,Cursor 不通。检查 Cursor 是不是跑在容器或远程环境里,127.0.0.1在那种环境下指向的不是你的宿主机。这种情况把 MCP 的url换成宿主机实际可达的地址。
错误五:改了代码但行为没变。--reload有时不会重载新增的依赖或挂载逻辑,直接 Ctrl+C 重启uvicorn最稳。
6. 把模型通道配通,再回 Cursor 验证工具调用
排障的核心顺序就一句话:先让 MCP 面板变绿,再让模型通道能单独对话,最后才验证工具调用。TaoToken 在这里解决的是第二步——你去官网注册并创建 Key,把 Cursor 的模型通道 Base URL 设为https://taotoken.net/api,模型这一层先通,工具调用才有触发的前提。
Key 创建入口在控制台的 API Keys 页面,接入细节可以对照接入文档;想先确认模型通道本身是否正常,可以直接在模型对话里发一条普通消息测试;如果你是要长期在 Cursor 里做编码和 Agent 开发,可以考虑 Coding Plan 这类更适合高频调用的方案。把模型通道和 MCP 连接分开查,你会发现「连不上」这个模糊的报错,其实每次都能定位到具体是哪一层的问题。