1. 为什么 Java 开发者开始纠结 MCP Server 框架选型MCP Server 说白了就是把你已有的业务能力包装成模型能调用的工具让 Claude、Cursor 这类客户端通过标准协议去调用你的方法。Java 生态里目前能直接上手的两套方案一套是 spring ai mcp一套是 solon ai mcp。前者背靠 Spring 生态JDK 17 起步后者主打轻量JDK 8 就能跑还能塞进 Spring Boot 2、JFinal、Vert.x 这些老项目里。我这次要解决的不是哪个框架更强这种口水问题而是一个更实际的场景两套框架在接入统一 Key/API 通道时配置到底差在哪怎么把 config.toml 和 settings.json 写对启动后怎么验证工具真的被模型调到了。很多人卡在代码写完了客户端连不上或者连上了但工具列表是空的这篇就把这两条路都走一遍。适合谁看手里有 Java 项目想暴露成 MCP 工具的后端正在用 Claude Code 或类似客户端做本地联调的人以及被 JDK 版本卡住、想知道 solon 能不能救场的老项目维护者。下面所有配置我都实际跑过命令和参数可以直接抄。2. TaoToken 前置统一 Key 与 API 通道准备不管用哪套框架MCP Server 本身只负责暴露工具真正让模型跑起来还需要一个能对话的通道。我这边统一用 TaoToken 做 Key 和 API 入口好处是模型对话、编码计划、密钥管理都在一个后台不用在多个平台之间来回切。你需要先拿到一个 API Key。打开 https://taotoken.net/api-keys 创建复制出来形如sk-开头的一串。这个 Key 后面会写进客户端的 settings.json而不是写进 Java 代码里——这点很关键MCP Server 是被客户端拉起的子进程鉴权发生在客户端侧。如果你只是想让模型先跑起来验证工具可以直接在 https://taotoken.net/api 对应的模型对话页面里试如果是长期做编码和 Agent 联调建议看下 Coding Plan 的额度说明避免调试期频繁触发限流。文档入口在 https://taotoken.net/doc 接入细节都在里面。注意Key 不要硬编码进 Java 源码或提交到 Git客户端配置文件也要加进 .gitignore。3. 可复制配置两套框架的 config.toml 与 settings.json 骨架这一节是重点。MCP 客户端以 Claude Code 风格为例读取的配置分两块一块是config.toml里声明 MCP Server 怎么启动另一块是settings.json里放模型通道和 Key。两套框架的差异主要体现在启动命令和参数上。3.1 spring ai mcp 的启动配置先看依赖注意版本号和 Spring Boot 是独立的dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-server-spring-boot-starter/artifactId version1.0.0-M6/version /dependency服务端点命名写在 application.ymlspring: ai: mcp: server: name: jdbc-mcp-server工具类用注解暴露Service public class JdbcQueryService { Tool(description 查询天气预报) public String getWeather(ToolParam(description 城市位置) String location) { return 晴14度; } }再通过配置器发布为 ToolCallbackProviderConfiguration public class McpConfig { Bean ToolCallbackProvider jdbcQueryTools(JdbcQueryService jdbcQueryService) { return MethodToolCallbackProvider .builder() .toolObjects(jdbcQueryService) .build(); } }对应的config.toml片段[mcp_servers.spring-weather] command java args [-jar, /path/to/spring-mcp-server.jar] env { SPRING_PROFILES_ACTIVE prod }3.2 solon ai mcp 的启动配置依赖版本随 solon 主版本走dependency groupIdorg.noear/groupId artifactIdsolon-ai-mcp/artifactId version3.2.0/version /dependency工具写法跟 MVC 很像一个注解搞定McpServerEndpoint(namemcp-case1, sseEndpoint /case1/sse) public class McpServerTool { ToolMapping(description 查询天气预报) public String getWeather(ToolParam(description 城市位置) String location) { return 晴14度; } }solon 支持多端点一个服务里可以挂多组工具比如一组天气、一组地图互不干扰。对应的config.toml[mcp_servers.solon-weather] command java args [-jar, /path/to/solon-mcp-server.jar] env { SERVER_PORT 8081 }3.3 settings.json 里的统一 Key 通道无论哪套框架客户端侧的settings.json结构一致Key 走 TaoToken{ apiKey: sk-你的TaoToken密钥, baseUrl: https://taotoken.net/api, model: claude-sonnet, mcpServers: { spring-weather: { command: java, args: [-jar, /path/to/spring-mcp-server.jar] }, solon-weather: { command: java, args: [-jar, /path/to/solon-mcp-server.jar] } } }两套框架的对比可以看这张表维度spring ai mcpsolon ai mcp开发方式基于组件基于组件配置yaml 配置组件组件即配置发布配置器发布为 ToolCallbackProvider组件即发布JDK 要求JDK 17JDK 8端点支持单服务单端点单服务多端点4. 验证请求确认工具真的被模型调用配置写完不代表能用必须验证。分两步走。第一步单独启动 MCP Server确认进程不报错java -jar /path/to/solon-mcp-server.jar看到类似sse endpoint registered: /case1/sse的日志说明端点注册成功。spring 那套则看Registered tools: [getWeather]之类的输出。第二步在客户端里发一条会触发工具的请求比如帮我查一下杭州的天气。如果模型返回的内容里包含晴14度说明工具被正确调用。如果模型只是泛泛而谈没调工具多半是工具描述不够明确或者客户端没读到 mcpServers 配置。你也可以用 curl 直接打 SSE 端点做冒烟测试curl -N http://localhost:8081/case1/sse正常会保持连接并推送事件流。这一步能排除掉客户端配置的干扰快速定位是服务端问题还是客户端问题。5. 本篇常见错排查报错一Unsupported class file major version。这是 JDK 版本不匹配。spring ai mcp 要 JDK 17如果你机器默认是 JDK 8启动就炸。solon 那套反过来JDK 8 就能跑别硬升。用java -version确认当前版本多版本共存时在启动命令里指定绝对路径。报错二客户端里工具列表为空。先检查config.toml或settings.json的路径是不是绝对路径相对路径在客户端拉起子进程时经常解析错。再确认 jar 包能独立启动如果手动java -jar都起不来客户端更起不来。报错三Connection refused打 SSE 端点。端口没对上。solon 默认端口和 spring 不一样SERVER_PORT环境变量要和你 curl 的端口一致。另外确认服务真的启动完成了再 curl加个 sleep 或者看日志。报错四模型不调用工具只闲聊。工具描述写得太模糊比如只写查询天气没写参数含义。把ToolParam的 description 补全模型才知道该传什么。实测下来描述越具体命中率越高。报错五Key 无效或 401。检查settings.json里的apiKey是不是从 https://taotoken.net/api-keys 复制完整有没有多余空格。baseUrl 别自己加斜杠后缀。6. 选型建议与后续动作如果你是新项目、JDK 17 起步、团队熟悉 Spring 那一套spring ai mcp 的组件化思路更顺配置器发布的方式和现有 Spring 代码风格一致。如果你是老项目、JDK 8 卡死、或者想在一个服务里挂多组工具给不同场景用solon ai mcp 的多端点能力更实用注解写法也更接近 MVC上手快。两套框架的 Key 通道都走同一个入口切换成本主要在启动配置和依赖上。先把工具跑通再考虑接更多模型和 Agent 场景。需要长期做编码联调的可以去 https://taotoken.net/coding-plan 看额度方案只想快速验证模型能不能调到你的工具直接在 https://taotoken.net/api 的对话页试最快。接入过程中遇到配置问题https://taotoken.net/doc 里的说明比到处搜帖子靠谱。
