☰
使用fastapi-mcp改造fastapi服务为MCP服务供智能体使用案例:把Base URL改到TaoToken
2026/10/2 14:57:58 网站建设 项目流程

1. 从 FastAPI 到 MCP:为什么要把 Base URL 改到 TaoToken

如果你手里已经有一套跑得好好的 FastAPI 服务,接口文档齐全、参数校验清晰,现在想让智能体直接调用它,最省事的路径不是重写一套工具函数,而是用 fastapi-mcp 把现有端点自动暴露成 MCP 工具。fastapi-mcp 是一个基于 FastAPI 的开源库,它会扫描你应用里的路由,把每个端点转换成 MCP 协议里的 tool,保留 Swagger 的描述和参数结构,智能体侧不需要你手写 function schema。

但真正落地时,很多人卡在同一个地方:MCP 服务本身跑起来了,智能体也能连上,可一旦工具内部要调用大模型做推理、总结或改写,Base URL 就散落在各个文件里,Key 也各写各的。这时候把统一通道换成 TaoToken 就很自然——它提供 OpenAI 兼容的 Base URL 和统一 Key,你只要在环境变量里改一处,所有工具调用都走同一条通道。TaoToken 官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,不带多余参数。

这篇内容适合三类人:已经写过 FastAPI 接口、想快速接 MCP 的后端同学;在搭智能体、需要把内部服务变成可插拔工具的同学;以及被多家模型服务商 Base URL 不一致折腾过、想统一出口的同学。下面我会用一个「用户查询 + 模型润色」的最小案例,把 fastapi-mcp 挂载、工具声明、Base URL 指向 TaoToken、curl 验证 MCP 端点连通性这几步完整走一遍,配置片段可以直接复制。

核心检索词先明确:fastapi-mcp 改造 FastAPI 为 MCP 服务、MCP 服务 Base URL 配置、智能体工具调用。这三个词会贯穿全文,你在搜索时也能对应到具体步骤。

2. TaoToken 前置准备:Key、Base URL 与 fastapi-mcp 安装

在动代码之前,先把两件事做完:拿到 TaoToken 的 API Key,以及把 fastapi-mcp 装进项目环境。TaoToken 的 Key 在控制台的 API Keys 页面创建,地址是 https://taotoken.net/api-keys ,创建后复制保存,后面写进环境变量。Base URL 统一用 https://taotoken.net/api ,注意这个地址不带任何查询参数,OpenAI 兼容客户端直接填这个即可。

安装 fastapi-mcp 有两种方式,用 uv 的项目推荐:

uv add fastapi-mcp

传统 pip 环境用:

pip install fastapi-mcp

装完之后确认版本,fastapi-mcp 的 API 在不同小版本间有过调整,建议锁一个较新的版本:

pip show fastapi-mcp

接下来准备环境变量。我习惯用.env加 python-dotenv,你也可以直接 export。关键是三个值:TaoToken 的 Key、Base URL、以及你要用的 Model ID。Model ID 按你实际开通的模型填,比如常见的对话模型标识。写进.env:

TAOTOKEN_API_KEY=sk-你的Key TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_MODEL_ID=你的模型ID

这里要提醒一句:Base URL 末尾不要自己加/v1或斜杠,TaoToken 的兼容层会按标准路径处理,多写反而容易 404。Key 不要硬编码进代码提交到仓库,用环境变量或密钥管理服务。如果你后面要用 Claude Code 这类客户端,配置里同样填 Base URL + Key + Model ID 三件套,缺一不可。

装好之后可以先跑一个最小连通性测试,确认 Key 和 Base URL 没问题,再进入 fastapi-mcp 的改造。测试用 curl:

curl https://taotoken.net/api/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY"

返回模型列表就说明通道通了。这一步别跳过,后面 MCP 工具报错时你能快速判断是通道问题还是代码问题。

3. 可复制配置:fastapi-mcp 挂载与 Base URL 指向 TaoToken

现在进入核心改造。假设你有一个现成的 FastAPI 应用,里面已经有一个/query端点做数据查询。我们要做的是:挂载 fastapi-mcp,把端点暴露成 MCP 工具,并让工具内部调用模型时走 TaoToken。

先看主应用文件main.py:

import os from fastapi import FastAPI from fastapi_mcp import FastApiMCP from dotenv import load_dotenv load_dotenv() app = FastAPI(title="Demo API for MCP") @app.get("/query", operation_id="query_data", tags=["public"]) async def query_data(keyword: str): return {"keyword": keyword, "items": [f"result-{keyword}-1", f"result-{keyword}-2"]} mcp = FastApiMCP( app, name="Demo API MCP", include_tags=["public"], ) mcp.mount() if __name__ == "__main__": import uvicorn uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

这里用include_tags=["public"]只暴露打了 public 标签的端点,避免把管理类接口也暴露出去。operation_id会变成 MCP 工具名,智能体侧看到的就是query_data。挂载后 MCP 端点默认在/mcp,也就是http://127.0.0.1:8000/mcp。

接下来是工具内部调用模型的部分。新建llm_client.py,把 Base URL 指向 TaoToken:

import os from openai import OpenAI client = OpenAI( api_key=os.getenv("TAOTOKEN_API_KEY"), base_url=os.getenv("TAOTOKEN_BASE_URL", "https://taotoken.net/api"), ) def polish(text: str) -> str: resp = client.chat.completions.create( model=os.getenv("TAOTOKEN_MODEL_ID"), messages=[ {"role": "system", "content": "你是一个文本润色助手,只返回润色后的结果。"}, {"role": "user", "content": text}, ], temperature=0.3, ) return resp.choices[0].message.content

然后在 FastAPI 里加一个调用它的端点,同样打上 public 标签:

from llm_client import polish @app.post("/polish", operation_id="polish_text", tags=["public"]) async def polish_text(payload: dict): text = payload.get("text", "") return {"result": polish(text)}

这样智能体通过 MCP 调用polish_text时,模型请求就走 TaoToken 的 Base URL,Key 也统一从环境变量取。如果你用 Cline MCP 或 Claude Code 连接,配置里同样写 Base URL + Key + Model ID。Cline 的 MCP 配置片段:

{ "mcpServers": { "demo-api-mcp": { "command": "mcp-proxy", "args": ["http://127.0.0.1:8000/mcp"] } } }

Claude Code 的 settings 里如果要走 TaoToken,Base URL 填https://taotoken.net/api,Key 填你的 TaoToken Key,Model ID 填对应模型。Codex 的auth.json同理,三件套齐全才能正常鉴权。这里不展开每个客户端的完整文件,核心是记住:Base URL、Key、Model ID 一个都不能少,且 Base URL 统一指向 TaoToken。

4. 验证请求:curl 测 MCP 端点与智能体调用结果

配置写完,先别急着接智能体,用 curl 把 MCP 端点连通性测一遍。fastapi-mcp 挂载后,MCP 走的是 SSE 或 streamable HTTP,直接 GET 可能返回 405,正确做法是发一个初始化请求。先确认服务起来了:

curl -i http://127.0.0.1:8000/mcp

如果返回 405 或 400,说明端点存在但方法不对,这是正常的。接着用 mcp-proxy 或支持 MCP 的客户端连接。用 mcp-proxy 做本地转发测试:

mcp-proxy http://127.0.0.1:8000/mcp

它会列出可用的工具,你应该能看到query_data和polish_text。这一步能列出工具,说明 fastapi-mcp 扫描和暴露都成功了。

再验证工具内部调用 TaoToken 是否通。直接调/polish端点:

curl -X POST http://127.0.0.1:8000/polish \ -H "Content-Type: application/json" \ -d '{"text":"这个功能很好用"}'

返回类似{"result":"这个功能非常实用"}就说明 Base URL 和 Key 都生效了。如果返回 401,检查TAOTOKEN_API_KEY是否加载;如果返回 404,检查 Base URL 是否多写了路径;如果报reading choices,通常是模型返回结构异常或 Model ID 填错。

智能体侧调用示例,以支持 MCP 的客户端为例,连接后让它调用polish_text,传入一段文本,观察返回。成功时你会看到工具调用记录里出现polish_text,并且结果来自 TaoToken 通道。实测下来,最容易出问题的是环境变量没被 uvicorn 进程读到,尤其是用reload=True时,改完.env要重启进程。

验证模型本身是否可用,可以直接用模型对话页面测一下,地址是 https://taotoken.net/models ,确认 Model ID 和通道都正常,再回到 MCP 链路排查。

5. 本篇常见错排查:401、local proxy failed 与 reading choices

改造过程中有几类报错反复出现,我按真实遇到的顺序列一下,方便你对照。

第一类:401 Unauthorized。出现在工具调用模型时,说明 TaoToken Key 没传进去。检查.env是否被load_dotenv()加载,检查 uvicorn 启动目录是否和.env同级。用os.getenv("TAOTOKEN_API_KEY")打印一下,如果是 None,就是加载问题。另外 Key 前后有空格也会导致 401,复制时注意。

第二类:local proxy failed。这个多出现在 mcp-proxy 连接阶段,通常是 MCP 端点地址写错,或者服务没监听在 127.0.0.1。确认uvicorn的 host 是0.0.0.0或127.0.0.1,端口和配置一致。如果用了容器,注意端口映射。还有一种情况是 mcp-proxy 版本和 fastapi-mcp 的协议版本不匹配,升级 mcp-proxy 到较新版本。

第三类:reading choices 报错。这是 OpenAI 兼容客户端解析响应时找不到choices字段,常见原因是 Base URL 指向了非兼容端点,或者 Model ID 不存在导致返回了错误结构。确认 Base URL 是https://taotoken.net/api,Model ID 是你实际开通的。如果返回体里是error字段,先看错误信息再改代码。

第四类:OAuth 相关报错。如果你用的客户端要求 OAuth 流程,而 TaoToken 走的是 API Key 鉴权,配置里不要开 OAuth 模式,直接用 Key。Claude Code 或 Codex 的配置里如果混了 OAuth 字段,删掉,只保留 Base URL、Key、Model ID。

第五类:工具列表为空。mcp-proxy 连上了但看不到工具,检查include_tags或include_operations是否过滤太狠。fastapi-mcp 的过滤是贪婪匹配,include_operations和include_tags同时用时,匹配任一即包含。如果你只写了include_tags=["public"]但端点没打标签,就不会被暴露。

排障时建议按链路分段:先 curl 测 TaoToken 通道,再 curl 测 FastAPI 端点,再用 mcp-proxy 测 MCP 工具列表,最后接智能体。分段定位比一次性全链路调试快得多。接入文档在 https://taotoken.net/doc ,遇到鉴权和路径问题可以先翻一遍。

6. 语义一致 CTA:把统一通道用起来

走到这里,你的 FastAPI 服务已经能通过 fastapi-mcp 暴露成 MCP 工具,智能体侧可以按需调用,模型请求也统一走了 TaoToken 的 Base URL。后续如果你要长期跑编码类或 Agent 类任务,可以考虑 Coding Plan,地址是 https://taotoken.net/coding-plan ,适合需要稳定通道和统一计费的场景。如果只是验证模型或临时调试,用模型对话页面更快,https://taotoken.net/models 。Key 管理在控制台 https://taotoken.net/console ,API Keys 页面 https://taotoken.net/api-keys 。接入细节和参数说明看文档 https://taotoken.net/doc 。

实际用下来,fastapi-mcp 最大的价值是让你不用为每个端点手写 MCP 工具声明,改一处 Base URL 就能把整条模型调用链切到统一通道。你可以在llm_client.py里把 Base URL 抽成配置,未来换通道只改环境变量。智能体侧的工具增删也变成配置行为,不用动智能体核心代码。这套组合跑通之后,再扩展新工具就是加一个 FastAPI 端点、打个标签、重启服务的事。

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

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

立即咨询