Spring AI MCP 的 DeepSeek 直连,改走 TaoToken 行不行?
2026/9/18 6:19:52 网站建设 项目流程

Spring AI MCP 从直连 DeepSeek 到生产级部署,最容易被低估的一步是application.yml里那行openai.base-url。官方 DeepSeek API Key 一旦分散在本地、测试、预发、生产多套环境,后面换模型或换供应商就要挨个改配置。现在把 DeepSeek 模型通道切到 TaoToken,先打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建 API Key,再把 MCP Client 的openai.base-urlhttps://api.deepseek.com改成https://taotoken.net/apiapi-key填刚创建的 Key。ChatClient 调用模型时仍然走原来的getWeather工具链路,Token 消耗统一由 TaoToken 计量。这样做的最大好处是:MCP Server 不用重写,工具注册不用重写,Nacos 注册和监控告警也不用推翻,只把模型出口从 DeepSeek 官方地址换到兼容通道即可。

1. 快速开始:把 MCP Client 的 DeepSeek 直连改到 TaoToken

1.1 环境准备:JDK、Maven 和一把 TaoToken Key

原文的快速开始列了 JDK 17+、Maven 3.6+、Spring Boot 4.x,以及“网络可访问 DeepSeek API”。前三项不变,最后一项现在改成“能访问 TaoToken 的 API 通道”。这里不要改 MCP Server 的端口,也不要改 SSE 端点,只改 Client 端调用模型的那一段。

准备材料如下:

组件版本或要求说明
JDK17+Spring Boot 4.x 要求
Maven3.6+构建 MCP Server 和 Client
Spring AI2.0.0MCP 与 OpenAI 兼容 starter
TaoToken API KeyYOUR_API_KEY从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建
模型 ID以模型广场为准不要直接抄原文的deepseek-chat

打开 TaoToken 之后,先在控制台创建一把 Key。Key 到手后不要写死在代码仓库里,建议用环境变量TAOTOKEN_API_KEY注入。原文里的${DEEPSEEK_API_KEY:sk-your-key}可以保留同样的写法,只是变量名换成TAOTOKEN_API_KEY,默认值换成YOUR_API_KEY。这样本地开发、CI、预发环境可以各自配置,不至于把 Key 提交到 Git。

模型 ID 这一步要特别小心。原文的deepseek-chat是 DeepSeek 官方接口里的名字,TaoToken 模型广场里的模型 ID 可能不同。正确做法是打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看模型广场当时列表,把对应 DeepSeek 通道的模型 ID 复制到spring.ai.openai.chat.options.model。不要自己编deepseek-v3-20250101这类没有依据的后缀,否则启动后调用会直接报模型不存在。

1.2 MCP Server 的 Tool 链路不用动

MCP Server 仍然负责暴露工具,和用哪家模型 API 没有关系。WeatherService里的@Tool注解、ToolRegistryConfig里的ToolCallbackProvider、SSE 端点/api/v1/sse,这些都保持原样。模型通道换到 TaoToken 之后,MCP Server 不知道也不关心 Client 把请求发给了谁。

下面是一个可运行的 MCP Server 配置,端口、SSE 端点、工具能力都按原文风格保留:

server: port: 8080 spring: ai: mcp: server: enabled: true name: weather-service version: 1.0.0 sse-endpoint: /api/v1/sse sse-message-endpoint: /api/v1/mcp capabilities: tool: true logging: level: io.modelcontextprotocol: DEBUG org.springframework.ai.mcp: DEBUG

工具类也只需要关注自己的业务逻辑。getWeather可以继续调用你自己的天气接口,或者先用降级数据跑通链路。下面这段代码重写自原文的WeatherService,但保留了@Tool@ToolParam的关键用法:

package com.example.mcp.tool; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Service; @Service public class WeatherService { @Tool(description = "查询指定城市的实时天气信息,返回温度、湿度、天气状况") public WeatherInfo getWeather( @ToolParam(description = "城市名称,如北京、上海、深圳") String city) { if (city == null || city.trim().isEmpty()) { throw new IllegalArgumentException("城市名称不能为空"); } // 这里仍然调用你自己的天气 API,和模型通道无关 return weatherClient.query(city); } }

工具注册配置也不用改:

package com.example.mcp.config; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.ai.tool.method.MethodToolCallbackProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ToolRegistryConfig { @Bean public ToolCallbackProvider toolProvider(WeatherService weatherService, MathTool mathTool) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService, mathTool) .build(); } }

启动 Server 后仍然可以用curl http://localhost:8080/api/v1/sse看 SSE 端点是否返回event: endpoint。这一步和 TaoToken 没有直接关系,它验证的是 MCP Server 自己是否正常。

1.3 改写 MCP Client 的 application.yml

MCP Client 的改动集中在一处:把spring.ai.openai下面指向 DeepSeek 官方的base-urlapi-key换掉。原文的 MCP Client 连接配置、SSE 配置、工具回调开关都保留。下面是一份可复制的application.yml

server: port: 8081 spring: ai: mcp: client: sse: connections: weather-service: url: http://localhost:8080 sse-endpoint: /api/v1/sse toolcallback: enabled: true openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY:YOUR_API_KEY} chat: options: model: YOUR_MODEL_ID temperature: 0.7 logging: level: org.springframework.ai: DEBUG io.modelcontextprotocol: TRACE

这里有两个硬性细节:base-url必须写成https://taotoken.net/api,末尾不要加/v1api-key用环境变量或占位符YOUR_API_KEY,不要写真实 Key。原文里model: deepseek-chat现在改成YOUR_MODEL_ID,实际值去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场复制当时列表里的 ID。

Client 侧的ChatClient构建方式也不需要大改。原文通过ChatClient.Builder注册系统提示词和工具,下面这段代码保持同样的装配顺序:

package com.example.client.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import java.util.List; @RestController @RequestMapping("/api/chat") public class WeatherChatController { private final ChatClient chatClient; public WeatherChatController(ChatClient.Builder builder, List<ToolCallbackProvider> toolProviders) { builder.defaultSystem("你是一个智能天气助手,可以调用 getWeather 查询天气,并给出出行建议。"); toolProviders.forEach(provider -> builder.defaultTools(provider.getToolCallbacks())); this.chatClient = builder.build(); } @GetMapping("/sync") public String chat(@RequestParam String message) { return chatClient.prompt().user(message).call().content(); } @GetMapping(value = "/stream", produces = "text/event-stream") public Flux<String> streamChat(@RequestParam String message) { return chatClient.prompt().user(message).stream().content(); } }

注意:模型请求走的是spring.ai.openai.base-url,工具调用走的是 MCP SSE 连接,这两条链路在 Spring AI 里是分开的。换 TaoToken 只影响模型请求,不影响getWeather的参数校验、超时和降级逻辑。

1.4 启动并跑通 getWeather 天气查询

先启动 MCP Server:

cd mcp-server mvn spring-boot:run

再启动 MCP Client:

cd mcp-client mvn spring-boot:run

然后发起一次流式对话:

curl "http://localhost:8081/api/chat/stream?message=北京今天天气怎么样?适合户外运动吗?"

期望看到的行为是:Client 先通过 SSE 拿到工具列表,模型决定调用getWeather,MCP Server 执行工具并返回天气数据,最后模型基于工具结果生成出行建议。日志里应该能看到Registered tools: 2或类似数量,以及getWeather被调用的记录。如果工具被调用了,但模型返回内容为空或报 401,那问题通常不在 MCP,而在TAOTOKEN_API_KEY或模型 ID。

2. 核心原理解析:ChatClient 如何经 TaoToken 触发 MCP 工具

2.1 MCP 协议与工具发现和模型通道解耦

MCP 基于 JSON-RPC 2.0,工具发现流程是 Client 向 Server 发tools/list,Server 返回工具 Schema。这个流程完全不经过模型 API。所以你把openai.base-url改成https://taotoken.net/api之后,tools/list仍然走http://localhost:8080/api/v1/sse,工具列表不会因为换模型通道而丢失。

原文的初始化请求、工具列表查询、工具调用请求格式都可以保持不变。真正变化的是模型侧:ChatClient 把用户问题、系统提示词、工具描述一起发给模型,模型返回“我要调用 getWeather”的意图,Spring AI 再通过 MCP Client 执行工具。这个过程中,模型 API 只负责决策,不负责执行工具。

2.2 Spring AI OpenAI 兼容层怎么把请求交给 TaoToken

Spring AI 的spring-ai-starter-model-openai使用 OpenAI 兼容协议。原文把base-url指向https://api.deepseek.com,是因为 DeepSeek 提供了 OpenAI 兼容接口;现在改成https://taotoken.net/api,也是走同样的兼容层。关键在于 URL 拼接:如果base-url写成https://taotoken.net/api,Spring AI 会拼出正确的聊天补全路径;如果多写一个/v1,就可能变成https://taotoken.net/api/v1/chat/completions,从而出现 404。这也是为什么产品事实里反复强调:填进工具的 Base URL 用https://taotoken.net/api,末尾不要带/v1

模型 ID 则决定 TaoToken 把请求路由到哪个模型通道。原文写deepseek-chat,TaoToken 模型广场里可能叫别的名字。不要靠自己猜,打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看当时列表,复制对应 ID。模型广场里的 ID 和计费、通道能力是对齐的,写错就会报模型不存在。

2.3 ToolCallbackProvider 与 ChatClient 的装配顺序

原文在WeatherController构造函数里先设置defaultSystem,再遍历ToolCallbackProvider注册工具。这个顺序在改走 TaoToken 后仍然成立。ChatClient.Builder会把工具定义转换成模型能理解的 function 描述,然后随请求发到https://taotoken.net/api。模型返回工具调用指令后,Spring AI 再调用 MCP Server。

如果工具没有被调用,先看日志里有没有“Registered tools”以及工具数量。如果工具数量为 0,检查@Service是否被 Spring 扫描、@Tool是否加了descriptionToolCallbackProvider是否传入了实例。如果工具数量正常,但模型不调用,可以把temperature暂时调低,或者把系统提示词写得更明确,例如“必须先调用 getWeather 获取天气,再回答”。这些都不是 TaoToken 的问题,而是 MCP 工具提示词和模型决策的问题。

3. 生产环境实践:Nacos 注册、监控告警与 Token 计量

3.1 Nacos 服务发现与 MCP Server 多实例

原文在生产环境把 MCP Server 注册到 Nacos,Client 通过DiscoveryClient动态获取地址。这部分不需要因为 TaoToken 而修改。MCP Server 仍然把mcp-weather-server注册到 Nacos,Client 仍然可以轮询多个实例。唯一要注意的是:模型通道走 TaoToken 之后,Client 到 Server 的 SSE 连接和 Client 到 TaoToken 的 HTTPS 请求是两条独立链路。Nacos 负责前者,TaoToken 负责后者。

多实例部署时,每个 Client 实例都可以用同一把 TaoToken Key,也可以按环境拆分 Key。更推荐按环境拆分:本地、测试、预发、生产各自创建 Key,这样用量统计和排障都更清楚。Key 从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,创建后放进对应环境的密钥管理服务,不要写进 Nacos 明文配置。

3.2 高可用:SSE 超时、重连与工具调用超时

原文给了 MCP Client 的连接超时、读超时、最大重连次数等配置。这些配置在换模型通道后仍然有效。因为模型请求走 TaoToken,工具调用走 MCP SSE,所以两类超时要分开设置:spring.ai.mcp.client.sse.connections.weather-service.read-timeout管的是 Client 到 MCP Server 的 SSE 读超时;spring.ai.openai本身没有单独的读超时属性时,可以通过底层 HTTP 客户端或全局超时控制。工具调用超时仍然建议在RestTemplateWebClient上设置。

如果生产日志里出现工具调用超时,不要先怀疑 TaoToken。先看getWeather背后的天气 API 是否慢,再看 MCP Server 的 Tomcat 线程池是否被打满。模型通道超时则表现为请求https://taotoken.net/api后长时间无响应,这时检查 Client 到公网的出口、重试次数和 Key 的额度状态。

3.3 工具调用链路追踪与 TaoToken 用量对照

原文的ToolCallTraceAdvice会给每次工具调用生成traceId,记录开始、完成和失败。改走 TaoToken 后,建议在模型响应日志里也带上同一个traceId,这样一次用户提问可以串起“模型请求 -> 工具调用 -> 模型总结”全过程。TaoToken 控制台会记录模型侧的 Token 消耗,MCP 日志记录工具侧的耗时和成功率,两边对照就能判断是模型通道慢还是工具慢。

具体做法可以在ChatClient调用前后加日志,把traceId放进 MDC,然后去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台看这次调用的用量记录。注意:TaoToken 只计量模型 Token,不计量你本地getWeather调用的第三方天气 API。工具本身的监控仍然靠 Micrometer。

3.4 监控指标与告警配置

原文用 Micrometer 注册了mcp.tool.callsmcp.tool.durationmcp.tool.errors等指标。这些指标继续保留。模型通道换到 TaoToken 后,可以额外关注两类日志:一类是spring.ai.openai的请求耗时,另一类是 HTTP 状态码。401 通常代表 Key 未生效,404 通常代表base-url多写了/v1或模型 ID 不存在,429 则要看 TaoToken 控制台里的额度或并发情况。

告警规则可以这样拆:工具错误率超过阈值时告警到工具负责人;模型请求 401/404 连续出现时告警到配置负责人;Token 用量突增时去控制台看是哪个 Key、哪个模型、哪个环境。原文的 Prometheus 暴露配置不需要改,只要在 Grafana 里增加模型请求面板即可。

4. 常见问题与解决方案:base-url、API Key 与工具发现

4.1 context-path 404 与 TaoToken base-url 的区别

原文提到 Server 配置server.servlet.context-path=/javaai后,Client 连接报 404。这个 404 是 MCP SSE 路径问题,解决办法是在 Client 的url里补上/javaai前缀。改走 TaoToken 后,可能出现另一种 404:模型请求 404。两者的排查位置不同:

  • MCP SSE 404:看spring.ai.mcp.client.sse.connections.weather-service.urlsse-endpoint是否拼错。
  • 模型请求 404:看spring.ai.openai.base-url是否写成https://taotoken.net/api/v1,正确写法是https://taotoken.net/api

分清楚这两个 404,能省很多时间。

4.2 工具无法被发现:先查 @Tool 再查 ToolCallbackProvider

如果 Client 启动日志显示No tool methods found,这通常和 TaoToken 无关。检查顺序是:第一,工具类是否被@Service@Component管理;第二,@Tool是否加了description;第三,ToolCallbackProvider是否把工具实例传进去;第四,MCP Server 的 SSE 端点是否返回了工具列表。可以在 Server 侧用日志确认Registered tools的数量。工具发现是 MCP 协议层的事,模型通道换了不影响它。

4.3 401 与模型 ID 不存在

401 最常见的原因是TAOTOKEN_API_KEY没有注入成功,或者 Key 被删除、禁用。先确认环境变量是否生效,再确认 Key 是从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建的。如果日志里返回的是“模型不存在”,则去模型广场复制正确的模型 ID,把YOUR_MODEL_ID替换掉。不要直接沿用deepseek-chat,除非模型广场当时列表里确实有这个名字。

4.4 连接超时与工具调用超时

原文把连接超时和工具调用超时分开处理。改走 TaoToken 后仍然要分开看:Client 到 MCP Server 的 SSE 连接超时,调大connection-timeoutread-timeout;模型请求到 TaoToken 的超时,检查出口网络和重试配置;工具内部调用第三方 API 的超时,在RestTemplateWebClient上单独设置。不要把所有超时都归因到模型通道,否则容易改错地方。

5. 下一步:对一下这次 Spring AI MCP 调用的账

5.1 去模型对话确认模型 ID

配置保存并跑通天气查询后,建议先去 TaoToken 模型对话 用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错。模型对话里能正常返回,说明 Key、模型 ID、通道都没问题,再回到 Spring AI MCP 里排查工具链。

5.2 去控制台看用量与创建新 Key

然后打开 控制台 API Keys 看这次调用是否记上账。如果本地、测试、生产混用同一把 Key,建议按环境拆成多把,方便后续对账。创建新 Key 的入口也在同一个控制台页面。

5.3 长期写代码看 Coding Plan

如果你准备把 Spring AI MCP 接到日常编码流程里,比如让 MCP 工具查询内部文档、查天气、查数学计算,模型调用频率会慢慢上来。可以打开 TaoToken Coding Plan 看套餐是否够用。到这一步,application.yml里的base-url已经稳定指向https://taotoken.net/api,MCP Server 的getWeather仍然按原样执行,Nacos 注册和监控告警也不用推倒重来。真正需要你盯住的,是模型 ID 是否随模型广场更新、Key 是否按环境隔离、以及工具超时是否和模型超时分开配置。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询