
1. 从一次库存查询说起Spring AI MCP 服务端到 Cursor 客户端的完整链路如果你正在用 Spring AI 写 MCP 服务端却卡在「Cursor 里怎么配、怎么调、怎么确认工具真的被调用」这一步这篇就是为你准备的。MCPModel Context Protocol本质上是给大模型装了一套「标准插座」服务端把本地能力查数据库、读文件、调内部接口封装成一个个 Tool客户端比如 Cursor通过统一协议去发现并调用这些 Tool。Spring AI 从 1.0 开始提供了spring-ai-starter-mcp-server让你用几个注解就能把 Java 方法暴露成 MCP 工具而 Cursor 作为 MCP 客户端负责在对话里触发这些工具。我这次要跑通的场景很具体用户给一个物料编码服务端返回该物料的库存数量测试阶段用随机值模拟。服务端用 Spring AI 的 SSE 传输方式暴露在本地 8848 端口Cursor 通过mcp.json注册这个 SSE 地址然后在对话里输入「查询物料编码 A100 的库存」来验证整条链路。同时为了让 Cursor 在调用模型时走统一的 Key 通道我会把 TaoToken 的 API 参数一并接进来避免在多个工具之间来回切换 Key。适合谁看已经会用 Spring Boot 写接口、想在 Cursor 里接自己 MCP 服务的 Java 开发者或者你刚接触 MCP想找一个能直接复制、能跑出结果的端到端示例。下面从环境准备开始每一步都给可复制的配置和命令。2. 前置准备Spring AI 版本、TaoToken 统一 Key 与 Cursor 环境先把版本对齐MCP 相关的 starter 在 Spring AI 1.0.0-M6 之后才比较稳定建议直接用 1.0.0 正式版或更新的 1.0.x。JDK 用 17 或 21 都行我本地是 21。构建工具用 Maven因为 Spring AI 的 BOM 管理起来最省事。TaoToken 在这里的角色是「统一 Key 通道」Cursor 在调用模型时需要一个兼容 OpenAI 协议的 base_url 和 api_keyTaoToken 提供的就是这个入口。你只需要在 TaoToken 控制台创建一个 API Key后面在 Cursor 的模型配置里填上https://taotoken.net/api作为 base_url再把 Key 填进去即可。这样 MCP 工具调用和模型推理走的是同一套凭证不用为每个工具单独配 Key。具体动作打开 https://taotoken.net/api 注册后在控制台创建 API Key记下sk-开头的字符串。确认本地 8848 端口没有被占用后面 SSE 服务端会监听这个端口。Cursor 更新到最新版MCP 配置入口在 Settings → MCP 或直接编辑mcp.json。注意TaoToken 的 API 地址是https://taotoken.net/api不要加多余的路径后缀OpenAI 兼容客户端会自动拼接/v1/chat/completions。3. 可复制配置Spring AI MCP 服务端 Cursor mcp.json 骨架3.1 服务端依赖与 application.yml在pom.xml里加入 Spring AI 的 BOM 和 MCP server starterdependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.0.0/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-server-webmvc/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependenciesapplication.yml里指定 SSE 传输和端口server: port: 8848 spring: ai: mcp: server: name: wesn-mcp-server version: 1.0.0 protocol: SSE sse-endpoint: /sse这里protocol: SSE表示用 HTTP SSE 暴露工具sse-endpoint就是 Cursor 要连的路径。服务端启动后Cursor 访问http://127.0.0.1:8848/sse就能拿到工具列表。3.2 工具类用 Tool 暴露库存查询Service public class WesnServer { Tool(description 通过给出的物料编码获取物料库存信息) public String getStock(ToolParam(description 物料编码) String productCode) { Random random new Random(); int stock random.nextInt(100); return 物料编码 productCode 的库存是 stock PCS; } }Tool的 description 会直接展示给模型写清楚「通过物料编码查库存」能让模型更准确地决定何时调用。ToolParam描述参数含义避免模型传错字段。3.3 Cursor 的 mcp.json 配置骨架Cursor 的 MCP 配置文件位置在官方文档里有说明Windows 一般在%USERPROFILE%\.cursor\mcp.jsonmacOS 在~/.cursor/mcp.json。内容如下{ mcpServers: { wesn-stock: { url: http://127.0.0.1:8848/sse, env: { API_KEY: sk-你的TaoTokenKey } } } }wesn-stock是你在 Cursor 里看到的服务名url指向本地 SSE 端点。env里的API_KEY是给服务端工具用的环境变量如果你的工具需要读外部 API这里填 TaoToken 的 Key 是为了后续工具内部调用模型时复用同一凭证。3.4 Cursor 模型侧接入 TaoToken在 Cursor 的 Settings → Models 里把 OpenAI API Key 填成 TaoToken 的 KeyBase URL 填https://taotoken.net/api。这样 Cursor 在对话时走的是 TaoToken 通道MCP 工具调用和模型推理共用一套 Key省去多套凭证切换的麻烦。4. 验证请求从 Cursor 对话到服务端日志的成功结果配置保存后重启 CursorMCP 配置变更需要重启才生效。然后在 Cursor 的 Chat 里输入查询物料编码 A100 的库存正常情况下Cursor 会先识别出这是一个需要调用 MCP 工具的问题然后向http://127.0.0.1:8848/sse发起请求拿到getStock工具的定义接着调用它并传入A100。你会在 Cursor 的对话里看到类似「正在调用 wesn-stock 的 getStock」的提示最终返回物料编码 A100 的库存是 42 PCS服务端控制台会打印 SSE 连接建立和工具调用的日志。如果看到Tool call: getStock with args {productCodeA100}说明链路完全打通。再验证一次模型通道在 Cursor 里问一个不需要工具的问题比如「用一句话解释什么是 MCP」如果模型正常回复说明 TaoToken 的 base_url 和 Key 配置正确。两个通道都通才算真正跑通。5. 本篇常见错排查SSE 连不上、工具不触发、Key 报 401现象一Cursor 里看不到 MCP 服务或提示连接失败。先确认服务端是否真的在 8848 端口监听curl http://127.0.0.1:8848/sse应该返回一个持续的事件流不会立刻结束。如果返回 404检查sse-endpoint是否配成了/sse以及 starter 用的是webmvc而不是webflux两者端点路径不同。如果返回连接拒绝说明服务没启动或端口被占。现象二服务连上了但模型不调用工具。最常见的原因是Tool的 description 太模糊。模型靠 description 判断「这个问题要不要用工具」如果写成「获取信息」它可能不触发。改成「通过物料编码查询库存数量」这种带明确输入输出的描述触发率会明显提升。另外确认 Cursor 的模型支持 function calling部分小模型对工具调用支持不完整。现象三Cursor 报 401 或 invalid api key。这是模型通道的问题不是 MCP 的问题。检查 Cursor 的 Base URL 是否严格写成https://taotoken.net/apiKey 是否以sk-开头且没有多余空格。如果 Key 是在 TaoToken 控制台刚创建的确认没有复制到换行符。MCP 的env.API_KEY和 Cursor 模型 Key 是两回事别混在一起排查。现象四工具被调用了但参数是 null。检查ToolParam的 description 是否写清楚了参数含义以及 Java 方法参数名是否和模型传的字段对得上。Spring AI 默认用参数名做映射如果编译时没保留参数名-parameters编译选项可能映射失败。在pom.xml的 compiler 插件里加上parameterstrue/parameters即可。现象五SSE 连接频繁断开。本地开发时如果 Cursor 和服务端之间有网络波动SSE 会重连。确认没有其他进程占用 8848以及防火墙没有拦截本地回环。如果用的是公司网络检查是否有代理拦截了127.0.0.1的请求。6. 把 Key 和工具都收拢到一条通道跑通之后你会发现真正省事的地方在于「统一」MCP 服务端负责把本地能力暴露成工具Cursor 负责触发TaoToken 负责模型推理的 Key 通道。三者各司其职但凭证只有一套。后续你要加新工具只需要在WesnServer里再加一个Tool方法重启服务端Cursor 重新连接后就能看到新工具不用改mcp.json。如果你在排障阶段卡在接入或 Key 配置上可以直接去 TaoToken 的 API Keys 页面重新生成一个 Key对照接入文档检查 base_url 和 header 格式https://taotoken.net/api-keys 和 https://taotoken.net/doc 。想先验证模型通道是否正常用模型对话页面发一条消息最快https://taotoken.net/chat 。如果你打算长期在 Cursor 里做编码和 Agent 任务Coding Plan 的额度模型更适合高频调用https://taotoken.net/coding-plan 。