opencode-cli-mcp MCP 服务说明文档:用 FastAPI 暴露 CLI 能力的 HTTP API 实践

发布时间:2026/10/25 14:16:53
opencode-cli-mcp MCP 服务说明文档:用 FastAPI 暴露 CLI 能力的 HTTP API 实践 1. 先把问题摆清楚CLI 好用但不好“被调用”opencode-cli-mcp 这个项目解决的是一个很具体的痛点opencode CLI 本身能力不错能跑 agent、能管会话、能查提供商状态但它是个命令行工具你只能在终端里敲。一旦你想让别的程序、别的客户端、甚至一个网页仪表板去调用它就卡住了——CLI 没有天然的 HTTP 入口MCP 客户端又只认标准协议。所以这个项目的定位是“桥”把 opencode CLI 的 HTTP API 封装成 MCP 工具同时用 FastAPI 做一层后端桥接再配一个 Web 仪表板做能力内省。架构上分三段客户端MCP hosts连 opencode-cli-mcp基于 FastMCP 3.2它再通过 HTTP 打到本机的opencode serve默认 4096 端口。端口分配也很清晰前端 Vite 跑 10950后端 FastAPI 跑 10951opencode serve 占 4096。适合谁三类人最对口。第一类是想通过 MCP 协议调用 opencode CLI 功能的开发者比如你在 Claude Code、Cline 这类 MCP 兼容客户端里想直接触发 agent 运行。第二类是要管理 AI 代理会话和工作流的团队需要列出会话、导出记录、给运行中的会话发消息。第三类是打算把 opencode 集成进自有系统、或者监控代理集群健康状态的人。我试过把这套东西接到统一 Key 通道上跑最大的感受是桥接层本身不难难的是配置项对不上、端口打架、以及 MCP 客户端那边 Base URL 和 Key 填错导致的 401。这篇就按“能跟做”的路子写从环境准备到配置片段到验证请求把调用链路完整跑通。核心检索词先记住opencode-cli-mcp 是一个把 CLI 能力封装为 MCP 工具和 HTTP API 的桥接服务FastAPI 负责后端桥接MCP 负责协议暴露。2. 前置准备TaoToken 统一 Key 与 opencode 环境在动 FastAPI 之前先把两件事办妥opencode CLI 装好统一 Key 通道配好。很多人一上来就 clone 仓库跑uv sync结果opencode serve起不来报找不到命令就是因为 CLI 没装。opencode CLI 的安装很直接Node 18 环境下npm i -g opencode-ai opencode --version能打印版本号就说明 CLI 就位。接着是 Python 侧项目要求 Python 3.12 配 uvuv 现在基本是 Python 项目管理的标配装完uv sync会自动拉依赖。然后是 Key 通道。opencode-cli-mcp 本身不绑定某一家模型服务它通过 opencode 的提供商配置去调 LLM。这里我建议用 TaoToken 的统一 Key 通道好处是一个 Key 走多家模型省得在 opencode 里配一堆 provider。你可以在模型对话页先确认要用的模型 ID再去 API Keys 页面生成 Key。地址分别是模型对话确认模型 IDhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel_chatAPI Keys生成 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi_keys生成 Key 后opencode 侧的配置要写清楚三件套Base URL、Key、Model ID。Base URL 用https://taotoken.net/api注意这个不带 UTM是纯 API 端点。opencode 的提供商配置一般放在用户配置目录下形如~/.config/opencode/opencode.jsonWindows 在%USERPROFILE%\.config\opencode\。一个可用的片段长这样{ provider: { taotoken: { npm: ai-sdk/openai-compatible, options: { baseURL: https://taotoken.net/api, apiKey: sk-你的Key }, models: { gpt-4o-mini: {} } } } }这里有个坑要提前说baseURL末尾不要多加/v1TaoToken 的 API 端点已经带了版本路径语义多写一层会导致 404。Model ID 必须和模型对话页里列出的完全一致大小写、连字符都不能错否则 opencode 启动时会报 provider 初始化失败。环境就绪的判断标准是opencode serve能单独起来并监听 4096。你可以先手动跑一下opencode serve --port 4096看到监听日志后再 CtrlC说明 CLI 和 provider 配置都没问题。这一步别省后面 FastAPI 桥接报的很多错根子都在这里。3. 可复制配置FastAPI 桥接与 MCP 服务片段这一节是重点给出能直接抄的配置。先把仓库拉下来git clone repository cd opencode-cli-mcp uv sync项目结构里opencode_cli_mcp/server.py是 MCP serverstdio 传输api/main.py是 FastAPI 后端10951web_sota是前端。启动方式有两种一键脚本.\start.ps1PowerShell 环境或者分开跑uv run -m opencode_cli_mcp.server uv run -m api.main cd web_sota npm run dev分开跑的好处是排障时能看清是哪一层挂了。MCP server 走 stdio不占端口FastAPI 占 10951前端占 10950。接下来是 MCP 客户端侧的配置。如果你用的是 Claude Code 这类支持 MCP 的客户端需要在它的 MCP 配置文件里登记这个 server。以 Claude Code 的settings.json风格为例片段如下{ mcpServers: { opencode-cli-mcp: { command: uv, args: [ --directory, /绝对路径/opencode-cli-mcp, run, -m, opencode_cli_mcp.server ], env: { OPENCODE_BASE_URL: http://127.0.0.1:4096, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的Key } } } }三件套在这里的体现TAOTOKEN_BASE_URL是 Base URLTAOTOKEN_API_KEY是 KeyModel ID 则在 opencode 的 provider 配置里指定上一节的models字段。MCP 客户端本身不直接认 Model ID它只负责把工具调用转发给 MCP server真正选模型的是 opencode。如果你用的是 Cline 的 MCP 配置格式类似但字段名略有差异核心还是 command args env 三块。Codex 那边如果是auth.json风格则要把 Key 写进认证文件Base URL 写进 provider 配置Model ID 写进请求参数——这三件套缺一个就会在调用时报认证失败或模型不存在。FastAPI 后端这边api/main.py默认读环境变量你也可以在项目根目录放一个.envOPENCODE_BASE_URLhttp://127.0.0.1:4096 API_PORT10951 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYsk-你的Key注意OPENCODE_BASE_URL指向的是本机opencode serve不是 TaoToken。这两个 URL 别搞混一个是 CLI 桥接目标一个是模型服务端点。踩过的坑里有一半是把这两个填反了结果 FastAPI 起来后所有工具调用都超时。配置写完后启动顺序建议是先opencode serve再 FastAPI 后端最后 MCP server 或前端。顺序反了会出现后端连不上 4096 的报错。4. 验证请求从健康检查到跑通一次 agent配置对不对靠请求验证。第一步先打 FastAPI 的健康检查确认后端活着curl -s http://127.0.0.1:10951/health正常返回类似{status:ok}。如果连不上说明api.main没起来或者端口被占先lsof -i :10951查一下。第二步验证 opencode serve 可达。FastAPI 有个能力内省接口会去探 4096curl -s http://127.0.0.1:10951/api/opencode/status返回里应该能看到 opencode 的版本和运行状态。这一步失败八成是opencode serve没起或者OPENCODE_BASE_URL写错。第三步跑一次真正的 agent 调用。MCP 工具名是opencode_run_agent通过 FastAPI 桥接时对应的 HTTP 路径大致是curl -s -X POST http://127.0.0.1:10951/api/opencode/run-agent \ -H Content-Type: application/json \ -d { prompt: 用一句话解释什么是 MCP 协议, model: gpt-4o-mini }成功的话返回里会有 agent 的输出文本和会话 ID。拿到会话 ID 后可以接着验证会话管理链路curl -s http://127.0.0.1:10951/api/opencode/sessions curl -s http://127.0.0.1:10951/api/opencode/sessions/session_id/messages前者列出活动会话后者拉取该会话的消息记录。再试导出curl -s http://127.0.0.1:10951/api/opencode/sessions/session_id/export返回 JSON 就是完整会话。这一串下来opencode_run_agent、opencode_list_sessions、opencode_get_messages、opencode_export_session四个核心工具就都验证过了。如果你是在 MCP 客户端里验证直接在对话里让客户端调用opencode_server_status能返回健康状态就说明 stdio 链路通了。再让它调opencode_list_providers返回里应该能看到你在 opencode 里配的taotoken提供商。这一步很关键——它证明 MCP server 读到了 opencode 的 provider 配置Model ID 也在其中。实测下来最容易出问题的是 agent 调用那一步。如果返回里choices字段为空或者报模型不存在回去核对 Model ID 是否和模型对话页一致如果报 401核对TAOTOKEN_API_KEY有没有多余空格、是不是复制时截断了。5. 常见报错排查401、proxy failed、choices 为空排障这节按真实报错来对。第一个高频错误是 401Error: 401 Unauthorized - invalid api key原因基本三种Key 复制时带了换行或空格、Key 已失效、或者 Base URL 填成了带 UTM 的页面地址而不是https://taotoken.net/api。排查方法是用 curl 直接打模型端点curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的Key能列出模型说明 Key 和 Base URL 都对问题就在 opencode 或 MCP 配置的传递环节。注意Authorization头的Bearer后面是一个空格别漏。第二个错误是本地代理失败local proxy failed: connect ECONNREFUSED 127.0.0.1:4096这是 FastAPI 或 MCP server 连不上opencode serve。先确认 4096 在监听lsof -i :4096或netstat -ano | findstr 4096。没监听就手动起opencode serve --port 4096。如果监听正常还报这个检查OPENCODE_BASE_URL是不是写成了localhost而服务只绑了127.0.0.1两者在某些系统上不等价统一用127.0.0.1最稳。第三个错误是返回结构里choices读不到TypeError: Cannot read properties of undefined (reading choices)这通常发生在 agent 调用返回了错误对象而不是标准响应时。根因多半是上游模型服务返回了非 200但桥接层没做错误透传直接把 body 当成功响应解析。排查时先看原始返回curl -s -X POST http://127.0.0.1:10951/api/opencode/run-agent \ -H Content-Type: application/json \ -d {prompt:test,model:gpt-4o-mini} | jq .如果 body 里有error字段按 error 内容去查——模型不存在就改 Model ID配额问题就看 Key 的额度。桥接层这层建议在api/main.py里加一段判断响应状态非 200 时直接抛带 body 的异常别往下走解析。第四个是 OAuth 相关报错出现在某些 MCP 客户端首次连接时OAuth callback failed: redirect_uri mismatchopencode-cli-mcp 走的是 stdio 传输本身不涉及 OAuth这个错一般来自客户端侧的认证流程配置。检查客户端的回调地址是否和它自己文档里要求的一致别手动改端口。stdio 模式下不需要额外开回调端口如果你看到这个错先确认客户端是不是误配成了 HTTP 传输模式。第五个是端口冲突10950/10951/4096 任一被占都会导致启动失败。统一用lsof -i :端口定位杀掉占用进程再起。前端 10950 被占时 Vite 会自动换端口但后端不会所以后端冲突要手动处理。把这些错误对照表贴在这方便你快速定位报错关键词大概率原因首查项401 UnauthorizedKey 错误或 Base URL 错Key 空格、URL 是否/apiECONNREFUSED 4096opencode serve 未起4096 监听状态reading choices上游返回错误被当成功原始 body 的 error 字段OAuth redirect_uri客户端传输模式配错是否误用 HTTP 模式端口占用10950/10951/4096 冲突lsof 定位进程6. 把链路固定下来接入文档与长期编码方案跑通一次不算完要把这套链路固定成日常可用的形态。我的做法是分两条线一条是接入文档沉淀一条是长期编码场景的方案选型。接入文档这条线重点是把三件套写死在文档里别靠记忆。Base URL 统一https://taotoken.net/apiKey 走环境变量不写进代码Model ID 单独列一张表跟模型对话页同步。文档入口在这https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc 。把 opencode 的 provider 片段、MCP 客户端的 settings 片段、FastAPI 的.env片段三份都贴进去新人照着抄就能起。长期编码和 Agent 场景如果调用量大、需要稳定配额和更完整的模型覆盖可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding_plan 。它适合把 opencode-cli-mcp 这种桥接服务长期挂在后台、持续跑 agent 会话的用法比按次调 API 更好做成本预估。还有一个实操细节MCP server 走 stdio意味着它和客户端是父子进程关系客户端退出 server 就没了。如果你想让 FastAPI 后端常驻、MCP 按需拉起就把两者分开部署——FastAPI 用 systemd 或 pm2 常驻MCP server 交给客户端管理生命周期。这样前端仪表板随时能看状态MCP 调用也不受客户端重启影响。最后留一个我常用的自检脚本每次改完配置跑一遍三秒定位问题在哪层#!/usr/bin/env bash set -e echo 1. opencode serve:; curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1:4096/health || true echo 2. FastAPI:; curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1:10951/health || true echo 3. TaoToken Key:; curl -s -o /dev/null -w %{http_code}\n https://taotoken.net/api/v1/models -H Authorization: Bearer $TAOTOKEN_API_KEY || true三个 200 就说明链路全通哪个不是 200 就回对应小节查。这套流程跑顺之后opencode-cli-mcp 的调用链路基本不会再给你添乱。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询