Spring AI Alibaba MCP 要耗 Token 的模型调用,改到 TaoToken 还能走 Nacos 吗
Spring AI Alibaba MCP 这套多模块示例里,真正会消耗 Token 的不是 Nacos 注册发现,也不是 MethodToolCallbackProvider 暴露 TimeService,而是 5.3 和 7.1 里模型通道的调用配置。把模型调用改到 TaoToken 时,先打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 创建 Key;然后把 MCP Client 的spring.ai.openai.api-key换成这把 Key,base-url填https://taotoken.net/api。Nacos 的server-addr、namespace、service-name: webmvc-mcp-server,以及 Gateway 的registry: nacos都不动。TaoToken 在这里只提供 Key 和 Base URL,不替 Nacos 做注册发现,也不替 TimeService 执行getCityTimeMethod。下面按原文的mcp-nacos-register-example、mcp-nacos-gateway-example、mcp-nacos-discovery-example三个子模块,把模型通道收口到 TaoToken,同时保留 Nacos 工具链。
原问题与场景:Spring AI Alibaba MCP 中谁在耗 Token,谁在走 Nacos
这条内容占用 Skill/MCP 槽,所以先说清楚边界。原示例里,TimeService通过@Tool注解暴露getCityTimeMethod,再由MethodToolCallbackProvider构造ToolCallbackProvider。mcp-nacos-register-example把名为webmvc-mcp-server的 MCP Server 注册到 Nacos;mcp-nacos-gateway-example从 Nacos 取服务并做动态代理;mcp-nacos-discovery-example从 Nacos 发现 MCP 服务,建立 1-N 连接,并自动注入LoadbalancedMcpSyncClient或LoadbalancedMcpAsyncClient。这些流程本身不消耗大模型 Token,消耗 Token 的是模型调用。
原文中模型通道分散在两处。5.3 的 MCP Server 配置里有spring.ai.dashscope.api-key和spring.ai.dashscope.chat.options.model: qwen-max-latest;7.1 的 MCP Client 配置里有spring.ai.openai.api-key和spring.ai.openai.base-url: https://dashscope.aliyuncs.com/compatible-mode。如果要把模型调用切到 TaoToken,最容易犯的错是只改 Client 不改 Server,或者只改 Key 不改 Base URL。结果就是 Nacos 里服务能发现,Gateway 也能代理,但模型请求 401,或者路径里多出一段/v1。所以这篇不拆 Nacos 注册发现,只把模型通道改成 TaoToken,让 MCP 工具链继续按原文步骤跑通。
需要再次明确:TaoToken 在这里只提供 Key 和 Base URL。它不负责把webmvc-mcp-server注册到 Nacos,也不负责把TimeService变成 MCP 工具。Nacos 仍然是注册中心,Gateway 仍然按registry: nacos做代理,Client 仍然按service-name: webmvc-mcp-server去发现服务。模型通道和注册发现是两条线,换模型通道时不要把 Nacos 坐标一起改乱。
TaoToken 前置:Key、Base URL 与不改动的 Nacos 坐标
先到官网创建 Key:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。登录后进入控制台,在 API Keys 页面创建一个 Key,记作YOUR_API_KEY。如果只是接入和排障,可以直接看 API Keys 页面和接入文档,按文档确认 Base URL 的写法。
TaoToken 的 API 地址是:
https://taotoken.net/api注意这里不加 UTM,也不要写成https://taotoken.net/api/v1。有些 OpenAI 兼容客户端会自动拼接/v1/chat/completions,如果base-url已经带了/v1,最终路径就会变成/v1/v1/chat/completions,表现为 404 或路径异常。也不要把base-url填成官网首页地址,例如带?utm_source=...的页面地址,那不是 API 入口。
创建好 Key 后,本文只改模型通道,以下 Nacos 相关配置保持原文不动:
server-addr: 127.0.0.1:8848namespace使用原文中的命名空间值username: nacospassword: nacosservice-name: webmvc-mcp-server- Gateway 中的
registry: nacos mcp-nacos-register-example的注册开关和service-groupmcp-nacos-discovery-example的sse.connections与 1-N 连接结构
如果你把server-addr改成 TaoToken 地址,或者把registry: nacos改成别的值,那就不是换模型通道,而是把注册发现链路也改坏了。本文不这样做。
可复制配置:mcp-nacos-discovery-example 与 mcp-nacos-register-example
先改 MCP Client,也就是mcp-nacos-discovery-example里的 7.1 配置。核心是替换spring.ai.openai.api-key和spring.ai.openai.base-url。模型名可以保留原文的qwen-max,也可以换成 TaoToken 当前支持的模型 ID,但不要混用多个通道的 Key。
spring: application: name: mcp-client-webflux ai: openai: api-key: YOUR_API_KEY base-url: https://taotoken.net/api chat: options: model: qwen-max mcp: client: enabled: true name: mcp-client-webflux version: 0.0.1 initialized: true request-timeout: 600s type: sync toolcallback: enabled: true root-change-notification: true alibaba: mcp: nacos: namespace: 4ad3108b-4d44-43d0-9634-3c1ac4850c8c server-addr: 127.0.0.1:8848 username: nacos password: nacos client: enabled: true sse: connections: server1: service-name: webmvc-mcp-server version: 1.0.0这里改动的只有api-key和base-url。server-addr、namespace、service-name: webmvc-mcp-server都保持原文。Client 仍然通过 Nacos 发现 MCP Server,并通过自动注入的LoadbalancedMcpSyncClient或LoadbalancedMcpAsyncClient建立连接。ToolCallbackProvider仍然由自动配置注入,不需要你手写新的 MCP 直连库,也不需要绕过 Nacos 去连工具服务。
再处理 MCP Server,也就是mcp-nacos-register-example里的 5.3 配置。这里要分两种情况。如果TimeService只做时间计算,不调用大模型,那么 5.3 里的dashscope配置不会消耗 Token,可以保留原文,只确保 Nacos 注册配置不变。如果 5.3 的 Server 内部也会调用qwen-max-latest做模型推理,那就把模型通道也切到 TaoToken 的 OpenAI 兼容配置,Key 和 Base URL 与 Client 保持一致。
spring: ai: openai: api-key: YOUR_API_KEY base-url: https://taotoken.net/api chat: options: model: qwen-max-latest alibaba: mcp: nacos: namespace: 4ad3108b-4d44-43d0-9634-3c1ac4850c8c server-addr: 127.0.0.1:8848 username: nacos password: nacos registry: enabled: true service-group: mcp-server service-name: webmvc-mcp-server如果原项目依赖的是spring-ai-alibaba-starter-dashscope,而你只是把它用来暴露 MCP 工具,不一定要保留dashscope模型调用。关键是区分“MCP 工具注册”和“模型 Token 调用”:前者走 Nacos,后者走 Key 和 Base URL。mcp-nacos-gateway-example的 Gateway 配置不改模型通道,只保留动态代理和 Nacos 注册中心配置。尤其registry: nacos不要动,service-names里的webmvc-mcp-server也不要改。
验证请求:启动 Nacos 3.0.1 和三个子模块,看 webmvc-mcp-server 是否可调用
配置改完后,按原文顺序启动 Nacos 3.0.1 和三个子模块。先确认 Nacos 正常,再启动注册服务、网关服务、发现服务。
cd server/mcp-nacos-register-example mvn spring-boot:run cd server/mcp-nacos-gateway-example mvn spring-boot:run cd client/mcp-nacos-discovery-example mvn spring-boot:run启动后先看 Nacos 控制台。服务发现里应该能看到webmvc-mcp-server对应的 MCP 服务,配置中心里应该能看到该 MCP Server 的描述和工具信息。这里不要求你改服务名,也不要求你改命名空间。只要原文的server-addr、namespace、service-name: webmvc-mcp-server没变,注册和发现链路就应该继续工作。
然后看 Client 日志。如果 Client 能发现服务,通常会看到LoadbalancedMcpSyncClient或LoadbalancedMcpAsyncClient的注入信息,工具回调提供者也会被自动配置。接着调用getCityTimeMethod,传入类似Asia/Shanghai的时区 ID,预期返回该时区的当前时间字符串。这里成功的标志不是“模型说得多漂亮”,而是 MCP Client 能通过 Nacos 找到webmvc-mcp-server,Gateway 能代理工具,Client 能实际调用到TimeService暴露的方法。
模型通道是否生效,可以同时看请求日志。如果base-url正确指向https://taotoken.net/api,Key 也是从 TaoToken 控制台创建的,那么模型调用应该走 TaoToken。若日志里仍然出现原 DashScope 兼容地址,说明 7.1 或 5.3 还有一处base-url没替换。若出现 401,优先检查 Key;若出现路径/v1/v1,优先检查 Base URL 是否多写了/v1。
本篇常见错排查:401、/v1、service-name 与 registry
第一类错误是 401。常见原因有三个:spring.ai.openai.api-key没替换,仍然是${AI_DASHSCOPE_API_KEY};环境变量里旧 Key 覆盖了新 Key;Server 和 Client 用了两把不同的 Key,其中一把无效。处理方式是把 5.3 和 7.1 里所有会发起模型调用的api-key都显式写成YOUR_API_KEY,确认没有旧环境变量抢占。
第二类错误是路径多了/v1。TaoToken 的 API 地址应填https://taotoken.net/api,不要填https://taotoken.net/api/v1,也不要填官网首页。OpenAI 兼容客户端通常会自动追加/v1,所以你在配置里再加一次就会重复。排查时直接看请求日志中的完整 URL,如果出现/api/v1/v1/,基本就是这里写错。
第三类错误是 Nacos 配置被误改。表现是 Client 启动后找不到webmvc-mcp-server,或者 Gateway 没有代理出工具。重点核对server-addr是否为127.0.0.1:8848,namespace是否与注册时一致,service-name是否为webmvc-mcp-server,版本是否匹配,Gateway 的registry是否为nacos。TaoToken 不参与服务发现,所以这些值不要换成 TaoToken 相关地址。
第四类错误是模型名与通道不匹配。Client 用qwen-max,Server 用qwen-max-latest,本身可以,但要确认 TaoToken 当前支持的模型 ID 与你的配置一致。如果模型名不存在,通常不是 401,而是模型侧返回 404 或参数错误。排错时先把 Client 的模型请求单独验证,再回到 MCP 工具链验证。
第五类错误是超时。MCP 工具链里客户端有request-timeout: 600s,如果被改成很短,调用时间工具可能还没返回就断开。还有sse.enabled、streamable.enabled等开关,如果与原文不一致,也可能导致连接建立失败。建议先按原文保持这些开关,只改模型 Key 和 Base URL。
语义一致 CTA:把 Spring AI Alibaba MCP 的模型通道固定下来
回到标题里的问题:Spring AI Alibaba MCP 要耗 Token 的模型调用改到 TaoToken,还能不能走 Nacos?答案是可以,但边界要分清。Nacos 继续负责mcp-nacos-register-example的注册、mcp-nacos-gateway-example的动态代理、mcp-nacos-discovery-example的发现和 1-N 连接;TaoToken 只负责模型通道的 Key 和 Base URL。改的时候只动spring.ai.openai.api-key、spring.ai.openai.base-url,以及 Server 侧如果也调用模型时的对应配置。server-addr、namespace、service-name: webmvc-mcp-server、Gateway 的registry: nacos都不动。
如果你正在做接入或排障,建议先到 API Keys 页面创建和核对 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,再对照接入文档确认 Base URL 和模型 ID:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。想单独验证模型通道是否已经能通,可以到模型对话页面发一条最小请求:https://taotoken.net/console/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。如果你后续要把这套 MCP 工具链接到长期编码或 Agent 场景,可以再看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。