尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Spring AI 搭建 MCP 天气服务:TaoToken 统一 Key 接入与 config.toml 配置骨架
1. 为什么要在本地跑一个 MCP 天气服务如果你正在用 Spring AI 做 Agent 或者工具调用大概率会遇到一个很现实的问题模型本身不知道今天杭州下不下雨它需要一个能查实时天气的工具。MCPModel Context Protocol就是干这个的你可以把它理解成 AI 应用和外部数据源之间的 USB-C 接口插上就能用不用为每个模型单独写一套适配。这篇要落地的事情很具体用 Spring AI 搭一个 MCP 天气服务本地能跑通客户端能连上查一次真实天气能返回结构化结果。同时把模型调用的 Key 统一走 TaoToken 的 API 通道省得在多个模型供应商之间来回切换配置。适合谁适合已经写过 Spring Boot、想快速把 MCP Server 跑起来验证链路的 Java 开发者不需要你提前精通 MCP 协议细节。我试过把天气查询直接写死在业务代码里后面换模型、加工具的时候改得头皮发麻。MCP 的价值就在于工具和模型解耦天气服务独立成一个 Server客户端按需接入。下面从环境准备到 config.toml 骨架再到验证和排错一步步来。2. TaoToken 前置准备统一 Key 与 API 通道在写代码之前先把模型调用的通道准备好。TaoToken 在这里扮演的角色是统一入口你拿到一个 Key就能通过它的 API 通道访问不同模型不用为每个供应商单独维护一套鉴权和地址。对 MCP 天气服务来说模型负责理解用户意图、决定调用哪个工具工具本身查天气两者通过 MCP 协议通信。你需要做两件事。第一注册并登录 TaoToken 官网拿到 API Key地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 登录后在控制台里创建 Key。第二记住 API 的基础地址是 https://taotoken.net/api 后面配置里会用到注意这个地址不带任何查询参数。Key 的管理建议单独放一个环境变量别硬编码进代码。你可以先在控制台把 Key 复制出来后面 config.toml 里用占位符引用。如果你还没创建 Key直接进控制台页面操作https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 创建完顺手在 API Keys 页面确认一下 Key 的状态是启用。注意Key 只显示一次创建后立刻保存到安全的地方。后面所有模型调用都靠它丢了只能重新生成。3. 可复制的 config.toml 配置骨架MCP 客户端连接 Server 的时候通常需要一个配置文件来描述 Server 的启动方式和参数。不同客户端比如 Claude Desktop、Cherry Studio、Cline用的配置格式略有差异但核心字段是一致的。下面给一份通用的 config.toml 骨架你可以直接复制改。# MCP 客户端配置骨架 # 用于连接本地 Spring AI 天气 MCP Server [mcp_servers.weather] # 启动方式本地进程用 command远程 SSE 用 url command java args [ -jar, /path/to/mcp-weather-server.jar, --server.port8081 ] # 环境变量把 TaoToken 的 Key 注入进去 env { TAOTOKEN_API_KEY sk-你的Key, TAOTOKEN_BASE_URL https://taotoken.net/api } # 如果走 SSE 远程模式改用下面这段 # [mcp_servers.weather_sse] # url http://localhost:8081/sse # transport sse # 模型调用通道配置供 Spring AI 客户端使用 [ai.openai] base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} chat_model gpt-4o-mini这份骨架里几个关键点。command和args决定 Server 怎么启动本地 jar 包方式最直接。env把 TaoToken 的 Key 和 Base URL 传进去Server 内部调用模型时读这两个变量。如果你用的是 SSE 模式Server 启动后暴露/sse端点客户端用url字段连不用管进程启动。Spring AI 侧的application.yml也要对应配一下把模型通道指向 TaoTokenspring: ai: openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: gpt-4o-mini temperature: 0.3这样模型请求走 TaoToken 的统一通道天气工具通过 MCP 协议暴露两边职责清晰。配置改完记得重启客户端很多连接失败其实是配置没重新加载。4. 天气 MCP Server 的核心实现配置骨架有了接下来看 Server 端怎么写。核心就三块依赖、工具方法、数据模型。依赖用 Spring AI 的 MCP Server starterdependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-server-webflux-spring-boot-starter/artifactId /dependency主应用类里注册工具回调把 WeatherService 暴露成 MCP 工具SpringBootApplication public class McpWeatherApplication { public static void main(String[] args) { SpringApplication.run(McpWeatherApplication.class, args); } Bean public ToolCallbackProvider weatherTools(WeatherService weatherService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService) .build(); } }WeatherService 里用Tool注解描述工具能力模型靠这段描述决定什么时候调用Service public class WeatherService { private final RestClient restClient; public WeatherService() { this.restClient RestClient.builder() .baseUrl(https://wttr.in) .defaultHeader(Accept, application/json) .build(); } Tool(description 查询中国城市的当前天气输入城市名例如 杭州、上海) public String getWeather(String cityName) { WeatherResponse resp restClient.get() .uri(/{city}?formatj1, cityName) .retrieve() .body(WeatherResponse.class); if (resp null || resp.getCurrent_condition() null || resp.getCurrent_condition().isEmpty()) { return 无法获取天气请检查城市名或稍后重试; } CurrentCondition c resp.getCurrent_condition().get(0); return String.format(城市:%s 天气:%s 温度:%s°C 湿度:%s%% 风速:%s km/h, cityName, c.getWeatherDesc().get(0).getValue(), c.getTemp_C(), c.getHumidity(), c.getWindspeedKmph()); } }数据模型用简单的 POJO 接住 JSON 就行字段名和 wttr.in 返回的对齐。CurrentCondition里放temp_C、humidity、windspeedKmph、weatherDesc这些WeatherResponse里放current_condition列表。注意temp_C这种带下划线的字段Jackson 默认能映射如果不行加JsonProperty(temp_C)。打包成 jar 之后用java -jar启动默认端口 8081。启动日志里看到 MCP Server 注册成功的提示说明工具已经暴露出来了。5. 验证一次天气查询请求Server 跑起来之后别急着接客户端先用最直接的方式验证工具本身能不能返回数据。启动 jarjava -jar mcp-weather-server.jar --server.port8081看到类似MCP server started on port 8081的日志后用 curl 测一下 SSE 端点是否存活curl -N http://localhost:8081/sse如果返回一串event: endpoint开头的事件流说明 SSE 通道正常。接着在客户端里配置好 config.toml重启客户端在工具列表里应该能看到weather这个 Server 和getWeather工具。然后在对话里发一句「杭州现在天气怎么样」。模型会通过 TaoToken 通道理解意图决定调用getWeather工具参数是「杭州」。工具返回结构化天气文本模型再组织成自然语言回复。整个过程你能在客户端日志里看到工具调用的记录。实测下来从发消息到返回结果大概两三秒取决于模型响应速度。如果工具被调用了但返回空先检查 wttr.in 是否可达再检查城市名有没有传对。验证通过后这个天气服务就可以挂到你的 Agent 工作流里了。6. 常见报错排查清单跑 MCP 天气服务最容易卡在几个地方按下面顺序排查能省不少时间。连接被拒绝客户端报Connection refused先确认 Server 进程还在跑端口没被占用。lsof -i:8081看一下。如果 Server 启动就崩了多半是依赖没下全或者 JDK 版本不对Spring AI 1.0 需要 JDK 17 以上。工具列表为空客户端连上了但看不到getWeather。检查Tool注解的类有没有被ToolCallbackProvider注册主应用类里的Bean方法名和参数别写错。另外确认 starter 用的是 webflux 版本用错 starter 会导致 MCP 端点不暴露。模型调用 401TaoToken 的 Key 没生效。检查TAOTOKEN_API_KEY环境变量有没有正确注入config.toml 里的env字段拼写对不对。Key 前后别带空格复制的时候容易多带一个换行。天气返回空wttr.in 偶尔抽风换个城市名再试。如果一直空把formatj1换成formatjson看看原始返回确认字段名和你的 POJO 对得上。SSE 连不上客户端配的是url模式但 Server 没开 SSE 端点。确认 starter 是 webflux 版本并且没有把spring.ai.mcp.server.stdio之类的配置开成 stdio 模式。stdio 和 SSE 是两种传输方式别混用。排错的时候优先看 Server 端日志工具调用失败、参数解析错误都会打出来。客户端日志看模型请求和工具调用链两边对照基本能定位。7. 把通道和工具接进你的工作流天气服务只是 MCP 的一个最小验证。真正有价值的是这套结构可以复制每加一个工具就多一个Tool方法客户端配置里多一个 Server 条目模型通道始终走 TaoToken 的统一 Key。你不需要为每个工具单独配一套模型鉴权。如果你打算长期跑编码类 Agent 或者多工具工作流建议把模型调用统一收敛到 TaoToken 的 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 这样 Key 管理和额度都在一个地方看。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有针对 Spring AI 的配置示例遇到 base-url 或者模型名对不上的情况可以直接对照。想先验证模型对话通不通用模型对话页面发一条消息就行https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Key 管理在 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你用 Claude Code 做开发Anthropic 兼容通道的配置在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 把 base_url 换成 TaoToken 的地址就能接。最后留一个实用技巧config.toml 里的路径和 Key 尽量用环境变量别写死。团队协作的时候每个人本地环境不同写死路径会导致别人拉下来跑不起来。把TAOTOKEN_API_KEY和 jar 路径都抽成变量换机器只改变量值配置骨架不用动。
RELATED

相关推荐

企石镇网站仿做避坑指南:3类建站报价拆解与备案真相

企石镇网站仿做避坑指南:3类建站报价拆解与备案真相

企石镇网站仿做避坑指南:3类建站报价拆解与备案真相 很多东莞企石镇的老板找过来,第一句话不是问设计多好看,而是问:“我想照着那个网站做一个一样的,多少钱?”紧接着就卡在 备案流程一头雾水 上,不知道要准备什么材料,怕被卡住影响上线。其实,…

📅 2026/9/28 11:11:47
Humanizer `On.March` 流式日期访问器完全指南:三月 31 个日期属性与源码实现解析

Humanizer `On.March` 流式日期访问器完全指南:三月 31 个日期属性与源码实现解析

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 本篇围…

📅 2026/9/28 11:11:47
Flutter Engine 在 Fuchsia 上的 Dart AOT Runner 集成测试:从环境搭建到源码级原理

Flutter Engine 在 Fuchsia 上的 Dart AOT Runner 集成测试:从环境搭建到源码级原理

跨平台图形学前端 【免费下载链接】engine The Flutter engine 项目地址: https://gitcode.com/gh_mirrors/eng/engine 点击查看 免费下载 导读 dart_aot_runner 是 Flutter Engine 仓库(shell/platform/fuchsia/dart_runner/tests/startup_integratio…

📅 2026/9/28 11:11:47
MORE NEWS

更多资讯

📰

Word打印故障排查指南:驱动、打印服务与队列清理

帮别人处理电脑问题多了,会发现 Word 打印出问题几乎可以排进“办公室电脑疑难杂症 Top 3”。同一个问题,有人卡在“点完打印没反应”,有人直接弹“内存或磁盘空间不足,无法完成操作”,还有人明明打印了,纸…

📰

单模与多模光纤的区别:选型实战、参数对比与排障经验一览

入行第十个年头,带过的实习生问我的第一个正经问题,几乎都是"单模光纤和多模光纤有什么区别"。这问题看着是入门级,真要讲透,能聊出二十分钟。因为答案不是你背下几个参数就完事,它牵扯到光纤的物理原理、光…

📰

单模光纤和多模光纤的区别:原理、选型与工程实践

机房运维七八年,经常被问到一个特别基础但特别要命的问题:单模光纤和多模光纤到底差在哪?说实话,这个问题要是没想明白,后面跳线买错、模块对不上、链路损耗大,全都是在给这一步埋雷。今天就把这层窗户纸捅…

📰

Python实现语音文本多模态情感识别与LLM微调全攻略

简介:基于Python实现的多模态情感识别项目,融合语音(wav2vec2)与文本(BERT)特征,并支持大模型finetune,面向希望入门情感识别或完成课程设计、毕业设计的Python学习者。资源围绕IEMO…

📰

多模态情感识别实战:文本+语音双塔融合与LoRA微调

简介:面向Python初中级学习者以及有毕业设计、课程设计、工程实训需求的人群,这套资源包实现了语音与文本融合的多模态情感识别,并包含大模型fine-tune流程。项目基于IEMOCAP数据集,调用Hugging Face上的BERT-base-uncased与wav2v…

📰

中文情感分析毕设实战:BiLSTM-CRF+Flask轻量部署方案

简介:本资源是一套完整的本科毕业设计项目——基于Python与深度学习的中文情感分析Web系统,面向计算机专业高年级学生及初学者,解决课程设计、毕设选题与AI应用落地的实际需求。系统采用Flask框架搭建前端交互界面,后端集成深度学…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬