资讯动态

Agno 中使用 MCP:把工具调用配置改到 TaoToken 的完整实践

发布时间:2026/10/18 10:42:58 来源:尧图企业网站定制
1. Agno 接 MCP 时模型通道乱成一团怎么统一到 TaoToken如果你正在本地跑 Agno Agent同时又要接 MCP 工具链大概率会遇到一个很现实的问题工具调用本身跑通了但模型请求的出口五花八门。有人用本地 vLLM 的http://192.168.0.106:8000/v1有人临时填个api_keyEMPTY还有人把 OpenAI 官方地址、自建网关、各种兼容端点混着用。结果是Agent 能跑但一旦换模型、换机器、换同事接手配置就得重来一遍。这篇要解决的就是这件事——把 Agno 里 MCP 工具编排的模型调用通道统一收敛到 TaoToken 的 Key/API 通道上。Agno 是一个轻量的 Agent 框架agno.models.openai.OpenAILike这个类天生就是为「兼容 OpenAI 协议的自定义端点」准备的所以只要你的通道兼容 OpenAI 的/v1/chat/completions就能直接接进来。TaoToken 提供的正是这样一个统一入口你不需要为每个模型单独改代码只改base_url、api_key、id三个字段即可。适合谁看本地已经能跑通 MCP Server、正在用 Agno 写 Agent、需要多模型切换比如今天用 Claude 系、明天换 GPT 系的开发者。读完你能拿到一份可复制的mcp_client.py配置、一份环境变量写法以及一次完整的工具调用链路验证步骤确认请求确实经由 TaoToken 发出而不是悄悄走了别的出口。我试过把模型出口和工具出口分开管理结果排障时根本分不清是 MCP 工具没连上还是模型端点返回了错误。统一通道之后日志里一眼就能看出请求打到了哪里。下面按「先跑通 MCP Server → 再改 Agno 客户端 → 再验证 → 再排错」的顺序来。2. TaoToken 前置准备Key、Base URL 与模型 ID 三件套在动 Agno 代码之前先把 TaoToken 这边的三件套准备好。这三件套是后面所有配置的基础缺一个都会在运行时报错。第一件是 API Key。到 TaoToken 控制台的 API Keys 页面创建一个复制出来形如sk-xxxx的字符串。这个 Key 就是你在 Agno 里填到api_key字段的值。注意不要把它硬编码进 Git 仓库后面我会给环境变量的写法。第二件是 Base URL。TaoToken 的 API 入口是https://taotoken.net/api注意这里不带任何查询参数。在 Agno 的OpenAILike里base_url需要指向兼容 OpenAI 的路径通常写成https://taotoken.net/api/v1。这一点很关键很多兼容端点的base_url要带/v1而 Agno 底层用的是 OpenAI SDKSDK 会自己在后面拼/chat/completions所以你要保证拼出来的完整路径是https://taotoken.net/api/v1/chat/completions。第三件是 Model ID。这个不是随便填的要填 TaoToken 平台上实际可用的模型标识。你可以在模型对话页面或者文档里查到当前支持的模型列表选一个你打算用的比如某个 Claude 系或 GPT 系的标识。填错 Model ID 的典型报错是model not found或者 404后面排错章节会细讲。把这三件套整理成一张对照表方便你填配置时核对配置项取值来源在 Agno 中的字段常见错误API KeyTaoToken 控制台 API Keysapi_key填了EMPTY或空串导致 401Base URL固定为https://taotoken.net/api/v1base_url漏了/v1导致 404Model IDTaoToken 模型列表id填了本地模型名导致 model not found注意base_url和api_key建议全部走环境变量不要写死在代码里。Agno 的OpenAILike支持从环境变量读取但为了显式可控我下面会在代码里用os.environ读取这样本地和 CI 都能复用同一份代码。准备好这三件套后先别急着改 Agno我们先把 MCP Server 跑起来确认工具侧是通的再动模型侧。这样排障时能二分定位工具不通和模型不通是两回事。3. 可复制配置MCP Server 与 Agno 客户端完整片段这一节给你两份可直接复制的文件mcp_server.py和mcp_client.py。前者是 MCP 工具服务后者是 Agno 客户端模型出口已经改成 TaoToken。先看 MCP Server。它用FastMCP定义了两个工具加法和减法以及一个资源和一个 prompt跑在 streamable-http 传输上监听本地 8000 端口# mcp_server.py from mcp.server.fastmcp import FastMCP mcp FastMCP(Demo) mcp.tool( nameadd, title加法, description加法, structured_outputNone, ) def add(a: int, b: int) - int: Add two numbers print(加法) return a b mcp.tool() def subtraction(a: int, b: int) - int: Subtract two numbers print(减法) return a - b mcp.resource(greeting://{name}) def get_greeting(name: str) - str: Get a personalized greeting return fHello, {name}! mcp.prompt() def greet_user(name: str, style: str friendly) - str: Generate a greeting prompt styles { friendly: Please write a warm, friendly greeting, formal: Please write a formal, professional greeting, casual: Please write a casual, relaxed greeting, } return f{styles.get(style, styles[friendly])} for someone named {name}. if __name__ __main__: mcp.run(transportstreamable-http)启动它pip install mcp[cli] agno python mcp_server.py看到服务监听在http://127.0.0.1:8000/mcp就说明工具侧 OK 了。接下来是重点——Agno 客户端。这里把模型出口从原来的本地端点改成 TaoToken三件套全部从环境变量读取# mcp_client.py import asyncio import os from textwrap import dedent from agno.agent import Agent from agno.models.openai import OpenAILike from agno.tools.mcp import MCPTools async def run_agent(message: str) - None: mcp_tools MCPTools( transportstreamable-http, urlhttp://127.0.0.1:8000/mcp, ) await mcp_tools.connect() print(mcp_tools) model OpenAILike( idos.environ[TAOTOKEN_MODEL_ID], api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ.get(TAOTOKEN_BASE_URL, https://taotoken.net/api/v1), ) try: agent Agent( modelmodel, tools[mcp_tools], instructionsdedent(你是一个会调用工具的助手遇到算术问题请调用对应工具。), markdownTrue, ) await agent.aprint_response(message, streamTrue) finally: await mcp_tools.close() if __name__ __main__: asyncio.run(run_agent(1加1等多少))环境变量这样写Linux/macOSexport TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_MODEL_ID你的模型标识 export TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1 python mcp_client.pyWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的Key $env:TAOTOKEN_MODEL_ID你的模型标识 $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1 python mcp_client.py如果你更习惯用.env文件装个python-dotenv在文件顶部加from dotenv import load_dotenv; load_dotenv()然后建一个.envTAOTOKEN_API_KEYsk-你的Key TAOTOKEN_MODEL_ID你的模型标识 TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1这里有个容易踩的坑OpenAILike的id字段是模型标识不是显示名。你从 TaoToken 模型列表里复制哪个就用哪个别自己改大小写或加前缀。base_url一定要带/v1因为 OpenAI SDK 会在后面拼/chat/completions少了/v1就会打到https://taotoken.net/api/chat/completions直接 404。提示如果你同时用 Cline、CC Switch 或 Codex 的auth.json记得三件套Base URL Key Model ID保持一致。不同工具之间模型标识写法可能不同但 Base URL 和 Key 是同一套别一个工具填一个 Key排障时会很痛苦。4. 验证请求确认工具调用链路真的走了 TaoToken配置写完不算完得验证请求确实经由 TaoToken 发出而不是悄悄走了别的端点。这一步很多人跳过结果线上出问题时才发现模型出口根本没换。最直接的验证方式是看 Agno 的流式输出。运行python mcp_client.py如果一切正常你会看到 Agent 先输出一段思考然后调用add工具工具返回结果最后模型基于工具结果生成回答。整个过程类似Tool Calls: - add (call_xxx) Args: {a: 1, b: 1} Result: 2 1 加 1 等于 2。看到Tool Calls和Result这两段说明 MCP 工具链路是通的。但工具通不代表模型走了 TaoToken还得进一步确认。第二个验证手段是抓请求日志。TaoToken 控制台一般会有请求记录或用量统计你跑一次 Agent 后去控制台看如果能看到刚才那次对话的请求记录就说明请求确实打到了 TaoToken。这是最硬的证据。第三个手段是在代码里临时打开 OpenAI SDK 的调试日志。在mcp_client.py顶部加import logging logging.basicConfig(levellogging.DEBUG)再跑一次你会在日志里看到类似POST https://taotoken.net/api/v1/chat/completions的请求行。如果看到的是别的地址说明base_url没生效检查环境变量是否被覆盖。第四个手段是故意填错 Key看报错。把TAOTOKEN_API_KEY改成一个明显错误的字符串再跑一次。如果报 401 且错误信息里提到 TaoToken 的域名说明请求确实打到了 TaoToken如果报的是连接本地端口失败说明你还在走本地端点配置没生效。验证通过后你可以把run_agent的调用换成减法1减1等多少确认第二个工具也能被正确调用。两个工具都通说明 MCP 工具编排和 TaoToken 模型通道都正常。注意验证阶段建议把streamTrue保持打开这样能实时看到工具调用过程。如果你关掉流式输出会一次性返回排障时不容易看出工具是否被调用。到这里一次完整的「Agno → MCP 工具 → TaoToken 模型」链路就验证完了。接下来把常见的报错整理一下方便你对照排查。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来对照每个都给出原因和修法。401 Unauthorized。最常见的原因是api_key没填对。检查三处环境变量TAOTOKEN_API_KEY是否真的导出到了当前 shellecho $TAOTOKEN_API_KEY看一下代码里是否用了os.environ[TAOTOKEN_API_KEY]而不是写死的EMPTYKey 是否被复制时带了空格或换行。如果 Key 本身没问题检查base_url是否指向了 TaoToken有些兼容端点会校验 Key 和域名的对应关系。local proxy failed / connection refused。这个报错通常和 MCP 工具侧有关不是模型侧。检查mcp_server.py是否真的在跑端口 8000 是否被占用。用curl http://127.0.0.1:8000/mcp试一下如果连不上说明 MCP Server 没起来。另外注意MCPTools的url要和 Server 的传输方式匹配streamable-http 对应/mcpsse 对应/sse填错会连不上。Error reading choices / choices 字段为空。这个报错说明请求打到了端点但返回体里没有choices字段。常见原因是 Model ID 填错了端点返回了一个错误结构而 Agno 按正常结构解析就报 reading choices 失败。去 TaoToken 模型列表核对TAOTOKEN_MODEL_ID确保拼写完全一致。另一个可能是base_url少了/v1请求打到了非 API 路径返回了 HTML 而不是 JSON。OAuth / authentication 相关报错。如果你在 MCP Server 侧加了鉴权或者用了需要 OAuth 的远程 MCP 服务Agno 客户端这边要带上对应的 token。本地 Demo 一般不需要但如果你把 MCP Server 部署到了远程记得在MCPTools里配置 headers。模型侧的 OAuth 和工具侧的 OAuth 是两回事别混在一起排。model not found / 404。两个原因Model ID 不在 TaoToken 支持列表里或者base_url路径拼错。先确认 Model ID再确认完整请求路径是https://taotoken.net/api/v1/chat/completions。可以在代码里打印model.base_url看一下实际值。工具被调用但结果没回传给模型。这种表现为 Agent 输出了工具调用但没有最终回答。检查MCPTools是否在finally里被close()了如果提前关闭工具结果可能来不及回传。另外确认instructions里明确告诉模型「遇到算术问题请调用工具」否则模型可能自己心算而不调工具。把这几类报错对照一遍基本能覆盖 90% 的接入问题。剩下的就是模型输出质量层面的调优那属于 prompt 和模型选择的事不在通道配置范围内。6. 统一通道之后多模型切换与长期编码的落地建议通道统一到 TaoToken 之后多模型切换就变成改一个环境变量的事。你可以在.env里准备几组配置用的时候切换# 方案 A TAOTOKEN_MODEL_ID模型A # 方案 B # TAOTOKEN_MODEL_ID模型B代码完全不用动重启进程即可。这对本地跑 Agno Agent 的开发者来说省掉了每次换模型都要改base_url和api_key的麻烦。如果你打算长期跑编码类 Agent或者把 Agno 接到更复杂的工具编排里建议关注 Coding Plan 这类长期方案它更适合高频、持续的模型调用场景。而如果你只是想先验证某个模型在 Agno 里的工具调用表现可以直接在模型对话页面里试确认模型对工具调用的支持程度再决定要不要写进 Agent。接入文档里有更完整的参数说明和示例遇到本文没覆盖的字段可以去那里查。API Keys 页面则是你管理 Key 的地方建议给不同项目建不同的 Key方便按项目看用量和排障。最后给一个实用技巧把mcp_client.py里的base_url默认值写成 TaoToken 的地址环境变量只覆盖 Key 和 Model ID。这样即使忘了导出TAOTOKEN_BASE_URL请求也不会跑到别的地方去减少一类低级错误。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑