1. 为什么 database-agent 挂进 Cursor 后还是卡住
MCP 协议、AI Agent、工具集成这几个词最近被聊得很多,但真正动手把 MCP Server 挂进 Cursor 的人,往往会撞上一个很具体的墙:工具明明注册成功了,Cursor 的 MCP 面板里也能看到 database-agent 亮着绿灯,可你让它查一句「工程部的平均薪资是多少」,它要么回你一句「我没有数据库访问权限」,要么干脆在 list_tables 那一步就停住不动。
这个现象的本质,是很多人把两件独立的事混成了一件。第一件事是「工具怎么被 Cursor 发现」——这靠 mcpServers 配置解决,command/args 指到你的 server.py,Cursor 启动时通过 stdio 拉起进程,发 tools/list 拿到工具清单。第二件事是「Cursor 里的 Agent 用哪个模型来决定发起 tools/call」——这是模型侧的事,跟 MCP 协议本身没关系。原文 4.2 到 5.3 把第一件事讲透了,FastMCP 写 list_tables / describe_table / execute_query 三个工具,再按 5.3 的 mcpServers 配置挂进 Cursor,这一步只解决「工具怎么被被发现」。可链式查询要跑起来,模型必须能读懂工具描述、决定先调 list_tables、拿到结果再调 describe_table、最后拼出 execute_query 的 SQL。这个决策过程发生在模型侧,而模型侧的凭证和 Base URL,是另一套配置。
我试过只配 mcpServers 不配模型侧,结果就是 Cursor 内置模型能看见工具但不会主动链式调用,或者调用时报鉴权失败。所以这篇把「模型侧凭证」单独拆出来讲:先注册拿 Key,回到 Cursor 模型设置填 Base URL 和 Key,mcpServers 那段照旧,最后用一句原话验证三个工具是否被依次调起。TaoToken 在这条链路里只出 Key 和 Base URL,不参与 MCP 协议本身的实现,这点要先说清楚,免得你把两套东西搅在一起排障。
2. 前置:TaoToken 的 Key 与 Base URL 怎么拿
模型侧凭证这一环,我用的是 TaoToken。打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册账号,进控制台创建一把 API Key。创建完先别关页面,Key 只完整显示一次,复制到本地临时文件里。
这里有个容易踩的坑:Base URL 填 https://taotoken.net/api,不带 /v1,也不加任何 UTM 参数。很多人习惯性补 /v1,结果 Cursor 报 404 或模型不可用。TaoToken 的接入地址就是 https://taotoken.net/api 这个裸路径,OpenAI 兼容协议由它自己路由。
创建 Key 的入口在控制台的 API Keys 页面,模型对话和 Coding Plan 是两条不同的能力线:如果你只是想让 Cursor 的 Agent 能决策工具调用,用普通 API Key 就够;如果你要长期跑编码 Agent、频繁做多轮工具链,可以看下 Coding Plan,额度模型不一样。接入文档在 https://taotoken.net/doc 有完整说明,遇到协议细节先翻文档比瞎试快。
注意:Key 不要写进 mcpServers 的配置块里。mcpServers 只管拉起你的 server.py,模型凭证填在 Cursor 的模型设置里,两者物理隔离。把 Key 塞进 server.py 的环境变量,只会让 MCP Server 自己拿到 Key,Cursor 的 Agent 依然不知道该用哪个模型。
3. 可复制配置:mcpServers 与模型侧分开填
3.1 mcpServers 段照原文填
先确认你的 database-agent 能独立跑起来。在项目目录下执行:
uv run server.py进程挂住不退出、没有报错,说明 stdio 传输正常。然后打开 Cursor 设置 → MCP → Add new MCP server,填入:
{ "mcpServers": { "database-agent": { "command": "uv", "args": [ "--directory", "/ABSOLUTE/PATH/TO/mcp-database-server", "run", "server.py" ] } } }/ABSOLUTE/PATH/TO/mcp-database-server换成你自己的绝对路径,别用~或相对路径,Cursor 拉起子进程时工作目录不一定是你想的那样。保存后重启 Cursor,MCP 面板里 database-agent 应该显示已连接,点开能看到 list_tables、describe_table、execute_query 三个工具。
3.2 模型侧凭证填在 Cursor 模型设置
这一步是原文没展开、但决定链式查询能不能跑的关键。进 Cursor 设置 → Models,找到 OpenAI 兼容或自定义模型入口,填两项:
| 配置项 | 填写值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不带 /v1,不加 UTM |
| API Key | 控制台创建的那把 | 只显示一次,注意保存 |
| Model | 按控制台可用列表选 | 选支持 tool use 的模型 |
填完点 Verify 或直接发一条测试消息。如果 Cursor 提示模型不可用,先回 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 核对 Key 是否复制完整、模型名是否在可用列表里。Base URL 多一个斜杠、少一个字符都会导致鉴权失败,这个我踩过,排查了半小时才发现是末尾多了个/。
3.3 两套配置的关系
用一张表说清楚,免得混:
| 配置位置 | 解决什么 | 填什么 |
|---|---|---|
| mcpServers | 工具怎么被 Cursor 发现 | command/args 指向 server.py |
| Cursor 模型设置 | Agent 用哪个模型决策 tools/call | Base URL + Key + Model |
MCP 协议负责工具发现和 JSON-RPC 调用,模型侧负责「要不要调、调哪个、参数怎么填」。两者都配好,链式查询才跑得动。
4. 验证:一句原话跑通三个工具链
配置保存后重启 Cursor,在 AI 对话里直接说原文 5.3 的那句原话:
帮我看看数据库里有哪些表,工程部的平均薪资是多少
正常情况下,你会在 Cursor 的对话流里看到三次工具调用依次出现:先 list_tables 拿到表清单,模型看到有 users 表,接着调 describe_table 确认 department 和 salary 字段,最后拼出类似SELECT AVG(salary) FROM users WHERE department = '工程部'的 SQL 走 execute_query,返回一个平均薪资数字。
如果三个工具被依次调起,说明模型侧凭证和 MCP 配置都对了。如果只调了 list_tables 就停住,或者模型说「我无法访问数据库」,问题基本在模型侧:要么 Key 没填对,要么选的模型不支持 tool use,要么 Base URL 写错了。这时候回 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 核对 Key 和可用模型,再回 Cursor 模型设置重填一遍。
想单独验证模型对话能力,可以打开 https://taotoken.net 的模型对话页面,用同一把 Key 发一条带工具描述的消息,看模型能不能正确输出 tool call 结构。这一步能把「模型不支持工具调用」和「MCP 配置错误」区分开。
5. 本篇常见错排查
5.1 Cursor 报鉴权失败
最常见的原因是 Base URL 写成了https://taotoken.net/api/v1或末尾多了斜杠。正确值是 https://taotoken.net/api,裸路径。另一个原因是 Key 复制时带了空格或换行,粘贴后手动删一下首尾空白。
5.2 模型不可用
Cursor 模型设置里选的模型名,必须在 TaoToken 控制台的可用模型列表里。选了一个没开通的模型,就会报模型不可用。回控制台看一眼可用列表,或者直接换成文档里标注支持 tool use 的模型。
5.3 工具被发现但不被调用
MCP 面板显示已连接,但模型从不主动调工具。这通常是工具描述写得太模糊。FastMCP 会把函数 docstring 里的 Args 部分作为参数描述传给模型,如果 describe_table 的 docstring 只写「查看表结构」而不说明什么时候该调,模型就不知道拿到表名后该不该继续。把每个工具的 description 写清楚使用场景,比如「在需要了解数据库结构时调用此工具」。
5.4 链式查询中途断掉
list_tables 调完,模型拿到表名却不继续调 describe_table。这多半是模型侧上下文或工具返回格式的问题。检查 execute_query 的返回是不是合法 JSON,模型解析不了就会放弃。另外确认模型设置里的上下文窗口够大,工具返回的表结构 JSON 如果太长被截断,模型也会断链。
5.5 server.py 启动即退出
mcpServers 配置的 command 用uv,但 Cursor 的环境变量里没有 uv 的路径。换成 uv 的绝对路径,或者确认 uv 已加入系统 PATH。args 里的--directory路径必须是绝对路径,相对路径在 Cursor 子进程里会解析失败。
6. 把模型侧和工具侧分开维护
这条链路跑通之后,日常维护其实就两件事:工具侧改 server.py 加新工具,模型侧在 Cursor 里换模型或换 Key。两者互不影响,排障时也能快速定位是哪一侧的问题。
如果你要长期跑编码 Agent、频繁做多轮工具链调用,模型侧的额度消耗会比单轮对话高不少,可以看下 Coding Plan 的额度模型是否合适。接入细节和协议说明在 https://taotoken.net/doc 有完整文档,遇到 Base URL 或模型名的问题先翻文档。API Key 管理在 https://taotoken.net/api-keys,Key 泄露了及时吊销重建。
最后提醒一句:TaoToken 在这条链路里只出 Key 和 Base URL,MCP 协议本身的实现、工具的注册与调用、stdio 传输,都是 Cursor 和你的 server.py 在管。把这两层分清楚,链式查询卡住的时候你就知道该往哪边查。