MCP 天气 demo 的 qwen-max 调用,Base URL 改填 TaoToken

发布时间:2026/9/22 10:15:26

MCP 天气 demo 的 qwen-max 调用,Base URL 改填 TaoToken 1. 为什么 MCP 天气 demo 总是卡在模型通道这一行MCPModel Context Protocol这两年被聊得很多但真正动手跑通一个最小闭环的人往往不是卡在协议本身而是卡在「执行工具那一端的模型通道」上。我见过太多照着教程抄weather_server.py和client.py的朋友Server 端mcp.run(transportstdio)跑得好好的session.list_tools()也能列出query_weather结果一到client.chat.completions.create()就报 401、404 或者Connection error。问题几乎都出在同一个地方OpenAI(api_key..., base_url...)这两行。教程里写的是base_urlcompatible-mode/v1很多人直接复制结果 SDK 拼出来的请求地址缺了域名或者多带了一层/v1请求根本发不出去。更麻烦的是当你想换一个模型通道比如从默认的 qwen-max 换成别的又不知道该动哪一行——是改model字段还是改base_url还是两个都要改这篇就专门解决这个痛点。MCP 协议、stdio 管道、weather_server.py里的query_weather逻辑全部保持原样不动我只替换 client 里取 Key 和写base_url的两行。改完之后asyncio.run(main())能在「AI 最终回复」里打印出城市天气文本就说明 tool_call 链路和模型请求都通了。适合已经会写 FastMCP Server、但被 client 模型通道卡住的人。2. 先理清 MCP 的两条传输通道和天气 Server 的角色在动 client 之前得先明确一件事MCP 的连接和模型请求是两条完全独立的链路别把它们混在一起。2.1 Stdio 与 Streamable HTTP 的分工Stdio 是本地通信方式。客户端把 MCP Server 当成一个子进程启动两者通过操作系统的 stdin/stdout 管道「递纸条」完全绕开网络栈延迟低、数据不出本机。天气 demo 用的就是这条通道mcp.run(transportstdio)就是让 Server 挂在这条管道上等消息。Streamable HTTP 是远程通信方式客户端发 POST 请求服务端通过长连接推送流式响应适合云端服务、SaaS 集成、企业多租户。早期的 SSE 因为只支持单向推送正在被它取代。关键点在于这两条通道负责的是「客户端 ↔ MCP Server」之间的工具调用跟「客户端 ↔ 大模型」之间的请求没有任何关系。天气 Server 只干一件事——收到query_weather(city)就返回天气文本。至于这个工具调用请求是谁发起的、模型是哪家的Server 完全不关心。2.2 weather_server.py 里 query_weather 到底做了什么Server 端逻辑很简单fetch_weather用 httpx 异步请求天气接口format_weather把 JSON 拼成自然语言mcp.tool()装饰的query_weather把两者串起来。它对外暴露的接口就是「给我一个城市名我还你一段天气描述」。所以 client 里真正需要模型参与的部分只有两处第一次create()让模型决定要不要调query_weather第二次create()把工具结果回灌给模型生成最终回复。这两次请求走的是 OpenAI SDK跟 MCP 的 stdio 管道是并行的两条线。3. TaoToken 前置只提供 Key 和 Base URL 两样东西这里要特别说清楚 TaoToken 在这个 demo 里的定位避免误解。TaoToken 在这里只提供两样东西一把 API Key和一个 Base URL。它不参与 MCP 的连接不参与 stdio 管道的建立也不参与session.call_tool()的执行。工具调用那一端仍然是你的本地 Server 通过管道完成的TaoToken 完全不碰。换句话说你只是把 client 里「向大模型发请求」这一段的地址和凭证换掉其余逻辑一行不动。操作上分两步第一步打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册账号。注册流程很常规邮箱验证完就能进控制台。第二步在控制台里创建一把 API Key。创建入口在 https://taotoken.net/api-keys 点新建复制出来的那串就是你要填进 client 的api_key。拿到 Key 之后Base URL 固定填https://taotoken.net/api。注意这里有两个坑不要带/v1也不要带任何 utm 参数。SDK 会自己在后面拼/chat/completions你多写一层/v1就会变成/api/v1/chat/completions直接 404。4. 可复制配置只改 client 里的两行现在进入正题。假设你的weather_server.py已经按教程写好uv venv、uv add mcp、uv add openai httpx python-dotenv都装完了我们只动 client。4.1 改 api_key 和 base_url原来的写法是从环境变量取DASHSCOPE_API_KEYbase_url写compatible-mode/v1。现在替换成 TaoToken 的 Key 和地址import asyncio import os import json from contextlib import AsyncExitStack from openai import OpenAI from dotenv import load_dotenv from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client load_dotenv() async def main(): # 只改这两行Key 换成 TaoToken 创建的 Keybase_url 换成 TaoToken 地址 client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlhttps://taotoken.net/api ) server_params StdioServerParameters( commandD:\\python.exe, args[e:\\mcp-servers-weather.py] ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools_response await session.list_tools() openai_tools [ { type: function, function: { name: tool.name, description: tool.description, parameters: tool.inputSchema } } for tool in tools_response.tools ] messages [{role: user, content: Shanghai weather today}] response client.chat.completions.create( modelqwen-max, messagesmessages, toolsopenai_tools, tool_choiceauto ) message response.choices[0].message if message.tool_calls: for tool_call in message.tool_calls: if tool_call.function.name query_weather: args json.loads(tool_call.function.arguments) result await session.call_tool(query_weather, argumentsargs) messages.append(message) messages.append({ role: tool, tool_call_id: tool_call.id, content: result.content[0].text }) final_response client.chat.completions.create( modelqwen-max, messagesmessages ) print(AI 最终回复:, final_response.choices[0].message.content) else: print(AI 回复:, message.content) if __name__ __main__: asyncio.run(main())4.2 把 Key 放进 .env别把 Key 硬编码在代码里。在项目根目录建一个.envTAOTOKEN_API_KEY你从控制台复制的那串Keyload_dotenv()会自动把它读进环境变量os.getenv(TAOTOKEN_API_KEY)就能取到。如果你之前用的是DASHSCOPE_API_KEY把变量名换掉即可代码里对应的os.getenv也要跟着改。4.3 想换模型时改哪一行这是很多人问的问题。答案很明确只改model字段。base_url指向的是 TaoToken 的入口它背后能路由到哪些模型是服务端的事你不需要为每个模型换一个地址。所以从qwen-max换成别的只动model...这一处两处create()都要改第一次决定调工具、第二次生成最终回复。改动项改哪里说明换 Key.env里的TAOTOKEN_API_KEY控制台重新创建即可换模型两处create()的model字段base_url 不动换 Base URLOpenAI(base_url...)固定https://taotoken.net/api不带 /v15. 验证请求看到天气文本就算通了配置改完直接跑python client.py如果一切正常终端会打印类似这样的内容AI 最终回复: 上海当前天气多云气温 22°C湿度 68%看到「AI 最终回复」后面跟着城市天气文本就说明整条链路通了。这里其实验证了两件事一是session.call_tool(query_weather, ...)通过 stdio 管道成功拿到了工具结果二是两次client.chat.completions.create()都成功打到了 TaoToken 的地址并返回了内容。如果第一次create()返回的message.tool_calls是空的说明模型没决定调工具可以检查tools参数有没有正确传入、tool_choice是不是auto。如果tool_calls有值但最终回复为空多半是第二次create()的messages里 tool 结果没拼对。想单独验证模型通道是否通可以先用模型对话页面发一条普通消息确认 Key 和地址没问题再回来跑完整 demo。6. 本篇常见错排查6.1 base_url 少写域名或多带 /v1这是最高频的错。base_urlcompatible-mode/v1这种写法是相对路径SDK 拼出来会缺域名直接报连接错误。正确写法是完整的https://taotoken.net/api。反过来写成https://taotoken.net/api/v1也不行SDK 会再拼一层变成/api/v1/chat/completions返回 404。记住一个判断方法base_url 填到/api为止后面什么都不要加。6.2 401 报错Key 没读到或填错openai.AuthenticationError一般是 Key 的问题。先确认.env文件在项目根目录、变量名和os.getenv里写的一致。如果.env里有多余空格或引号也会导致读取失败。最稳妥的办法是临时print(os.getenv(TAOTOKEN_API_KEY))看一眼确认取到的是完整字符串。6.3 stdio 管道报错路径写错StdioServerParameters里的command和args必须是绝对路径。Windows 下反斜杠要转义写成D:\\python.exe。如果command指向的 python 不是你装 mcp 依赖的那个虚拟环境会报ModuleNotFoundError: No module named mcp。建议直接用虚拟环境里的 python 解释器路径。6.4 工具调用成功但最终回复为空检查messages.append(message)有没有执行。第一次create()返回的message对象必须原样 append 进messages否则第二次请求时模型看不到自己发起的 tool_call会不知道该怎么接。同时tool_call_id要和message.tool_calls里的 id 对应上。6.5 换模型后报模型不存在如果model字段填了一个 TaoToken 不支持的名称会返回模型不存在的错误。换模型前先在模型对话页面确认目标模型可用再填进代码。base_url 不用动只改model。7. 后续怎么接跑通这个 demo 之后你手里其实有了一套可复用的模板MCP Server 负责工具client 负责把工具结果回灌给模型两者通过 stdio 管道解耦。要加新工具就在 Server 里再写一个mcp.tool()要换模型通道就改 client 里的model字段。如果你打算把这个模式用到长期编码或 Agent 场景比如让模型反复调用多个工具、维护多轮上下文可以了解一下 Coding Plan它更适合这种持续性的调用需求。接入文档在 https://taotoken.net/doc 里面有完整的参数说明和示例。API Key 管理还是回到 https://taotoken.net/api-keys 随时可以新建或吊销。最后提醒一句TaoToken 在这个链路里只负责模型请求的 Key 和 Base URLMCP 的连接、工具的注册与执行全部在你本地完成。把这两条链路分清楚后面再遇到报错你就能一眼判断是模型通道的问题还是 MCP 管道的问题。
延伸阅读

更多相关文章

2026/9/22 10:15:26

Blender .mesh 批转卡在 -b -P?让 Codex 走 TaoToken 排查行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 10:15:26

3个坑搞定性感表姐项目搭建完整示例

3个坑搞定性感表姐项目搭建完整示例 很多刚学完Python或JavaScript语法的同学,手里攥着几十页笔记,脑子却一片空白。你知道if怎么判,知道for怎么转,但真让你从零搭个能跑的项目,鼠标就在屏幕上戳不动。这不是你笨,是缺了把知识点…

2026/9/22 11:15:32

产品网络推广方案保姆级教程:3步搞定部署

产品网络推广方案保姆级教程:3步搞定部署 看着满屏红色的 StackTrace 报错,是不是脑子直接炸了?别慌,很多刚接触这块的兄弟都卡在第一步。今天这篇 保姆级教程 ,我不讲虚的,直接带你把【产品网络推广方案】这套东西跑通。…

2026/9/22 11:15:32

5个致命坑:东城会技术认证避坑指南与最佳实践

5个致命坑:东城会技术认证避坑指南与最佳实践 刚拿到“东城会”技术认证的报名通知,是不是兴奋之余又有点慌?别急,我见过太多新人栽在第一步。很多人以为只要把官方文档里的代码复制粘贴进去就能过,结果一运行全是红字报错,或者跑通了但性能慢得让人想…

2026/9/22 11:10:32

akshare 列名报错?TaoToken 这样改 Codex 的 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 10:02:42

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/22 0:04:49

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点 官方文档几百页翻到头还是懵?面试问到 输电线路在线监测 的数据链路时,脑子一片空白?别慌,这种 高频面试题 我整理了10年,专门治各种“文档太长抓不住重点”的毛病。…

2026/9/22 0:04:49

中介房源管理系统重构避坑:3个关键步骤搞定API变更

中介房源管理系统重构避坑:3个关键步骤搞定API变更 版本升级后 API 全变了,这种痛只有真做过的人懂。 很多团队在接手老旧房产项目时,最崩溃的不是代码烂,而是底层框架升级后,原本熟悉的接口调用方式彻底失效。 这份 保姆级教程…

2026/9/22 0:04:49

3个坑点带你一文搞懂55gg小游戏源码

3个坑点带你一文搞懂55gg小游戏源码 盯着控制台满屏的红色报错,看着那一长串 StackTrace ,是不是脑子瞬间宕机?别急,这种时候最忌讳的就是盲目改代码。很多刚入行的前端同学,面对 55gg 小游戏这类轻量级 H5…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码