☰
MCP Server Java 开发框架体验比较:spring ai mcp 与 solon ai mcp 接入 TaoToken 实践
2026/10/8 12:23:39 网站建设 项目流程

1. 为什么要在 Java 里折腾 MCP Server

MCP 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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册并登录,进入控制台。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在里面找到 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_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 发一条消息试试,确认 Key 有效再往下走。这一步能省掉后面很多「到底是 Key 错还是代码错」的纠结。

对于长期要做编码 Agent 的场景,可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它更适合高频调用。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到协议细节可以查。API Keys 页面再贴一次方便你直接跳:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。

这里要强调一点: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.xml:

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId> <version>1.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 包装成 ToolCallbackProvider:

@Configuration 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> <groupId>org.noear</groupId> <artifactId>solon-ai-mcp</artifactId> <version>3.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_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,需要新建或轮换 Key 时直接去那里操作。

最后提醒一个实操细节:MCP Server 启动后,先用 curl 确认 SSE 端点可达,再配客户端。这样能把「Server 问题」和「客户端配置问题」分开,排查效率高很多。工具方法的 description 一定要写清楚,模型靠它决定调不调、传什么参数,描述模糊会导致工具被忽略或参数传错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询