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

发布时间:2026/11/14 12:43:04

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/11/14 16:45:53

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/11/14 18:47:40

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

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

2026/11/14 21:55:33

架子工算特种作业人员怎么报名?学历不高也能考!

架子工算特种作业人员怎么报名?学历不高也能考! 你是不是也担心自己学历不高,怕报不上名?别慌,架子工 算特种作业人员 ,而且报名流程其实不难,关键是要选对地方、走对流程。别被“特种作业”四个字吓住,今天就带你一步步了解怎么报名、怎么准备,帮…

2026/11/14 21:55:33

天津低压电工证在哪考通过率揭秘 低学历也能拿证

天津低压电工证在哪考通过率揭秘 低学历也能拿证 你是不是也担心自己学历不高,报不了低压电工证?其实不然,很多和你一样的人,都是从零基础开始,一步步拿到证书的。今天我就以 天津低压电工证在哪考 为核心,告诉你 通过率揭秘…

2026/11/14 21:55:33

石碣有考电工证学校培训机构怎么选良心建议

石碣有考电工证学校培训机构怎么选良心建议 工地太忙根本没时间复习考试,这几乎是每个在工地干活的电工、焊工、高处作业人员的共同痛点。特别是在像石碣这样的工业集中区域,很多人因为工作强度大,根本腾不出时间去系统地准备考试。所以,选一个靠谱的…

2026/11/14 21:55:33

兴宁市电工证哪里考 上岗必备全攻略

兴宁市电工证哪里考 上岗必备全攻略 你是不是也担心自己学历不高,怕报不上电工证?其实,很多从事电工岗位的小伙伴都是通过实践积累经验,再一步步拿到证书的。 电工证是上岗必备…

2026/11/14 21:39:44

电力电缆考试多久下证 全国通用证书怎么复审不掉队

电力电缆考试多久下证 全国通用证书怎么复审不掉队 证书过期了不知道怎么复审延期,你是不是也遇到过这种情况?别急,咱们来聊聊 电力电缆考试多久下证 的问题,以及这个 全国通用 的证书怎么管理、怎么复审,避免因为证书过期影响你的工作和收入。…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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