ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MCP Server Java 开发框架体验比较:spring ai mcp 与 solon ai mcp 接入 TaoToken 实践

MCP Server Java 开发框架体验比较:spring ai mcp 与 solon ai mcp 接入 TaoToken 实践 1. 为什么要在 Java 里折腾 MCP ServerMCP Server 说白了就是给大模型装上一双手模型本身只会聊天但通过 MCP 协议它能调用你写的 Java 方法去查数据库、调接口、读文件。对 Java 团队来说这意味着不用把已有业务逻辑重写一遍直接暴露成工具就能被 Claude、Cursor 这类客户端调用。我最近在做一个内部数据查询助手的选型核心诉求很明确用 Java 写 MCP Server工具方法要能复用现有 Service配置要简单最好还能一个服务挂多组工具。翻了一圈目前 Java 生态里能直接上手的主要是两套框架——spring ai mcp 和 solon ai mcp。前者背靠 Spring 生态后者主打轻量和低 JDK 门槛。这篇文章不堆概念直接拿一个天气查询工具当例子把两套框架的依赖、配置、代码、调用链路全跑一遍再演示怎么通过 TaoToken 的统一 API 通道做连通性验证。看完你基本能判断自己项目该选哪个。适合有 Java 基础、想快速把业务能力接进大模型工具链的开发者JDK 8 和 JDK 17 的团队都能找到对应方案。先说结论方向spring ai mcp 适合已经在 Spring Boot 3 体系里的项目配置走 yaml组件化清晰solon ai mcp 适合 JDK 8 老项目或者想要更简洁注解风格、需要多端点隔离的场景。下面逐个拆。2. TaoToken 前置准备统一 Key 与 API 通道在写 MCP Server 之前得先解决模型侧怎么调的问题。MCP Server 本身只是工具提供方真正发起对话、决定调用哪个工具的是模型客户端。如果你用的是 Claude Code、Cline 这类工具它们需要一个能访问模型的 API 通道。TaoToken 在这里扮演的就是统一入口的角色一个 Key、一个 Base URL就能对接多种模型省去每个客户端单独配一遍的麻烦。我试过把 Key 分散配在好几个客户端里改一次要动好几处后来统一走 TaoToken 的 API 通道客户端只认一个地址就行。具体操作路径如下。先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录进入控制台。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在里面找到 API Keys 管理页新建一个 Key。这个 Key 就是后面所有客户端要填的凭证建议按用途命名比如 mcp-java-test方便后面排查。拿到 Key 之后记住两个核心信息Base URL 是 https://taotoken.net/api 以及你刚创建的 Key。模型 ID 根据你要用的模型填比如 claude 系列或 gpt 系列具体以控制台模型列表为准。这三样东西——Base URL、Key、Model ID——是后面所有配置的通用三件套缺一不可。如果你只是想先验证模型能不能通可以直接用模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 发一条消息试试确认 Key 有效再往下走。这一步能省掉后面很多「到底是 Key 错还是代码错」的纠结。对于长期要做编码 Agent 的场景可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到协议细节可以查。API Keys 页面再贴一次方便你直接跳https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。这里要强调一点TaoToken 是合规的 API 聚合通道不是所谓的中转代理配置时按标准 OpenAI 兼容协议填即可。下面进入正题先看 spring ai mcp。3. spring ai mcp 接入配置与可复制片段spring ai mcp 的定位很清晰它是 Spring AI 生态的一部分所以如果你的项目已经是 Spring Boot 3.x JDK 17接入成本最低。它的核心思路是「组件即配置、组件即发布」——你写一个普通 Service用注解标出哪些方法是工具再通过一个配置类把它发布成 ToolCallbackProvider框架就自动接管了 MCP 协议的握手和调用。先加依赖。注意 spring-ai-mcp 的版本号和 Spring Boot 是独立的别混用。下面这个片段可以直接贴进 pom.xmldependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-server-spring-boot-starter/artifactId version1.0.0-M6/version /dependency然后在 application.yml 里给服务端点命名这个名字会出现在 MCP 客户端的服务列表里spring: ai: mcp: server: name: jdbc-mcp-server version: 1.0.0接下来写工具方法。和普通 Service 没区别只是方法上多了 Tool 注解参数上多了 ToolParam 用来给模型描述参数含义——这个描述很关键模型靠它判断该传什么值Service public class JdbcQueryService { Tool(description 查询天气预报) public String getWeather(ToolParam(description 城市位置) String location) { return location 晴14度; } }最后是发布环节用一个 Configuration 把 Service 包装成 ToolCallbackProviderConfiguration public class McpConfig { Bean ToolCallbackProvider jdbcQueryTools(JdbcQueryService jdbcQueryService) { return MethodToolCallbackProvider .builder() .toolObjects(jdbcQueryService) .build(); } }启动之后MCP 客户端连上来就能看到 getWeather 这个工具。整个链路是客户端发起 tools/list 请求 → 框架扫描 ToolCallbackProvider → 返回工具清单 → 客户端决定调用 → 框架反射执行对应方法 → 返回结果。spring ai mcp 把协议细节全藏在 starter 里你只管写业务方法。需要留意的是spring ai mcp 在单个服务内通常只暴露一个端点也就是说一个应用对应一组工具。如果你想把天气工具和地图工具分开给不同场景用就得拆成两个服务这在微服务架构下不算大问题但本地开发时会多几个进程。另外 JDK 17 是硬门槛JDK 8 项目直接劝退。配置方式上它偏 yaml 驱动好处是运维友好坏处是改端点信息要重启。4. solon ai mcp 接入配置与多端点实践solon ai mcp 的风格和 spring ai mcp 差别挺大。它不依赖 Spring 容器JDK 8 就能跑而且能集成进 Spring Boot 2、jfinal、vert.x 等第三方框架。最吸引我的是它的「三位一体」一个注解类同时完成了组件定义、配置和发布不用再单独写配置类。依赖同样简单版本号跟 solon 主版本保持一致dependency groupIdorg.noear/groupId artifactIdsolon-ai-mcp/artifactId version3.2.0/version /dependency工具类的写法和 MVC 的 Controller 非常像用 McpServerEndpoint 标出端点ToolMapping 标出工具方法McpServerEndpoint(name mcp-case1, sseEndpoint /case1/sse) public class McpServerTool { ToolMapping(description 查询天气预报) public String getWeather(ToolParam(description 城市位置) String location) { return location 晴14度; } }注意 sseEndpoint 这个参数它决定了客户端通过哪个路径建立 SSE 连接。solon ai mcp 支持多端点这是它和 spring ai mcp 最大的差异点。你可以在同一个服务里再写一个类McpServerEndpoint(name mcp-case2, sseEndpoint /case2/sse) public class MapServerTool { ToolMapping(description 查询地点坐标) public String getGeo(ToolParam(description 地点名称) String name) { return name 116.40,39.90; } }这样天气工具走 /case1/sse地图工具走 /case2/sse不同客户端可以连不同端点工具集互不干扰。对于想在一个应用里按业务域隔离工具的场景这个设计省了很多事。调用链路和 spring ai mcp 一致都是标准 MCP 协议区别只在框架内部的注册和路由实现。配置方面solon ai mcp 的端点信息直接写在注解里不需要额外的 yaml。如果你确实想外置配置它也支持引用 yaml但默认的注解方式已经够用。JDK 8 起步意味着大量存量项目不用升级就能接入这点对保守型团队很友好。两套框架的对比可以看这张表维度spring ai mcpsolon ai mcp开发方式基于组件开发基于组件开发配置方式yaml 配置组件注解即配置也可引用 yaml发布方式配置器发布为 ToolCallbackProvider组件即发布JDK 要求JDK 17 或以上JDK 8 或以上端点支持单服务通常一个端点支持多端点从表里能看出solon ai mcp 在简洁度和灵活性上占优spring ai mcp 在 Spring 生态整合度上占优。选型时先看你的 JDK 版本和现有框架再看是否需要多端点。5. 验证请求与常见报错排查写完代码得验证 MCP Server 真的能被调用。最直接的方式是用一个支持 MCP 的客户端连上去比如 Claude Code 或 Cline。以 Claude Code 为例它的配置文件里需要填三件套Base URL、Key、Model ID。Base URL 填 https://taotoken.net/api Key 填你在控制台创建的那个Model ID 按实际模型填。Claude Code 的配置片段大致如下路径按你本地实际位置调整{ mcpServers: { java-weather: { url: http://localhost:8080/case1/sse } }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的Key, ANTHROPIC_MODEL: 你的ModelID } }如果你用的是 Cline 的 MCP 配置格式类似关键是 Base URL、Key、Model ID 三件套要齐全。Codex 的 auth.json 也是同样逻辑把 Base URL 指向 https://taotoken.net/api Key 填进去即可。配置好之后在客户端里发一句「北京天气怎么样」正常情况模型会调用 getWeather 工具返回「北京晴14度」。如果没反应按下面的报错对照排查。401 错误最常见说明 Key 无效或没带上。检查你的 Key 是否复制完整有没有多余空格以及请求头里是否带了 Authorization。如果用的是 TaoToken 的 Key确认 Base URL 是 https://taotoken.net/api 而不是别的地址。local proxy failed 通常出现在客户端配置了本地代理但代理没起来的情况。检查你的客户端网络设置确保没有指向一个不存在的本地端口。这类报错和 MCP Server 本身无关是客户端到模型通道的问题。reading choices 报错一般出现在模型返回格式不符合预期时。检查 Model ID 是否填对有些模型对请求格式有特定要求。如果换了模型就好说明是模型兼容性问题不是代码问题。OAuth 相关报错说明客户端在尝试走 OAuth 流程但配置不匹配。MCP 客户端连本地 Server 一般不需要 OAuth如果你看到这类提示检查是不是误开了某个认证开关。还有一个容易忽略的点SSE 端点路径要和代码里写的一致。spring ai mcp 默认路径和 solon ai mcp 的 sseEndpoint 参数必须和客户端配置里的 url 完全对应差一个斜杠都连不上。排查时先用 curl 测一下端点是否可达curl -N http://localhost:8080/case1/sse如果能看到 SSE 事件流输出说明 Server 正常问题在客户端配置如果连不上说明 Server 没启动或端口不对。6. 选型建议与后续接入路径跑完两套框架我的实际感受是选型先看 JDK。JDK 8 项目没得选直接 solon ai mcp它的注解风格对老项目改造也友好一个类就能挂一组工具多端点隔离在业务域拆分时特别实用。JDK 17 且已经在 Spring Boot 3 体系里的spring ai mcp 更顺yaml 配置和现有运维流程能复用团队学习成本低。如果两个条件都满足就看你对多端点的需求强不强。需要在一个服务里按场景隔离工具集的solon ai mcp 的多端点设计能省掉拆服务的麻烦。不需要的话spring ai mcp 的组件化发布方式在大型项目里更规整。接入通道这块不管选哪套框架模型侧统一走 TaoToken 的 API 通道就行。Base URL 固定 https://taotoken.net/api Key 在控制台管理换模型只改 Model ID客户端配置不用动。验证阶段可以用模型对话页面快速确认 Key 有效长期编码场景看 Coding Plan协议细节查接入文档。API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 需要新建或轮换 Key 时直接去那里操作。最后提醒一个实操细节MCP Server 启动后先用 curl 确认 SSE 端点可达再配客户端。这样能把「Server 问题」和「客户端配置问题」分开排查效率高很多。工具方法的 description 一定要写清楚模型靠它决定调不调、传什么参数描述模糊会导致工具被忽略或参数传错。
返回列表