ARTICLE DETAIL

资讯详情

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

Spring AI 入门:(10)模型上下文协议(MCP)与 TaoToken 统一 Key 接入实践

Spring AI 入门:(10)模型上下文协议(MCP)与 TaoToken 统一 Key 接入实践 1. 为什么 Spring AI 项目需要 MCP 与统一 Key 通道如果你已经用 Spring AI 的Tool注解写过几个工具方法大概会有这样的体会调自己系统内部的几个接口确实够用。但只要场景稍微复杂一点比如想复用社区里现成的工具实现或者让 Claude Desktop、Spring AI 应用、Python Agent 共享同一套工具Tool就开始力不从心了。它本质上是紧耦合的静态绑定工具定义硬编码在 Java 代码里客户端调用要靠类路径和方法引用来定位工具换一个语言栈就得重写一遍。模型上下文协议MCPModel Context Protocol解决的正是这个问题。它定义了一套客户端-服务器架构把外部能力封装成标准化的工具Tools、资源Resources和提示Prompts客户端通过动态发现机制获取这些能力。一次实现任何兼容 MCP 协议的 AI 客户端都能调用不同技术栈实现的工具只要符合规范就能互通。对 Java 开发者来说Spring AI 提供了完整的 MCP Starter 生态把协议细节和传输层都封装好了。但真正落地时还有一个绕不开的环节模型调用的 Key 和 Base URL 怎么管。MCP 客户端负责发现工具可工具最终还是要交给大模型去决策调用而模型请求得走一个稳定的 API 通道。如果每个项目、每个环境都散落着不同的 Key联调时很容易乱。这篇就聚焦 Spring AI 项目中 MCP 客户端的配置与联调用 TaoToken 统一 Key/API 通道把模型调用链路跑通给出application.yml里base-url与api-key的可复制配置片段并演示一次 MCP 工具调用请求的验证动作确认请求经统一通道正常返回。适合谁看正在用 Spring AI 1.1.x 做 MCP 集成的 Java 开发者尤其是本地想快速跑通「MCP 工具发现 模型调用」完整链路、又不想在 Key 管理上折腾的人。下面从环境准备开始一步步来。2. TaoToken 前置准备统一 Key 与 API 通道在写 MCP 配置之前先把模型调用的通道准备好。Spring AI 的 OpenAI Starter 走的是 OpenAI 兼容协议只要base-url和api-key对得上模型请求就能正常发出。TaoToken 在这里扮演的角色就是统一入口一个 Key 覆盖多种模型Base URL 固定省去每个项目单独配不同厂商地址的麻烦。先说清楚它是什么、能做什么。TaoToken 提供 OpenAI 兼容的 API 通道你拿到的 Key 可以直接填进 Spring AI 的spring.ai.openai.api-keyBase URL 填https://taotoken.net/api。这样 MCP 客户端发现工具后模型决策调用工具时发出的请求统一走这条通道。适合谁需要在一个 Spring AI 项目里切换不同模型做对比、或者团队里多个项目想共用一套 Key 管理的场景。前置准备分三步。第一步拿到 API Key。访问控制台创建地址是 https://taotoken.net/api-keys 登录后在 API Keys 页面新建一个复制出来保存好。注意 Key 只在创建时完整显示一次丢了就得重建。第二步确认 Base URL。TaoToken 的 API 入口是https://taotoken.net/api注意这里不加任何查询参数直接作为base-url的值。Spring AI 的 OpenAI Starter 会在后面自动拼接/chat/completions等路径所以你不要手动加/v1否则会拼成/api/v1/chat/completions导致 404。这一点我踩过坑后面排障章节会细说。第三步选一个模型 ID。TaoToken 支持多种模型具体可用列表可以在模型对话页面查看地址 https://taotoken.net/models 。选一个工具调用能力靠谱的比如 GPT-4o 系列或者通义千问 qwen-plusMCP 工具调用对模型的 Function Calling 能力有要求工具描述理解不了的模型失败率会很高。把这三样东西准备好api-key、base-url、model。接下来写配置。如果你还没决定长期用哪个模型可以先在模型对话页面手动试几条带工具调用的 prompt确认模型能正确理解工具描述再写进项目配置。这一步花几分钟能省掉后面反复改配置的时间。注意Key 不要硬编码进代码提交到仓库。本地开发用环境变量生产环境用配置中心或密钥管理服务。下面配置片段里我用${TAOTOKEN_API_KEY}占位你实际运行时通过环境变量注入。3. 可复制配置application.yml 与 Maven 依赖这一节给出完整的可复制片段包括 Maven 依赖、application.yml配置以及 ChatClient 的注册代码。路径和原文保持一致你直接对照改就行。先看 Maven 依赖。Spring AI 用 BOM 统一管理版本MCP 客户端 Starter 和 OpenAI Starter 都要引properties spring-ai.version1.1.2/spring-ai.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies !-- OpenAI 兼容协议 Starter走 TaoToken 统一通道 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency !-- MCP 客户端 Starter自动引入协议实现和传输层 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-client/artifactId /dependency !-- WebFlux异步客户端或流式输出需要 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency /dependencies然后是application.yml。这里的关键是base-url填 TaoToken 的 API 入口api-key从环境变量读MCP 客户端连一个本地 STDIO 模式的数学计算服务器做演示spring: ai: # 模型配置走 TaoToken 统一 Key/API 通道 openai: api-key: ${TAOTOKEN_API_KEY} base-url: https://taotoken.net/api chat: options: model: gpt-4o temperature: 0.7 # MCP 客户端配置 mcp: client: enabled: true type: SYNC stdio: connections: math-mcp-server: command: cmd args: - /c - npx - -y - michaelguo/math-mcp-server-nodejs request-timeout: 120s几个参数说明一下。type: SYNC对应传统 Servlet 应用Spring MVC如果你是全响应式应用Spring WebFlux就改成ASYNC。stdio.connections下面可以配多个服务器每个连接会创建一个独立的 MCP 客户端实例ToolCallbackProvider会自动汇总所有连接暴露的工具。request-timeout建议设 30s 到 120sSTDIO 模式启动子进程有时会慢设太短容易超时。Windows 下用cmd /c npx启动Linux 或 macOS 直接写command: npx就行。michaelguo/math-mcp-server-nodejs是一个社区数学计算 MCP 服务器暴露add、subtract等工具适合做验证。最后是 ChatClient 的注册代码。这里有个必须注意的点MCP 工具要通过ToolCallbackProvider配合.defaultToolCallbacks()注入不要用.tools()package com.springai.guide.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Arrays; RestController public class McpTestController { private final ToolCallbackProvider toolCallbackProvider; private final ChatClient mcpSyncClient; public McpTestController(ToolCallbackProvider toolCallbackProvider, ChatClient.Builder builder) { this.toolCallbackProvider toolCallbackProvider; this.mcpSyncClient builder .defaultSystem(你是一个智能助手可以使用 MCP 提供的工具来完成任务) // 关键必须通过 .defaultToolCallbacks 注入 ToolCallbackProvider .defaultToolCallbacks(toolCallbackProvider) .build(); } GetMapping(/mcp/tools) public String listTools() { if (toolCallbackProvider null) { return ERROR: ToolCallbackProvider is null; } var callbacks toolCallbackProvider.getToolCallbacks(); if (callbacks null || callbacks.length 0) { return No tools available. Check MCP connection logs.; } return Arrays.stream(callbacks) .map(callback - callback.getToolDefinition().name()) .toList() .toString(); } }spring-ai-starter-mcp-client会在应用启动时通过SyncMcpToolCallbackProvider同步模式或AsyncMcpToolCallbackProvider异步模式自动创建ToolCallbackProviderbean不用手动编码。你只要把它注入进来注册到 ChatClient 上就行。4. 验证请求MCP 工具发现与模型调用链路配置写完启动应用验证两件事MCP 工具能不能被发现模型能不能通过 TaoToken 通道调用工具并返回结果。先看启动日志。应用起来后控制台应该能看到 MCP 服务器启动的信息类似: MCP server started : STDERR Message received: Math MCP Server 已启动正在监听 stdio...如果没看到说明子进程没起来检查command和args配置Windows 下确认cmd /c npx能手动跑通。然后访问工具发现接口curl http://localhost:8080/mcp/tools预期返回当前发现的所有 MCP 工具名称[add, subtract]这一步确认了 MCP 客户端连接正常工具被正确发现并注册成了ToolCallback。如果返回No tools available说明连接失败或服务器没暴露工具去看应用日志里的 MCP 连接错误。接下来验证模型调用链路。加一个测试接口让模型用 MCP 工具做计算GetMapping(/calc) public String calculate(RequestParam String expression) { return mcpSyncClient.prompt() .user(请计算 expression) .call() .content(); }调用它curl http://localhost:8080/calc?expression2的10次方乘以3除以4预期输出类似2^10 1024乘以 3 得 3072除以 4 得 768这个请求的完整链路是你的 HTTP 请求进入 Spring AI 应用ChatClient 把用户问题和 MCP 工具描述一起发给模型模型决定调用add或subtract工具Spring AI 执行 MCP 工具调用把结果回传给模型模型生成最终回答。而模型请求这一环走的是base-url: https://taotoken.net/api加你的api-key统一通道正常返回。如果你想确认请求确实经过了 TaoToken 通道可以在 TaoToken 控制台的用量记录里看到对应的调用。地址 https://taotoken.net/console 登录后查看请求日志能看到模型 ID、时间、token 消耗等信息。这一步能帮你排除「请求发到了别处」的疑虑。验证通过后你可以把model换成别的模型再跑一次同样的/calc请求。MCP 工具集成逻辑不用动只改application.yml里的模型配置这就是 MCP 加统一 Key 通道的价值工具复用模型可换。5. 本篇常见错排查401、local proxy failed、reading choices联调时最容易卡在几个报错上这一节对照真实错误信息给排查路径。401 Unauthorized。最常见的原因是api-key没读到或填错。检查环境变量TAOTOKEN_API_KEY是否真的注入到了应用进程Spring Boot 读环境变量是启动时读取你改了环境变量要重启应用。另外确认 Key 没有多余空格复制时容易带上换行。如果 Key 正确还报 401去控制台确认 Key 是否被禁用或额度耗尽。local proxy failed / connection refused。这个报错通常出现在 MCP 客户端连不上服务器时。STDIO 模式下Spring Boot 会启动一个子进程跑 MCP 服务如果command或args写错子进程起不来就会报连接失败。Windows 下确认cmd /c npx -y michaelguo/math-mcp-server-nodejs能在命令行手动跑通Linux 或 macOS 下把command改成npx去掉cmd和/c。另外request-timeout设太短也会导致启动超时先调到 120s 试试。Error reading choices / 响应解析失败。这个报错一般和base-url有关。如果你把base-url写成了https://taotoken.net/api/v1Spring AI 会拼成/api/v1/chat/completions而正确路径是/api/chat/completions返回体不是预期的 OpenAI 格式解析就失败了。把base-url改回https://taotoken.net/api不要手动加/v1。还有一种情况是模型 ID 写错返回了错误结构检查model值是否在可用列表里。OAuth / 认证相关报错。如果你用的是需要 OAuth 的 MCP 服务器Spring AI 的 MCP 客户端 Starter 默认走 STDIO 或 HTTPSSEOAuth 流程要单独配。本地联调阶段建议先用不需要认证的 STDIO 服务器把链路跑通再处理认证。另外注意MCP 客户端配置和模型 API Key 是两回事spring.ai.openai.api-key管的是模型调用MCP 服务器的认证在mcp.client下面单独配别混了。工具注册报错。如果你在 ChatClient 构建时用了.tools(toolCallbackProvider)启动会直接报错。正确做法是.defaultToolCallbacks(toolCallbackProvider)。这个坑原文也提到了新版 Spring AI 对 MCP 工具的注册方式有明确要求ToolCallbackProvider不能传给.tools()。排查顺序建议先确认应用能启动、MCP 子进程能起来再确认/mcp/tools能返回工具列表最后确认/calc能走通模型调用。每一步单独验证比一次性调整个链路容易定位问题。6. 从验证到长期使用Coding Plan 与接入文档链路跑通之后接下来看怎么把它用到日常开发里。如果你只是偶尔验证一下模型调用用按量计费的 API Key 就够了。但如果你打算长期在 Spring AI 项目里做 MCP 集成、跑 Agent 任务或者团队里多个项目共用一套通道可以了解一下 Coding Plan地址 https://taotoken.net/coding-plan 。它适合长期编码和 Agent 场景具体额度 and 计费方式在页面里有说明按自己的用量选就行。接入过程中遇到配置问题优先查接入文档地址 https://taotoken.net/doc 里面有 Base URL、认证方式、模型列表和常见错误的说明。文档里的路径和参数以页面为准我上面写的配置片段如果和文档有出入以文档为准。再给一个实用技巧把base-url、api-key、model这三样抽成环境变量或配置中心的统一配置不要散落在各个application.yml里。Spring AI 的配置支持${}占位你可以用TAOTOKEN_BASE_URL、TAOTOKEN_API_KEY、TAOTOKEN_MODEL三个环境变量统一管理本地开发用.env文件生产环境用配置中心。这样换模型、换 Key 只改一处MCP 工具集成逻辑完全不用动。最后MCP 服务器的动态能力发现值得关注。Spring AI 在org.springframework.ai.mcp包里定义了McpToolsChangedEvent事件服务器工具列表变化时会发布这个事件订阅它的组件可以刷新工具回调。这意味着你可以在服务启动时动态注册工具AI 应用不用重启。如果你的场景需要集中式工具注册中心这个能力会很有用。先把基础链路跑通再按需扩展。
返回列表