ARTICLE DETAIL

资讯详情

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

SpringAI+MCPServer+MCPClient快速入门:把MCP Client的Base URL改到TaoToken

SpringAI+MCPServer+MCPClient快速入门:把MCP Client的Base URL改到TaoToken 1. SpringAI 接入 MCP Server 与 MCP Client 的最小可跑链路SpringAI 把大模型调用、工具注册、MCP 协议通信这几件事揉进了一套 Spring Boot 风格的自动配置里你不需要手写 JSON-RPC 的报文也不用自己维护 SSE 长连接。MCP Server 负责把本地方法暴露成「工具」MCP Client 负责把这些工具挂到 ChatClient 上模型在推理时自己决定要不要调工具。这套链路跑通之后你就能用自然语言驱动后端服务比如「帮我查一下 mack 这个用户的信息」模型判断需要调工具就会走 MCP 通道把请求打到 Server 上。这篇要解决的核心问题是MCP Client 默认会去连各家模型厂商的官方地址但很多团队希望把模型请求统一收敛到一条可控的 API 通道上。我这次把 MCP Client 的 Base URL 改到 TaoTokenhttps://taotoken.net/api让模型对话和工具调用都从同一个出口走日志好核对Key 也好管理。适合谁看已经会用 Spring Boot 写 REST 接口、想快速把 MCP 跑起来、又不想在多个模型平台之间来回切配置的 Java 开发者。整条链路的最小形态是两个模块mcp-server 跑在 8081暴露一个查询用户信息的工具mcp-client 跑在 8082对外提供一个/jsonToSay接口内部用 ChatClient 调模型模型按需触发工具。下面从环境、依赖、配置到验证一步步来配置片段都可以直接复制。2. TaoToken 前置准备与 MCP Client 通道统一在动手改配置之前先把 TaoToken 这边的准备工作做完。你需要一个可用的 API Key以及确认 Base URL 是https://taotoken.net/api。这个地址是 OpenAI 兼容风格的SpringAI 的 OpenAI starter 可以直接指过来不需要额外写适配层。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册和拿 Key 的流程在控制台里完成。具体动作分三步。第一步进控制台创建 API Key建议按项目命名比如springai-mcp-demo方便后面在日志里区分调用来源。第二步确认你要用的模型 ID比如glm-4-flash这类对话模型MCP Client 的 chat 配置里要填这个 ID。第三步把 Base URL 和 Key 记下来后面写进application.yml。这里有个容易踩的点MCP Client 的配置里其实有两层「地址」。一层是 MCP Server 的 SSE 连接地址指向你本地的 8081另一层是模型 API 的 Base URL指向 TaoToken。很多人第一次配的时候把这两个搞混结果模型请求打到了本地 Server 上报连接拒绝。记住spring.ai.mcp.client.sse.connections.*.url是 Server 地址spring.ai.openai.base-url是模型通道地址两者互不相干。为什么要把模型通道统一到 TaoToken实际项目里团队往往同时用几个模型如果每个模型都配一套官方地址和 Key配置散落在多个文件里出问题排查起来很痛苦。收敛到一个 Base URL 之后你只需要换 model ID 就能切模型Key 也只有一份日志里所有模型请求都从同一个出口走核对请求和返回结果时一目了然。我试过在三个环境里分别配官方地址最后因为 Key 过期和地址写错排查了大半天统一通道之后这类问题基本消失。还有一点TaoToken 的 API 地址不带任何路径后缀之外的参数直接写https://taotoken.net/api即可SpringAI 会自动拼接/v1/chat/completions这类路径。如果你在配置里多写了/v1会变成/api/v1/v1/...直接 404。这个坑我在第一次配的时候踩过日志里看到 404 还以为是 Key 的问题其实是路径重复了。3. 可复制的 application.yml 与 MCP Client 配置片段这一节是全文的核心配置写对了链路就通了一半。先看 mcp-server 的application.yml它负责暴露工具和 SSE 端点。server: port: 8081 spring: application: name: mcp-server ai: mcp: server: name: mcp-server version: 1.0.0 description: AI 工具服务 type: async sse-message-endpoint: /mcp/messagesServer 侧的关键是sse-message-endpointClient 会通过这个路径建立 SSE 连接并收发消息。type: async表示异步处理适合工具执行时间稍长的场景。再看 mcp-client 的application.yml这里同时配了 MCP Server 连接和 TaoToken 模型通道。server: port: 8082 spring: application: name: mcp-client ai: mcp: client: enabled: true name: my-mcp-client version: 1.0.0 request-timeout: 30s type: SYNC sse: connections: server1: url: http://localhost:8081 openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: glm-4-flash temperature: 0.7注意base-url写的是https://taotoken.net/api没有多余的/v1。api-key用环境变量注入避免把 Key 硬编码进仓库。model填你在 TaoToken 控制台确认过的模型 ID。sse.connections.server1.url指向本地 Server 的 8081 端口Client 启动时会自动去连。如果你用的是settings风格的配置比如某些 IDE 插件或独立 Client对应的 JSON 片段是这样{ mcpServers: { server1: { url: http://localhost:8081, type: sse } }, model: { baseUrl: https://taotoken.net/api, apiKey: 你的 TaoToken API Key, modelId: glm-4-flash } }三件套记牢Base URL 是https://taotoken.net/apiKey 从控制台拿Model ID 填glm-4-flash。这三样在 MCP Client 侧配齐模型请求和工具调用就都能走通。依赖方面mcp-client 的pom.xml需要这几个dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-client/artifactId version1.0.0/version /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId version1.0.0/version /dependencyServer 侧需要spring-ai-starter-mcp-server-webmvc。版本号按你项目里 SpringAI 的 BOM 来这里写 1.0.0 只是示意实际以你引入的为准。工具注册的代码在 Server 侧用一个Tool注解标记方法再通过ToolCallbackProvider注册Component public class McpToolService { Tool(description 根据用户名称查询系统用户信息) public String getUserInfoByName( ToolParam(description 用户名称例如 mack、jay) String userName) { // 这里替换成你真实的查询逻辑 return 查询到用户 userName 状态正常; } }然后在启动类里注册Bean public ToolCallbackProvider userInfoTools(McpToolService service) { return MethodToolCallbackProvider.builder() .toolObjects(service) .build(); }Client 侧调用时把toolCallbackProvider挂到 ChatClient 上var chatClient chatClientBuilder .defaultTools(toolCallbackProvider) .build(); String content chatClient.prompt(question).call().content();这样模型在收到「查一下 mack 的信息」这类问题时会判断需要调工具自动走 MCP 通道打到 Server 上。4. 启动验证调用一次工具并核对请求日志与返回结果配置写完启动两个应用。先起 mcp-server看到 8081 端口监听成功再起 mcp-client重点看日志里有没有 Client 注册到 Server 的记录。正常会打印类似这样的内容Client initialize request - Protocol: 2024-11-05, Info: Implementation[namemy-mcp-client - server1, version1.0.0]这行日志说明 Client 已经通过 SSE 连上了 Server协议版本和客户端信息都握手成功。如果没看到这行先检查 Server 是否先启动、sse-message-endpoint路径是否一致。接下来发一个请求验证工具调用。用 curl 打 Client 的接口curl http://localhost:8082/jsonToSay?question帮我查一下mack这个用户的信息预期结果是模型判断需要调工具Server 侧日志会打印出工具被触发的记录Client 侧返回的内容里包含工具执行的结果。Server 日志大概长这样工具被调用: getUserInfoByName, 参数: mack 返回: 查询到用户mack状态正常同时模型请求的日志里能看到请求打到了https://taotoken.net/api返回 200。这一步是核对通道是否统一的关键如果日志里出现的是别的域名说明base-url没生效检查配置层级有没有写错。再发一个不需要工具的问题比如「你好介绍一下你自己」模型会直接回答不触发工具。对比两次日志你能清楚看到模型在什么情况下走工具、什么情况下直接回答。这个对比动作很有用能帮你确认工具注册和模型判断都正常。验证通过的标准有三个Client 启动日志有握手记录、工具类问题触发 Server 日志、模型请求日志指向 TaoToken 地址。三个都满足链路就通了。5. 本篇常见错误排查401、local proxy failed、reading choices跑这条链路时报错基本集中在几个地方。下面按真实遇到的错误对照排查。401 Unauthorized。这个最常见原因是 API Key 没配或配错。检查spring.ai.openai.api-key是否读到了环境变量如果用的是${TAOTOKEN_API_KEY}确认启动时环境变量确实存在。另外注意 Key 有没有多余空格YAML 里冒号后面的空格容易被忽略。还有一种情况是 Key 本身失效了去控制台重新生成一个。local proxy failed / Connection refused。这个报错指向 MCP Server 连接失败。检查spring.ai.mcp.client.sse.connections.server1.url是不是http://localhost:8081Server 是否已经启动。如果 Server 启动慢Client 先起来会连不上调整启动顺序即可。另外确认 Server 的sse-message-endpoint和 Client 的连接路径匹配默认都是/mcp/messages。reading choices 相关报错。这个通常出现在模型返回结构解析阶段原因是 Base URL 指向的接口返回格式和 SpringAI 预期的不一致。检查base-url是不是写成了https://taotoken.net/api/v1多写的/v1会导致路径重复返回 404 或非标准结构。正确写法就是https://taotoken.net/api。如果确认路径没问题检查 model ID 是否在 TaoToken 控制台可用填错模型 ID 也可能返回异常结构。OAuth 相关报错。如果你在配置里误加了 OAuth 相关的参数或者用了需要 OAuth 的模型通道会出现这类错误。TaoToken 的 API 通道用 API Key 鉴权即可不需要 OAuth 流程把多余的 OAuth 配置删掉。工具不触发。模型没调工具先检查defaultTools(toolCallbackProvider)有没有挂上再检查工具的Tool描述是否清晰。描述太模糊模型判断不出该不该调。把描述写具体比如「根据用户名称查询系统用户信息」就比「查询用户」更容易触发。排查时养成看日志的习惯Client 日志看模型请求地址和返回码Server 日志看工具是否被调用。两边日志一对问题基本定位。6. 把通道固定下来后续扩展就顺了链路跑通之后你可以在这个基础上做几件事。一是加更多工具Server 侧多写几个Tool方法Client 不用改模型会自动发现新工具。二是换模型只改spring.ai.openai.chat.options.model这一行Base URL 和 Key 都不用动。三是把配置抽到配置中心多环境共用一套通道配置。如果你打算长期跑编码类或 Agent 类任务可以了解下 Coding Plan 这类方案适合需要持续调用和工具编排的场景。模型对话的调试入口在 https://taotoken.net/api 对应的控制台里接入文档在 https://taotoken.net/api 的文档页可以查到更细的参数说明。API Key 管理在控制台的 API Keys 页面建议按项目分 Key方便后续核对调用量。最后留一个实用技巧在 Client 侧加一行日志把每次模型请求的 Base URL 打出来这样切换环境时一眼就能确认通道有没有指对。配置这东西写对了是透明的写错了就是一堆 401 和连接拒绝日志打全了排查时间能省一大半。
返回列表