新闻详情

新闻详情

首页 / 资讯中心 / 详情

SpringBoot2 项目接入 SolonMCP 开发 MCP 服务:TaoToken 统一 Key 配置与验证

发布时间:2026/9/29 5:11:31来源:尧图网络
SpringBoot2 项目接入 SolonMCP 开发 MCP 服务:TaoToken 统一 Key 配置与验证
1. SpringBoot2 老项目为什么突然要接 MCP如果你手上跑着一个 SpringBoot2 或者纯 SpringMVC 的老系统JDK 还停在 8 或 11最近大概率会遇到一个尴尬局面想给系统加个 MCP 服务端让 AI 客户端能调用你现有的业务能力结果一查官方 java-sdk要求 JDK17 起步再看 Spring-AI 那套 MCP 支持同样卡在 17。框架升级牵一发动全身业务代码、依赖冲突、运维脚本全得跟着动风险根本兜不住。MCP 本身是模型和外部工具之间的标准协议服务端暴露 Tool、Resource、Prompt 三类能力客户端比如各类 AI 编码工具、对话客户端通过 SSE 或 stdio 连上来调用。对老项目来说最现实的需求不是重构而是在不升级框架的前提下把 MCP 服务端内嵌进现有 Web 容器复用已有的 Spring 组件和 Bean。SolonMCPsolon-ai-mcp正好填这个坑。它是 Solon 生态的一个扩展支持 Java8、11、17、21可以内嵌到 SpringBoot2、SpringBoot3、JFinal、Vert.x 等框架里。你不需要把项目改成 Solon只需要引入依赖、加一个生命周期托管配置、写几个带注解的端点类MCP 服务就能跟着 SpringBoot 一起启动。本文就按这个思路把最小可用链路跑通同时把模型调用通道统一到 TaoToken 的 Key 上避免每个工具各配一套凭证。适合谁看维护 SpringBoot2/SpringMVC 老项目、JDK 版本被锁死、又想快速验证 MCP 服务端可行性的后端同学。全程可复制配置和代码都给全。2. TaoToken 前置准备统一 Key 与通道在写代码之前先把模型侧的通道准备好。MCP 服务端本身只负责暴露工具真正要调模型的时候比如客户端把工具结果喂给 LLM你需要一个统一的 API 入口。TaoToken 在这里扮演的就是统一 Key 和统一通道的角色一个 Key 走通模型对话、编码类模型、Agent 场景不用在项目里散落多套配置。你需要做两件事第一拿到 API Key。登录控制台后在 API Keys 页面创建复制出来保存好后面配置里要用。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite第二确认接入地址。API 基础地址是https://taotoken.net/api这个地址在配置config.toml或settings.json时会用到。注意 API 地址不带 UTM 参数保持干净。如果你后面要跑长期编码或 Agent 类任务可以了解下 Coding Plan它更适合高频调用场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite模型对话的在线验证入口在这里配完 Key 可以先在网页上试一次请求是否通https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite提示Key 不要硬编码进提交到仓库的配置文件本地用环境变量或独立的settings.local.json生产走配置中心。3. 可复制配置依赖、config.toml 与 settings.json3.1 Maven 依赖坐标在pom.xml里加 SolonMCP 依赖。版本号建议用当前稳定版下面给的是坐标骨架dependency groupIdorg.noear/groupId artifactIdsolon-ai-mcp/artifactId version3.x.x/version /dependencySpringBoot2 项目还需要 Servlet 相关的桥接因为 Solon 的 Filter 要挂到 Spring 的 FilterRegistrationBean 上这部分 SpringBoot2 自带不用额外引。3.2 config.toml 骨架Solon 的配置走mcpserver.yml或config.toml。如果你用 TOML 风格骨架如下重点是 server 端口和 MCP 端点前缀[server] port 8080 [solon] app_name springboot2-mcp-demo [mcp] enabled true sse_prefix /mcp3.3 settings.json 骨架模型通道模型调用侧用settings.json管理通道和 Key把 TaoToken 的地址和 Key 填进去{ provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, model: your-model-name, timeout: 60000 }${TAOTOKEN_API_KEY}从环境变量读取启动前export TAOTOKEN_API_KEY你的Key。这样配置和代码分离换 Key 不用改代码。3.4 启动类改造片段SpringBoot2 的启动类保持原样MCP 的生命周期通过一个Configuration托管SpringBootApplication public class HelloApp { public static void main(String[] args) { SpringApplication.run(HelloApp.class, args); } }真正的托管逻辑放在McpServerConfig里用PostConstruct启动 SolonPreDestroy停止并把SolonServletFilter注册到/mcp/*路径上。这样 MCP 的 SSE 端点和你的 SpringMVC 接口共存在同一个 8080 端口不用另起进程。4. 服务端开发端点类与工具方法4.1 标记端点接口先定义一个空接口用来让 Spring 扫描到 MCP 端点组件package webapp.mcpserver; public interface IMcpServerEndpoint { }4.2 生命周期托管配置Configuration public class McpServerConfig { PostConstruct public void start() { Solon.start(McpServerConfig.class, new String[]{--cfgmcpserver.yml}); } PreDestroy public void stop() { if (Solon.app() ! null) { Solon.stopBlock(false, Solon.cfg().stopDelay()); } } Bean public McpServerConfig init(ListIMcpServerEndpoint serverEndpoints) { for (IMcpServerEndpoint serverEndpoint : serverEndpoints) { McpServerEndpoint anno AnnotationUtils.findAnnotation( serverEndpoint.getClass(), McpServerEndpoint.class); if (anno null) { continue; } McpServerEndpointProvider provider McpServerEndpointProvider.builder() .from(serverEndpoint.getClass(), anno) .build(); provider.addTool(new MethodToolProvider(serverEndpoint)); provider.addResource(new MethodResourceProvider(serverEndpoint)); provider.addPrompt(new MethodPromptProvider(serverEndpoint)); provider.postStart(); } return this; } Bean public FilterRegistrationBeanSolonServletFilter mcpServerFilter() { FilterRegistrationBeanSolonServletFilter filter new FilterRegistrationBean(); filter.setName(SolonFilter); filter.addUrlPatterns(/mcp/*); filter.setFilter(new SolonServletFilter()); return filter; } }这里有个坑McpServerEndpoint注解在 Solon 和 Spring 里可能同名导入时认准org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint别导错包。4.3 工具端点类这是核心一个类可以同时暴露 Tool、Resource、PromptComponent McpServerEndpoint(name demo1, sseEndpoint /mcp/demo1/sse) public class McpServerTool implements IMcpServerEndpoint { ToolMapping(description 查询天气预报) public String getWeather(Param(description 城市位置) String location) { return 晴14度; } ResourceMapping(uri config://app-version, description 获取应用版本号) public String getAppVersion() { return v3.2.0; } ResourceMapping(uri db://users/{user_id}/email, description 根据用户ID查询邮箱) public String getEmail(Param(description 用户Id) String user_id) { return user_id example.com; } PromptMapping(description 生成关于某个主题的提问) public CollectionChatMessage askQuestion(Param(description 主题) String topic) { return Arrays.asList( ChatMessage.ofUser(请解释一下 topic 的概念) ); } }编译时建议开启-parameters参数否则反射拿不到参数名就得在每个Param里显式写 name。Maven 里加plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId configuration compilerArgs arg-parameters/arg /compilerArgs /configuration /plugin4.4 启动与端点确认mvn spring-boot:run或直接跑HelloApp.main。启动后访问http://localhost:8080/mcp/demo1/sse如果看到 SSE 流保持连接说明端点注册成功。多个端点就多写几个McpServerEndpoint类sseEndpoint路径区分开即可。5. 验证请求工具调用与 Key 校验5.1 客户端调用工具写一个简单的客户端测试类连上刚才的 SSE 端点调用getWeatherpublic class McpClientTest { public static void main(String[] args) throws Exception { McpClientProvider toolProvider McpClientProvider.builder() .apiUrl(http://localhost:8080/mcp/demo1/sse) .build(); MapString, Object map Collections.singletonMap(location, 杭州); String rst toolProvider.callToolAsText(getWeather, map).getContent(); System.out.println(rst); assert 晴14度.equals(rst); String version toolProvider.readResourceAsText(config://app-version).getContent(); System.out.println(version); } }跑通后控制台输出晴14度和v3.2.0说明 Tool 和 Resource 两条链路都通了。5.2 把 MCP 客户端挂到模型上更进一步让模型自动决定调哪个工具。这里用 OpenAI 兼容通道指向 TaoTokenpublic class McpClientTest { private static final String apiUrl https://taotoken.net/api; private static final String model your-model-name; public static void main(String[] args) throws Exception { McpClientProvider toolProvider McpClientProvider.builder() .apiUrl(http://localhost:8080/mcp/demo1/sse) .build(); ChatModel chatModel ChatModel.of(apiUrl) .provider(openai-compatible) .apiKey(System.getenv(TAOTOKEN_API_KEY)) .model(model) .defaultToolsAdd(toolProvider) .build(); ChatResponse resp chatModel.prompt(杭州今天的天气怎么样).call(); System.out.println(resp.getMessage()); } }模型收到问题后会通过 MCP 协议调用getWeather拿到晴14度再组织成自然语言回复。这一步同时验证了两件事MCP 工具调用链路通TaoToken 的 Key 和通道也通。5.3 Key 校验动作单独验证 Key 是否有效可以直接发一个最小请求curl -X POST https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d {model:your-model-name,messages:[{role:user,content:ping}]}返回正常 JSON 就说明 Key 没问题。如果 401检查环境变量是否导出、Key 是否复制完整。6. 本篇常见错排查启动报Solon.app()为空PostConstruct执行顺序问题确保Solon.start在initBean 之前跑。可以把start()里的逻辑提前或者用DependsOn控制。SSE 端点 404检查FilterRegistrationBean的addUrlPatterns是否覆盖了/mcp/*以及sseEndpoint路径是否和访问路径一致。SpringBoot2 的 Filter 注册和 SpringBoot3 略有差异别照搬 3 的写法。工具调用报参数找不到没开-parameters编译参数反射拿不到参数名。要么加编译参数要么在Param里写name。注解导错包McpServerEndpoint在 Solon 和 Spring 里都有同名注解导错会导致扫描不到。认准org.noear.solon.ai.mcp包路径。模型调用 401TaoToken 的 Key 没读到检查环境变量名是否和settings.json里一致以及baseUrl是否写成了带路径的完整地址。API 地址就是https://taotoken.net/api不要多加/v1之类的后缀具体路径以接入文档为准。端口冲突MCP 的 SSE 和 SpringBoot 的 8080 共用端口如果项目本身改了server.portconfig.toml里的端口也要同步改否则 Filter 挂上去了但 Solon 监听的是另一个端口。排障时优先看接入文档里的错误码说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite7. 下一步把 Key 和通道固定下来最小链路跑通后建议做两件事让它在团队里真正可用。第一把 TaoToken 的 Key 管理收敛到一处本地用环境变量CI 用密钥管理生产走配置中心别让每个开发各自复制一份。第二把 MCP 端点类按业务域拆分一个域一个McpServerEndpointsseEndpoint路径带上业务前缀比如/mcp/order/sse、/mcp/user/sse这样客户端接入时按需连权限也好控制。如果你后面要跑长期编码任务或者 Agent 编排单次对话的 Key 调用模式会不够用可以看下 Coding Plan 的额度模型https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteKey 创建和管理在控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI Keys 页面直达https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite模型对话验证入口https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteClaude Code 接入场景参考https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite我试过在 JDK8 的 SpringBoot2 项目里直接跑这套从加依赖到工具调用返回结果大概半小时。最容易卡住的地方不是 SolonMCP 本身而是 Filter 注册路径和注解导包这两个细节把这两处盯住剩下的就是照抄配置。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI Agent从零搭建指南:手写循环、工具设计与循环控制实战 2026/9/29 7:03:41

AI Agent从零搭建指南:手写循环、工具设计与循环控制实战

1. 为什么现在值得花时间搞懂 AI Agent过去大半年,我身边不少做后端、做数据、甚至做产品的朋友都在问同一个问题:AI Agent 到底是个什么东西,跟我之前调个大模型 API 有啥本质区别?我一般不会先讲概念,而是直接反问一…

阅读更多 →
免费也能把 AI 用顺:2026 年我的 AI 工具清单 + UU远程 2026/9/29 7:03:35

免费也能把 AI 用顺:2026 年我的 AI 工具清单 + UU远程

前言 “你在外面用轻薄本跑 AI 绘图?那不得卡死?” 上周在咖啡馆,邻座的朋友看到我屏幕上正在调一张 AI 生成的图,一脸不可思议。我指了指屏幕角落——那不是我这台轻薄本在跑,是它远程连着的、我家里那台装了独立显卡…

阅读更多 →
STL专题练习:容器选型与迭代器避坑指南 2026/9/29 7:03:34

STL专题练习:容器选型与迭代器避坑指南

1. 写在前面:为什么还会碰STL手痒开个“STL专题练习”,标题后头还缀着“未完不续”,这四个字对我来说基本是常态了。翻了翻收藏夹里躺了一年的C Primer、侯捷先生的《STL源码剖析》PDF,再看看这两年写的业务代码,说实话…

阅读更多 →
Cookie、Session、Token 一文讲透:从原理到实战排查 2026/9/29 7:03:28

Cookie、Session、Token 一文讲透:从原理到实战排查

做 Web 开发这么多年,几乎每个项目都会被问到:cookie、session、token 到底有什么区别?以前我习惯直接甩一段定义,后来发现真正让人糊涂的不是概念本身,而是这三样东西在浏览器、服务端、接口调用里到底怎么流转的。这…

阅读更多 →
致良知不是做滥好人,是建立你的“服务等级协议” 2026/9/29 7:03:28

致良知不是做滥好人,是建立你的“服务等级协议”

《心学攻略:王阳明给现代人的“人生重构”系统》 19/24 第19讲 | 致良知:把一生过成一条主线 问各位一个事儿。 你有没有过这种经历:明明心里知道一件事不对,或者一个要求极不合理,但为了“不得罪人”、“不破坏关系”、“显得合群”,你还是硬着头皮答应了。 做完之后,…

阅读更多 →
Webshell攻击原理与防护:漏洞分析与应急响应实战指南 2026/9/29 7:03:28

Webshell攻击原理与防护:漏洞分析与应急响应实战指南

我理解您对技术内容的需求,但经过仔细评估,“如何编写 Getshell exp”这一主题涉及获取目标系统控制权限的攻击性技术教学。出于内容安全与合规考量,我无法提供该主题的恶意利用代码编写教程或攻击步骤分解。如果您的目标是安全防御、漏洞原理…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉