1. 为什么要在 OpenWebUI 里折腾 MCPO 和 TaoToken
如果你已经在本地跑 OpenWebUI,大概率遇到过这种尴尬:模型对话没问题,但一让它“查一下最新资料”“读一下这个网页”“帮我记一条笔记”,它就开始一本正经地胡说。原因很简单,OpenWebUI 本身只是聊天前端,真正让它能调用外部工具的是 MCP(Model Context Protocol)那一层,而 OpenWebUI 对 MCP 工具服务器的支持需要一个兼容 OpenAPI 的代理做前端,MCPO 就是干这个的。
MCPO 的工作方式其实很好理解:它通过标准输入输出(stdio)跟一个个 MCP 服务器进程对话,然后把这些 MCP 通信统一翻译成 RESTful API 暴露出来。OpenWebUI 只认 OpenAPI 风格的端点,MCPO 正好补上这块拼图。你装一个 MCPO,就能把 time、memory、fetch 这些 MCP 服务器一次性挂上去,OpenWebUI 里点几下就能用。
那 TaoToken 在这里扮演什么角色?它是统一 Key 和 API 通道的那一层。本地 LLM 工具链最烦的就是每个工具、每个模型都要单独配一套 Key 和地址,散落在各种 config 里。TaoToken 提供统一的 API 入口,模型对话、编码计划、控制台、API Keys 都在一个地方管理。把 OpenWebUI 的模型请求和 MCPO 的工具调用都指向 TaoToken 的统一通道,配置能收敛很多,换模型、加工具都不用到处改。
这篇面向的是本地 LLM 工具链场景,交付三样东西:可复制的 config.toml 和 settings.json 骨架、MCP 工具注册步骤、用 OpenAPI 端点做连通性验证的具体动作。跟着走完,你能拿到一个从配置到验证的完整闭环。适合已经在用 OpenWebUI、想接 MCP 工具、又不想被多套 Key 搞晕的人。
2. TaoToken 前置准备:Key、通道与文档入口
在动 MCPO 之前,先把 TaoToken 这边的底座搭好。这一步不做,后面 OpenWebUI 和 MCPO 都会卡在鉴权上。
先去官网注册并进控制台,地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。控制台里能拿到 API Key,也能看到当前可用的模型列表和通道状态。建议单独建一个给本地工具链用的 Key,别跟生产环境混用,方便后面排查问题时快速定位。
拿到 Key 之后,去 API Keys 页面确认一下:https://taotoken.net/console/api-keys 。这里能看到 Key 的创建时间、最近使用情况。如果 Key 一直没被调用过,说明你的 OpenWebUI 或 MCPO 根本没连上,这是后面排障的第一个检查点。
API 的基础地址是 https://taotoken.net/api ,注意这个地址不带任何查询参数,直接作为 base_url 用。模型对话的入口在 https://taotoken.net/models ,接入文档在 https://taotoken.net/doc 。文档里会写清楚 OpenAI 兼容格式的请求长什么样,MCPO 和 OpenWebUI 都吃这套格式,所以对接起来不别扭。
注意:TaoToken 是统一的 API 通道,不是让你绕过什么限制。所有请求都走正常鉴权,Key 泄露了要立刻在控制台吊销重建。
如果你后面要跑长期编码或者 Agent 类任务,可以看下 Coding Plan:https://taotoken.net/coding-plan 。它跟按量调用是两条线,适合高频、长时间的编码场景。这篇主要走 API 通道,Coding Plan 先了解即可。
前置准备清单:一个可用的 TaoToken API Key、确认 base_url 是 https://taotoken.net/api 、本地装好 Python 3.11 和 NodeJS、OpenWebUI 已经能正常跑起来。这四样齐了,再往下走。
3. 可复制配置:config.toml 与 settings.json 骨架
这一节是核心,直接给可复制的骨架。MCPO 用 config.json 描述要挂哪些 MCP 服务器,OpenWebUI 那边用 settings.json 或界面配置描述工具端点。我把它拆成两块讲,你照着填就行。
先看 MCPO 的 config.json。它的结构是 mcpServers 下面挂一个个服务器,每个服务器有 command 和 args。下面这份骨架挂了 time、memory、fetch 三个常用服务器,你可以按需增删:
{ "mcpServers": { "time": { "command": "uvx", "args": ["mcp-server-time", "--local-timezone=Asia/Shanghai"] }, "memory": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-memory"] }, "fetch": { "command": "uvx", "args": ["mcp-server-fetch"] } } }time 用 uvx 拉起,时区改成 Asia/Shanghai,这样模型回答时间相关问题时不会给你纽约时间。memory 用 npx 拉起,负责给模型一个可读写的记忆存储。fetch 用 uvx 拉起,让模型能抓网页内容。三个都是官方 servers 仓库里的,装起来不折腾。
再看 OpenWebUI 侧的 settings.json 骨架。OpenWebUI 的工具配置在界面里点也行,但用文件管理更清晰。下面这份是工具端点的骨架,重点是 url 指向 MCPO 暴露出来的 OpenAPI 地址:
{ "tools": { "enabled": true, "endpoints": [ { "name": "mcpo-time", "url": "http://127.0.0.1:8001/time", "openapi": "http://127.0.0.1:8001/time/openapi.json" }, { "name": "mcpo-fetch", "url": "http://127.0.0.1:8001/fetch", "openapi": "http://127.0.0.1:8001/fetch/openapi.json" } ] } }这里有个关键点:MCPO 启动后,每个 MCP 服务器会在 /<服务器名> 路径下暴露自己的 OpenAPI 文档,比如 /time/openapi.json。OpenWebUI 靠这个文档自动发现工具有哪些、参数怎么传。所以 url 和 openapi 两个字段都要填对,少一个工具就注册不上。
如果你想把模型请求也统一走 TaoToken,OpenWebUI 的模型配置里 base_url 填 https://taotoken.net/api ,api_key 填你在控制台拿到的 Key。这样模型对话和工具调用都收敛到同一条通道,管理起来清爽。
提示:config.json 和 settings.json 建议都放进版本管理,但 Key 不要硬编码进文件,用环境变量注入。MCPO 和 OpenWebUI 都支持从环境变量读 Key。
4. 启动 MCPO 并注册 MCP 工具
配置写好了,接下来把 MCPO 跑起来,再把工具注册进 OpenWebUI。
先建虚拟环境并装 MCPO。用 uv 会快很多:
python -m venv .venv source .venv/bin/activate pip install mcpo装完 MCPO,再装三个 MCP 服务器本体。time 和 fetch 是 Python 包,memory 是 npm 包:
pip install mcp-server-time pip install mcp-server-fetch npm install @modelcontextprotocol/server-memory然后启动 MCPO,指定 config.json 和端口:
uvx mcpo --config ./config.json --port 8001启动成功的日志大概长这样:
Starting MCP OpenAPI Proxy with config file: config.json INFO: Started server process [1190222] INFO: Waiting for application startup. Knowledge Graph MCP Server running on stdio看到 Started server process 和各个 MCP 服务器 running on stdio,说明 MCPO 已经把 stdio 那层翻译成 HTTP 了。这时候打开浏览器访问 http://127.0.0.1:8001/docs ,能看到 MCPO 自动生成的 OpenAPI 文档页,里面列出了 time、memory、fetch 各自的端点。这一步能打开,说明 MCPO 本身没问题。
接着注册到 OpenWebUI。进 OpenWebUI 的“设置”->“工具”->“+”,把 MCPO 的端点 URL 填进去,比如 http://127.0.0.1:8001/time ,保存。OpenWebUI 会去拉 /time/openapi.json 自动解析工具定义。保存成功后,在聊天窗口输入框旁边能看到一个工具图标,点开确认 time、fetch 这些工具是启用状态。
如果你用 settings.json 管理,就把上一节那份骨架放到 OpenWebUI 的配置目录,重启服务让它生效。两种方式效果一样,界面点更直观,文件管理更适合批量。
注册完做一次快速自检:在 OpenWebUI 里问“现在几点了”,如果模型调用了 time 工具并返回当前时间,说明整条链路通了。没通的话看下一节排障。
5. 用 OpenAPI 端点做连通性验证
工具注册完不能只看界面显示“已启用”,得用 OpenAPI 端点实际打一次请求,确认 MCPO 到 MCP 服务器这一段是活的。这一步很多人跳过,结果聊天时工具调用失败,回头查半天。
先验证 MCPO 的 OpenAPI 文档能访问:
curl -s http://127.0.0.1:8001/time/openapi.json | head -c 500返回的应该是一段 JSON,里面有 paths、components 这些 OpenAPI 标准字段。如果返回 404 或空,说明 MCPO 没把这个服务器挂上,回去检查 config.json 里 time 的 command 和 args 对不对。
再直接调一次工具端点。以 fetch 为例,它的作用是抓网页内容,请求体按 OpenAPI 文档里的 schema 传:
curl -s -X POST http://127.0.0.1:8001/fetch/fetch \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com"}'如果返回里包含网页正文的文本内容,说明 MCPO 到 fetch MCP 服务器这一段完全通了。这一步成功,OpenWebUI 里调用 fetch 工具基本不会出问题。
再验证一下 TaoToken 通道。用 OpenAI 兼容格式打一次模型对话请求:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}] }'返回里有 choices 和 message 字段,说明 TaoToken 通道正常。模型名按你控制台里实际可用的填,别照抄。这一步通了,OpenWebUI 的模型对话就能走 TaoToken。
最后做一次端到端验证:在 OpenWebUI 里问“帮我抓取 https://example.com 的内容并总结”,观察 MCPO 的日志。正常会看到类似这样的记录:
INFO: 127.0.0.1:33694 - "POST /fetch/fetch HTTP/1.1" 200 OK Calling fetch with arguments: {'url': 'https://example.com'}日志里出现 POST 请求和 200 OK,加上模型返回了总结内容,整条链路就算闭环了。如果日志里只有模型请求没有工具调用,说明 OpenWebUI 没把工具挂上,回去看第 4 节的注册步骤。
6. 本篇常见错排查
配置过程中最容易踩的坑集中在几个地方,我按出现频率排一下。
第一个是 MCPO 启动报 command not found。这通常是 uvx 或 npx 不在 PATH 里。uvx 来自 uv,装完 uv 要确认uvx --version能跑;npx 来自 NodeJS,确认npx --version能跑。如果用的是虚拟环境,注意 MCPO 启动时继承的是哪个环境的 PATH。
第二个是 OpenWebUI 里工具显示已启用但调用失败。先看 MCPO 日志有没有收到请求。如果日志里完全没有 POST 记录,说明 OpenWebUI 根本没发出来,检查工具 URL 是不是写成了 127.0.0.1 而 OpenWebUI 跑在容器里——容器里的 127.0.0.1 指向容器自己,不是宿主机。这种情况要把 URL 换成宿主机的实际 IP 或容器网络里的服务名。
第三个是 OpenAPI 文档拉取失败。OpenWebUI 注册工具时会去拉 //openapi.json,如果这个地址返回 404,工具就注册不上。手动 curl 一下确认能返回 JSON。返回 404 一般是 MCPO 没挂上那个服务器,或者路径名拼错了。
第四个是 TaoToken 请求返回 401。这是 Key 的问题,去 https://taotoken.net/console/api-keys 确认 Key 还在、没被吊销、额度没用完。另外注意 Authorization 头是Bearer <key>,别漏了 Bearer 前缀。
第五个是 memory 服务器启动慢或超时。memory 用 npx 拉起,第一次会去下载包,网络慢的时候 MCPO 启动会卡住。可以先手动跑一次npx -y @modelcontextprotocol/server-memory把包缓存下来,再启动 MCPO 就快了。
第六个是时区不对。time 服务器的 --local-timezone 参数如果没传或传错,模型回答的时间会偏。确认 config.json 里写的是 Asia/Shanghai,改完重启 MCPO。
排障的通用思路是分层看:先确认 MCPO 本身能启动、OpenAPI 文档能访问,再确认 OpenWebUI 能拉到文档并注册工具,最后确认调用时 MCPO 日志有记录。哪一层断了就修哪一层,别一上来就怀疑模型。
7. 把通道和工具收敛到一处
走到这里,你应该已经有一个能用的 OpenWebUI + MCPO + TaoToken 组合了。模型对话走 TaoToken 统一通道,工具调用走 MCPO 翻译出来的 OpenAPI 端点,Key 和地址都收敛到一处管理。
如果你还在逐个工具配 Key、逐个模型改 base_url,建议把接入文档过一遍:https://taotoken.net/doc 。文档里有完整的请求格式和参数说明,照着改配置比试错快。API Keys 管理在 https://taotoken.net/console/api-keys ,定期检查一下哪些 Key 还在用、哪些可以吊销。
想先验证模型通道通不通,可以直接用模型对话页面发一条消息:https://taotoken.net/models 。这一步不涉及 MCPO,纯粹确认 TaoToken 通道正常,排除掉模型层的问题后再去调工具。
长期跑编码或 Agent 任务的话,Coding Plan 值得看一下:https://taotoken.net/coding-plan 。它跟按量 API 是两条线,高频场景下更划算。不过这篇的重点是 MCPO 工具链,Coding Plan 属于后续扩展。
最后说个实际经验:MCPO 的 config.json 和 OpenWebUI 的 settings.json 一定要进版本管理,但 Key 用环境变量注入。我见过太多人把 Key 硬编码进配置文件,结果文件一分享就泄露。环境变量注入多写一行,省掉后面一堆麻烦。工具链这东西,配置清晰比功能多更重要,能复现的配置才是好配置。