leo 2026-08-12:「人類進 Portal 輸入帳密表示你是主人,可以查到你權限所有東西;
AI 透過輸入帳密的 MCP 查詢表示是授權的 AI,可以查到主人允許查的任何東西。」
「掛上 MCP 並輸入帳密,那個動作本身就是授權」⇒ 下游不得再要求第二次認證。
病根(不是金鑰沒同步,是身分沒接住):
oauth/routes.ts 驗完 Portal 帳密只留下 `loginOk = res.ok` 一個布林值,身分當場丟棄,
namespace 改從 `MCP_OWNER_NAMESPACE || "leo"` 拿。於是查詢時手上沒有身分可帶,
只好用 KBDB_INTERNAL_TOKEN 直打 KBDB——那條路繞過 portal 所有庫過濾,
而且不管誰登入都看到同一格、看到全部。CLI 也從不注入 MCP_OWNER_NAMESPACE,
所以那個 "leo" 預設值是每台實例的實際行為,不是理論上的邊角。
修法(走既有那條路,不發明新的):
1. 接住身分:/authorize 解析 /portal/login 回應,把 portal session token +
display_name/role/libraries 存進 authorization code → access token。
/portal/login 補回 session_expires_in,access_token TTL 夾成
min(自己的 TTL, portal session TTL)——不讓「MCP 還連著、底下 session 早死」。
cypher 回 200 但沒給 session_token(舊版)→ 不發碼,不簽一張沒有身分的 token。
2. 攜帶身分:kbdb_* 全部改走 cypher `/portal/data/*`,Authorization 帶登入者的
session。庫過濾/租戶注入/停用即時生效全在 server 側,與人類走 portal 網頁同一道閘。
kbdb_graph_neighbors 因此不再需要 kbdb_base(server 自己知道查哪個庫)。
藏書地圖(含連線時注入 instructions 的那份)同樣只回有權限的庫,快取改 per-session
分格——地圖本身就是情報,不能讓先連上的人把視野留給下一個。
3. fail-closed:舊 token 沒有身分 → 誠實要求重新連線,不偷偷退回服務金鑰那條老路。
服務級憑據(static token / partner key)維持既有 KBDB 直連,arcrun_* 零回歸。
新增 cypher portal 資料面端點(能力長在 API,MCP 只暴露;rule 07):
GET /portal/data/map、/portal/data/map/:library
GET /portal/data/templates、POST /portal/data/templates
GET /portal/data/records/by-template/:t、GET /portal/data/records/:id
POST /portal/data/records
全部:呼叫端自帶 owner_id 一律不生效;越權與不存在同回 404;寫入 owner_id 由 server 定死。
KBDB base:`GET /records/:id` 與 by-template 補回 owner_id 欄位——原本不回,
呼叫端無從判斷「這筆是不是我的」,按 id 直讀等於沒有租戶邊界。
沒動:KBDB fail-closed 閘、任何金鑰、租戶字串仍不下發給呼叫端。
驗證:
mcp tsc 綠;vitest 113/113 綠(改前 48 綠 29 紅)
cypher vitest 400 綠 / 14 紅,14 紅與 base commit a24f291 逐條相同(既有)
kbdb vitest 208 綠 / 5 紅,5 紅同為既有(migrations/*.sql 被 gitignore)
端到端 ◐ 未驗:需部署到 leo21c,那道閘要 leo 親手解(見 PR)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Arcrun MCP Server
Arcrun 是 AI 優先(AI-First) 的工作流自動化平台。 跟 AI 描述你的意圖,Arcrun 幫你把它變成可重複執行、不需要 AI 的自動化工作流。
Arcrun 是反過來的 n8n。n8n 從手寫程式開始,Arcrun 從 AI 描述開始——你說「去抓銀行匯率,用 Telegram 通知我」,AI 把它拆成三元組,Arcrun 查零件庫、組裝、執行。第一次需要 AI,之後自動跑,不再花 Token。
本目錄是 Arcrun 的 MCP Server(已併入 arcrun 主庫 arcrun/mcp/),讓 claude.ai、Claude Code、Claude Desktop 等 AI client 直接呼叫 Arcrun 的工作流與零件功能。它是「薄殼」——連哪台 cypher / 哪個帳號由設定決定,與 CLI 共用同一份身份來源。
這份文件教你怎麼把這個 MCP 裝到你的前端來用。 想貢獻新零件(投稿 WASM 元件)請見文末的 貢獻新零件。
MCP 連線 URL(先搞懂這個)
MCP 的 Streamable HTTP 端點路徑是 /mcp(worker 根路徑 / 會 404)。無論哪種前端,你要填的 URL 都是:
| 部署 | MCP URL |
|---|---|
| 官方託管 SaaS | https://mcp.arcrun.dev/mcp |
| 自架 / 接案(self-hosted) | https://arcrun-mcp.<你的CF子域>.workers.dev/mcp |
<你的CF子域>是你 Cloudflare 帳號的 workers.dev 子域(acr init --self-hosted部署後由workers_dev產生)。請依你的實際部署子域調整。 若你自己綁了 custom domain(如mcp.example.com),URL 就是https://mcp.example.com/mcp。
Transport 一律用 type: http(Streamable HTTP)。舊版 SSE(type: sse)已不支援。
安裝方式
1. claude.ai 雲端 connector(遠端)
claude.ai 走 OAuth 2.1 + PKCE 認證(見下方認證),適合自架部署的 owner 遠端使用。
- claude.ai → Settings → Connectors → Add custom connector(新增自訂 connector)。
- MCP Server URL 貼上你的 MCP URL(例:
https://arcrun-mcp.<你的CF子域>.workers.dev/mcp)。 - 儲存後點 Connect,claude.ai 會自動發現 OAuth(透過
/.well-known/oauth-protected-resource)並跳到同意頁/authorize。 - 在同意頁輸入 owner secret——就是你部署時用
wrangler secret put MCP_OWNER_SECRET設的那組祕密(只有 owner 知道)。祕密正確才發 token,之後 claude.ai 用該 token 呼叫工具。 - token 有效期預設 30 天(
MCP_TOKEN_TTL);到期後 claude.ai 會自動重走 OAuth,再輸一次 owner secret 即可。
官方 SaaS(
mcp.arcrun.dev)走的是 partner-key 驗證,不是 owner-secret 同意頁;一般接案/自架用戶用的是上面這條 OAuth 路徑。
2. Claude Code(CC / IDE)
Claude Code 用專案層 .mcp.json(HTTP transport)掛同一個 URL,auth 走 OAuth(首次連線時在瀏覽器完成 owner-secret 同意頁)。
推薦:用 CLI 自動產生(依你的 arcrun 設定寫對的 URL,接案切資料夾自動切帳號):
acr mcp-setup
acr mcp-setup 依「env > 專案 .arcrun.yaml > 全域」解析出的 mcp_url 在當前資料夾寫 .mcp.json;沒設 mcp_url 就 fallback 平台預設 https://mcp.arcrun.dev/mcp。acr init 也會自動順帶跑這步。
手動: 在專案根建 .mcp.json:
{
"mcpServers": {
"arcrun": {
"type": "http",
"url": "https://arcrun-mcp.<你的CF子域>.workers.dev/mcp"
}
}
}
官方 SaaS 版本把 url 換成 https://mcp.arcrun.dev/mcp 即可。
也可用 CLI 直接加(HTTP transport):
claude mcp add --transport http arcrun https://arcrun-mcp.<你的CF子域>.workers.dev/mcp
3. 本機 Claude Desktop
Claude Desktop 的 claude_desktop_config.json(macOS:~/Library/Application Support/Claude/;Windows:%APPDATA%\Claude\)加一組 remote HTTP MCP:
{
"mcpServers": {
"arcrun": {
"type": "http",
"url": "https://arcrun-mcp.<你的CF子域>.workers.dev/mcp"
}
}
}
若你的 Claude Desktop 版本尚不支援 remote HTTP MCP,改用
mcp-remoteproxy 把 remote MCP 橋成本機 stdio:{ "mcpServers": { "arcrun": { "command": "npx", "args": ["-y", "mcp-remote", "https://arcrun-mcp.<你的CF子域>.workers.dev/mcp"] } } }
mcp-remote會自動處理 OAuth 流程(跳瀏覽器完成 owner-secret 同意頁)。
更新(取得新零件 / 新版)
更新流程 ≈ 重跑一次部署,已安裝的自動略過。 self-hosted 用戶要拿新零件(例如新增的 code 零件)或新版引擎時:
acr update
acr update 會下載最新的 Arcrun 部署物,只部署新增 / 變更的 Worker,未變動的自動跳過(終端會顯示「N 個未變動已跳過」)。它與 acr init --self-hosted 走同一條路(下載 → 注入 KV id → wrangler deploy),差別只在:init 是首次(建 KV / R2 + 寫 config),update 是沿用既有 config 重部署有變動的 Worker。所以「新裝 arcrun」和「更新」其實差不多同一套流程——想拿新零件 / 新版就跑更新。
- 只在 self-hosted 模式可用(部署在你自己的 Cloudflare);官方 SaaS 用戶由平台自動更新,不需要跑。
- 要強制把全部 Worker 重部署一遍:
acr update --force。 - 冪等:KV namespace / D1 等基礎設施已存在則重用,不會重建。
⚠️ 更新源現況(待核佔位):
acr update的下載源正從 GitHub codeload 改指 Gitea 自有真身(修復追蹤 Arcrun#4)。上面描述以「修好後的 Gitea 版」為準;確切指令與來源行為待該修復 PR 定案,屆時再回來校正。
認證
MCP 打進 arcrun = 觸及該租戶 KBDB 全量讀寫,必須有真認證。中介層(src/middleware/partner-auth.ts)依序嘗試:
- OAuth 2.1 access_token(自架部署的遠端正規路徑)
- claude.ai / Claude Code / Claude Desktop 遠端連線都走這條。
- 唯一的人類祕密閘在
/authorize同意頁:輸入MCP_OWNER_SECRET(部署時以 CF Secret 設定,只有 owner 知道)。祕密正確才發 authorization code → 換 access_token。 - 只知道「網址」的人打得開同意頁、能跑 DCR,但沒有 owner secret 就換不到 token,打
/mcp一律 401。
MCP_STATIC_TOKEN(CF Secret,本機 / CLI 相容路徑)- 本機 Claude Code / GUI 若不想每次走 OAuth,可設
MCP_STATIC_TOKEN(真祕密),把它當Authorization: Bearer <此值>帶進.mcp.json。 - 這是取代**已廢除的「明碼 namespace 當 bearer」**舊路徑的安全做法——用真祕密 token,而非把 namespace 明碼放行。
- 本機 Claude Code / GUI 若不想每次走 OAuth,可設
- 官方 SaaS(
MULTI_TENANT未設 /true) → KBDB partner-key(pk_live…)驗證,行為不變。
⚠️ 舊的「明碼 namespace bearer」路徑已從預設移除(送
Bearer leo就能讀 leo 全部資料的洞已補)。只有明確設ALLOW_PLAINTEXT_NAMESPACE="true"(遷移期逃生門,預設關、將 SUNSET)才會恢復,正式環境勿用。
完整安全模型(PKCE、audience 綁定、KV 儲存鐵律、redirect 白名單)見 OAUTH.md。
部署前置(self-hosted 用戶)
自架前,先把 OAuth 需要的 KV 與 Secret 就緒(完整清單見 OAUTH.md §7,此處只摘要):
acr init --self-hosted部署 arcrun-mcp worker。- CLI 路徑:
OAUTH_KVnamespace 由deploy.ts自動建立並填入真 id(零手動)。 - 手動直推:
wrangler kv namespace create OAUTH_MCP→ 把 id 貼進mcp/wrangler.toml的[[kv_namespaces]] OAUTH_KV。
- CLI 路徑:
- 設 owner secret:
wrangler secret put MCP_OWNER_SECRET(輸入只有你知道的強祕密)。 - (選配)設本機相容 static token:
wrangler secret put MCP_STATIC_TOKEN。 - (選配)
[vars]調整MCP_OWNER_NAMESPACE(預設leo)/MCP_TOKEN_TTL(預設 2592000=30 天)/MCP_ALLOWED_REDIRECT_HOSTS。 - 驗收:
curl <origin>/.well-known/oauth-protected-resource→ 200;未帶 token 打/mcp→ 401 帶WWW-Authenticate;claude.ai 加 connector 走完 OAuth 能連上。
KV / secret 未就緒時,OAuth 端點誠實回 503、
/mcp回 401(不假綠),既有官方 SaaS partner-key 路徑不受影響。
MCP Tools 總覽
連上後,前端會看到兩組工具:arcrun_*(平台功能)與 kbdb_*(資料層)。
arcrun_*
工作流(Workflow)
| Tool | 一句話 |
|---|---|
arcrun_validate_yaml |
部署前驗證工作流 YAML schema。 |
arcrun_push_workflow |
把工作流 YAML 部署到雲端引擎。 |
arcrun_run_workflow |
觸發已部署的工作流執行(可帶 input)。 |
arcrun_list_workflows / arcrun_get_workflow / arcrun_delete_workflow |
列出 / 取得 / 刪除工作流(直問 cypher-executor 真實狀態)。 |
arcrun_search_workflows |
語意搜尋工作流。 |
arcrun_list_recent_executions / arcrun_list_paused_executions / arcrun_get_execution_trace |
查最近 / 暫停中的執行、取單次執行 trace。 |
零件(Component)
| Tool | 一句話 |
|---|---|
arcrun_search_components |
用自然語言語意搜尋零件庫。 |
arcrun_list_components / arcrun_get_component |
列出零件、取單一零件完整合約。 |
arcrun_get_component_guide |
取得 TinyGo 開發指引(開發新零件前必先呼叫)。 |
arcrun_publish_component |
提交 WASM 零件(見貢獻新零件)。 |
Recipe(配方 · 公庫 / 私庫)
| Tool | 一句話 |
|---|---|
arcrun_recipe_search / arcrun_recipe_list |
搜尋 / 列出配方。 |
arcrun_recipe_pull / arcrun_recipe_push / arcrun_recipe_delete |
拉取 / 推送 / 刪除私庫配方。 |
arcrun_recipe_submit_p |
投稿配方到公庫。 |
Skill / Example
| Tool | 一句話 |
|---|---|
arcrun_list_skills / arcrun_get_skill |
列出 / 取得技能。 |
arcrun_list_examples / arcrun_get_example / arcrun_search_examples |
列出 / 取得 / 搜尋範例。 |
Tag
| Tool | 一句話 |
|---|---|
arcrun_create_tag / arcrun_list_tags / arcrun_delete_tag |
建立 / 列出 / 刪除 tag。 |
arcrun_tag_resource / arcrun_untag_resource |
為工作流或零件加上 / 移除 tag。 |
其他
| Tool | 一句話 |
|---|---|
arcrun_whoami |
回報當前身份 / namespace(與 acr whoami 對齊)。 |
arcrun_report_feedback |
回報使用回饋。 |
arcrun_get_gui_context |
取 arcrun-gui 畫布上下文。 |
kbdb_*(資料層薄殼)
類 Supabase 萬用表:AI 只有 template + slot 可用,不提供建表 / SQL tool(儲存鐵律)。
| Tool | 一句話 |
|---|---|
kbdb_search |
語意搜尋 KBDB 記錄。 |
kbdb_query |
依條件查詢記錄。 |
kbdb_get_record |
取單一記錄。 |
kbdb_create_record |
建立記錄(依 template + slots)。 |
kbdb_list_templates / kbdb_create_template |
列出 / 建立 template。 |
Inspector 測試界面
開啟 <你的 MCP origin>/mcp/inspector(官方=https://mcp.arcrun.dev/mcp/inspector)即可在瀏覽器互動式測試所有 MCP tools。
搭配 arcrun-gui 使用
arcrun-gui 是 Arcrun 的人類操作介面,與 arcrun-mcp 共享同一個 KBDB 狀態:
- AI 透過 arcrun-mcp 操作(搜尋零件、執行 Workflow)
- 人類透過 arcrun-gui 操作(拖拉畫布、查看零件庫)
- AI 的操作結果即時反映在 arcrun-gui 的畫布上
詳細開發指南請參閱 GUIDE.md。
貢獻新零件
想投稿 WASM 零件(TinyGo 開發、本地測試、arcrun_publish_component 提交、沙盒驗收)?完整流程見 CONTRIBUTING-components.md。