ARTICLE DETAIL

资讯详情

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

Solon AI + MCP实战:5行代码搞定天气查询,TaoToken统一Key让LLM告别数据孤岛

Solon AI + MCP实战:5行代码搞定天气查询,TaoToken统一Key让LLM告别数据孤岛 1. 从“一问三不知”说起Solon AI 接入 MCP 天气查询的真实场景你问大模型“杭州明天适合户外活动吗”它大概率会回你一句“建议查询天气预报”。不是模型不聪明而是它压根拿不到实时数据。这个问题的本质是 LLM 与外部世界之间缺了一根标准化的“数据线”。我试过最原始的做法在业务代码里手写 HTTP 请求调天气 API再把结果拼进 prompt。能跑但每接一个数据源就要重写一遍胶水逻辑模型换了、工具换了代码全得推倒重来。Solon AI 结合 MCPModel Context Protocol解决的正是这件事——把“工具调用”抽象成协议层能力让 LLM 通过统一接口发现并调用外部服务。这篇要做的是一个最小可运行闭环用 Solon AI 写一个天气 MCP 服务端用 TaoToken 统一 Key 打通 LLM 通道客户端 5 行核心代码完成一次真实天气查询。适合已经会写 Java、想快速把 MCP 跑起来的人也适合正在评估“要不要把工具接入标准化”的团队。核心检索词先摆出来Solon AI 是什么它是国产 Java 生态里对 AI 能力封装比较轻量的框架支持 MCP 服务端与客户端双向能力MCP 能做什么它让 LLM 在对话中动态调用外部工具而不是靠预训练知识硬答适合谁想用最少代码验证“LLM 获取实时数据”这条链路的开发者。整条链路分三段MCP 服务端暴露天气工具 → TaoToken 提供统一 Key 与 API 通道 → Solon AI 客户端把工具挂到模型上发起提问。下面按可复制的顺序拆开。2. TaoToken 前置准备统一 Key 与 API 通道怎么配在写代码之前先把“模型通道”这件事解决掉。MCP 负责工具调用但模型本身还是要走一个 API 入口。TaoToken 在这里的角色是统一 Key 与统一 Base URL——你不用为每个模型单独维护一套密钥和地址换模型只改 Model ID。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 地址注意不带 UTMhttps://taotoken.net/api需要准备三件套这也是后面所有配置的基础配置项值说明Base URLhttps://taotoken.net/api所有请求的统一入口API Key在控制台创建形如 sk-xxxx只显示一次Model ID按需选择例如 claude-sonnet-4-5、gpt-4o 等拿 Key 的路径进入控制台 → API Keys → 创建新 Key → 复制保存。这一步别偷懒Key 只完整显示一次丢了只能重建。注意Base URL 填 https://taotoken.net/api不要在后面手动加 /v1 之类的路径客户端 SDK 会自己拼接。多填一段最常见的后果就是 404。如果你用的是 Claude Code 这类工具配置形态会落在 settings.json 里如果用 Cline / MCP 客户端则落在 MCP 的 env 段。无论哪种本质都是把上面三件套塞进对应字段。下面给一份通用 JSON 片段路径按你实际工具的配置文件位置放{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-5 } }这段配置的含义很直白告诉客户端“模型请求走 TaoToken 的通道用这个 Key默认用这个模型”。MCP 服务端的地址是另一回事别混在一起——MCP 服务端跑在本地 8080模型通道走 TaoToken两者是并列的两条线。前置准备做到这里就够了。接下来进入代码先写服务端再写客户端。3. 可复制配置Solon AI 天气 MCP 服务端与客户端代码先明确依赖。Solon AI 3.3 起对 MCP 的支持已经比较完整JDK 1.8 可跑。Maven 里引入 Solon AI 的 MCP 模块即可具体坐标以你项目实际版本为准核心是solon-ai-mcp这一类模块。3.1 服务端5 行核心代码暴露天气工具服务端的职责是把一个普通 Java 方法变成 LLM 能“看见”的工具。靠两个注解完成McpServerEndpoint声明这是一个 MCP 服务端点ToolMapping把方法映射成工具描述。McpServerEndpoint(name weather-server, sseEndpoint /mcp/weather) public class WeatherService { ToolMapping(description 获取指定城市的未来三天天气预报) public String getWeather(Param(description 城市名称) String city) { return WeatherApi.getForecast(city); } }数一下去掉类声明和空行真正干活的就是注解加方法体这几行。WeatherApi.getForecast(city)是你自己的实现可以调真实天气接口也可以先返回 mock 数据验证链路。description 字段很关键——LLM 靠它判断“什么时候该调这个工具”写清楚“未来三天”“指定城市”这类语义模型命中率会明显提升。启动后服务端会在http://localhost:8080/mcp/weather暴露一个 SSE 端点。这个地址就是客户端要连的目标。3.2 客户端把工具挂到模型上发起提问客户端要做两件事连上 MCP 服务端拿到工具列表把工具塞进模型请求的 options 里。McpClientProvider toolProvider McpClientProvider.builder() .apiUrl(http://localhost:8080/mcp/weather) .build(); ChatResponse response chatModel.prompt(杭州明天适合户外活动吗) .options(o - o.toolsAdd(toolProvider)) .call();McpClientProvider负责协议握手和工具发现toolsAdd把整个 provider 的工具集注册给本次对话。模型收到问题后如果判断需要天气数据会自动发起工具调用拿到结果再组织自然语言回答。整个过程你不需要手写“解析模型输出 → 判断是否要调工具 → 执行 → 回填”这套循环MCP 客户端帮你做了。3.3 模型通道配置接上 TaoTokenchatModel的构建需要指向 TaoToken。以 Solon AI 的模型配置为例核心是 Base URL、Key、Model ID 三项ChatModel chatModel ChatModel.of(https://taotoken.net/api) .apiKey(sk-你的Key) .model(claude-sonnet-4-5) .build();到这里两条线合流了模型请求走 TaoToken工具调用走本地 MCP 服务端。客户端代码总量控制在 5 行核心逻辑内其余都是配置。4. 验证请求一次真实调用返回结果长什么样配置写完跑一次才算数。启动顺序很重要先起 MCP 服务端确认 8080 端口可访问再跑客户端。第一步验证服务端活着。浏览器或 curl 访问 SSE 端点能看到事件流输出就说明端点正常curl -N http://localhost:8080/mcp/weather正常会持续输出event:和data:行这是 SSE 的长连接特性不是卡住。第二步跑客户端提问。控制台会依次出现模型收到问题 → 发起工具调用打印工具名 getWeather 和参数 city杭州→ 服务端返回预报数据 → 模型生成最终回答。一次成功的返回大致是这样[工具调用] getWeather(city杭州) [工具结果] 杭州未来三天明天多云转晴22-28℃适合户外后天... [模型回答] 杭州明天多云转晴气温 22-28℃适合户外活动建议...看到“工具调用”那一行就说明 MCP 链路通了。如果模型直接回答而没有工具调用通常是 description 写得不够明确或者模型判断不需要外部数据。第三步换一个模型验证统一 Key 的价值。把 Model ID 从claude-sonnet-4-5改成另一个模型Base URL 和 Key 不动重跑。工具调用逻辑完全一致——这就是统一通道的意义换模型不改接入层。验证模型本身是否正常可以走模型对话页面单独测一次https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite5. 本篇常见错排查401、local proxy failed、reading choices、OAuth链路跑不通时报错信息往往指向很具体的位置。下面按真实遇到的频率排。401 UnauthorizedKey 错了、过期了或者 Base URL 和 Key 不匹配。先确认 Key 是从控制台复制的完整值没有多余空格再确认 Base URL 是https://taotoken.net/api没有手写/v1。如果 Key 是在别的平台创建的那必然 401——Key 和 Base URL 必须同源。local proxy failed客户端连不上本地 MCP 服务端。检查 8080 端口是否被占用、服务端是否真的启动成功、apiUrl里的路径是否和sseEndpoint完全一致。路径差一个字符都会连不上。reading choices 相关报错通常是模型返回结构不符合客户端预期常见于 Model ID 填错或模型不支持工具调用。换一个明确支持 function calling 的 Model ID 重试同时确认请求确实带上了 tools 参数。OAuth 报错出现在用 Claude Code 这类工具接入时配置文件里的认证字段没对齐。检查 settings.json 里 Base URL、Key、Model 三项是否都指向 TaoToken字段名是否和工具要求的一致。三件套缺一不可{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-5 } }排障顺序建议固定先单独验证模型通道直接问一个不需要工具的问题再单独验证 MCP 服务端curl SSE 端点最后合起来跑。分段定位比一上来就查全链路快得多。6. 把这条链路用起来从天气查询到长期编码 Agent天气查询只是最小验证。真正有价值的是这套结构可以复制到任何数据源把getWeather换成查订单、查库存、查内部文档服务端注解写法不变客户端toolsAdd不变模型通道不变。新增一个工具的成本从“对接一个 API 加写一套胶水”降到“加一个带注解的方法”。如果你打算把这类能力用在长期编码或 Agent 场景建议走 Coding Plan工具调用会频繁发生稳定通道比单次调用更重要https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite需要管理多个 Key 或查看调用量控制台在这里https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite接入文档含各客户端配置示例https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI Keys 创建入口https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite最后一个实操建议服务端工具的 description 一定要写“人话”把使用场景、参数含义、返回内容都描述清楚。模型选不选这个工具几乎全靠这段文字。我踩过的坑就是 description 写得太技术化模型看不懂工具明明注册了却从不被调用。改成“获取指定城市未来三天天气预报返回温度和天气状况”之后命中率立刻上来了。
返回列表