# 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 遠端使用。

1. claude.ai → **Settings → Connectors → Add custom connector（新增自訂 connector）**。
2. **MCP Server URL** 貼上你的 MCP URL（例：`https://arcrun-mcp.<你的CF子域>.workers.dev/mcp`）。
3. 儲存後點 **Connect**，claude.ai 會自動發現 OAuth（透過 `/.well-known/oauth-protected-resource`）並跳到同意頁 `/authorize`。
4. 在同意頁**輸入 owner secret**——就是你部署時用 `wrangler secret put MCP_OWNER_SECRET` 設的那組祕密（只有 owner 知道）。祕密正確才發 token，之後 claude.ai 用該 token 呼叫工具。
5. 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，接案切資料夾自動切帳號）：

```bash
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`：

```json
{
  "mcpServers": {
    "arcrun": {
      "type": "http",
      "url": "https://arcrun-mcp.<你的CF子域>.workers.dev/mcp"
    }
  }
}
```

官方 SaaS 版本把 `url` 換成 `https://mcp.arcrun.dev/mcp` 即可。

也可用 CLI 直接加（HTTP transport）：

```bash
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：

```json
{
  "mcpServers": {
    "arcrun": {
      "type": "http",
      "url": "https://arcrun-mcp.<你的CF子域>.workers.dev/mcp"
    }
  }
}
```

> **若你的 Claude Desktop 版本尚不支援 remote HTTP MCP**，改用 `mcp-remote` proxy 把 remote MCP 橋成本機 stdio：
>
> ```json
> {
>   "mcpServers": {
>     "arcrun": {
>       "command": "npx",
>       "args": ["-y", "mcp-remote", "https://arcrun-mcp.<你的CF子域>.workers.dev/mcp"]
>     }
>   }
> }
> ```
>
> `mcp-remote` 會自動處理 OAuth 流程（跳瀏覽器完成 owner-secret 同意頁）。

---

## 更新（取得新零件 / 新版）

**更新流程 ≈ 重跑一次部署，已安裝的自動略過。** self-hosted 用戶要拿新零件（例如新增的 `code` 零件）或新版引擎時：

```bash
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`）依序嘗試：

1. **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。
2. **`MCP_STATIC_TOKEN`（CF Secret，本機 / CLI 相容路徑）**
   - 本機 Claude Code / GUI 若不想每次走 OAuth，可設 `MCP_STATIC_TOKEN`（真祕密），把它當 `Authorization: Bearer <此值>` 帶進 `.mcp.json`。
   - 這是取代**已廢除的「明碼 namespace 當 bearer」**舊路徑的安全做法——用真祕密 token，而非把 namespace 明碼放行。
3. **官方 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](./OAUTH.md)**。

---

## 部署前置（self-hosted 用戶）

自架前，先把 OAuth 需要的 KV 與 Secret 就緒（完整清單見 **[OAUTH.md](./OAUTH.md) §7**，此處只摘要）：

1. `acr init --self-hosted` 部署 arcrun-mcp worker。
   - **CLI 路徑**：`OAUTH_KV` namespace 由 `deploy.ts` 自動建立並填入真 id（零手動）。
   - **手動直推**：`wrangler kv namespace create OAUTH_MCP` → 把 id 貼進 `mcp/wrangler.toml` 的 `[[kv_namespaces]] OAUTH_KV`。
2. **設 owner secret**：`wrangler secret put MCP_OWNER_SECRET`（輸入只有你知道的強祕密）。
3. （選配）**設本機相容 static token**：`wrangler secret put MCP_STATIC_TOKEN`。
4. （選配）`[vars]` 調整 `MCP_OWNER_NAMESPACE`（預設 `leo`）/ `MCP_TOKEN_TTL`（預設 2592000＝30 天）/ `MCP_ALLOWED_REDIRECT_HOSTS`。
5. 驗收：`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-gui) 是 Arcrun 的人類操作介面，與 arcrun-mcp 共享同一個 KBDB 狀態：

- AI 透過 arcrun-mcp 操作（搜尋零件、執行 Workflow）
- 人類透過 arcrun-gui 操作（拖拉畫布、查看零件庫）
- AI 的操作結果即時反映在 arcrun-gui 的畫布上

詳細開發指南請參閱 **[GUIDE.md](./GUIDE.md)**。

---

## 貢獻新零件

想投稿 WASM 零件（TinyGo 開發、本地測試、`arcrun_publish_component` 提交、沙盒驗收）？完整流程見 **[CONTRIBUTING-components.md](./CONTRIBUTING-components.md)**。
