From 1c630ecfd4f20f3d5a8aba9c46fef6111c9af6fd Mon Sep 17 00:00:00 2001 From: richblack Date: Mon, 10 Aug 2026 16:06:20 +0800 Subject: [PATCH] =?UTF-8?q?docs(mcp):=20/health=20=E8=A8=BB=E8=A7=A3?= =?UTF-8?q?=E8=AA=A0=E5=AF=A6=E7=95=8C=E5=AE=9A=E2=80=94=E2=80=94404=20?= =?UTF-8?q?=E5=8F=AA=E4=BB=A3=E8=A1=A8=E6=AF=94=E6=9C=AC=E7=89=88=E8=88=8A?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E7=AD=89=E6=96=BC=E8=88=8A=E4=B8=96=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 實測:leo21c 與 geek6688 的 /health 都回 404,但 geek6688 是新世代(email+password)。 原註解會讓下一個人拿 404 去判世代而誤判。 Co-Authored-By: Claude Opus 5 --- mcp/src/index.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mcp/src/index.ts b/mcp/src/index.ts index 7dcc0a2..c396868 100644 --- a/mcp/src/index.ts +++ b/mcp/src/index.ts @@ -14,14 +14,16 @@ const _app = new Hono<{ Bindings: Env; Variables: { org_namespace: string; partn // 安全模型見 mcp/OAUTH.md。註冊在 basePath 之前,落在同一份共享 router。 registerOAuthRoutes(_app); -// ── GET /health — 一條 curl 看出「這台是哪一代 MCP」──────────────────────────────── -// 為什麼要有:判斷一台實例的 MCP 是新舊世代,原本只能打 /authorize 去剖 HTML 有幾個 -// 欄位(ops-facts 2026-08-10 的土法)。那個判準脆弱又難教。改成誠實的版本面: -// • 回 200 且 auth="portal-login" = 新世代(同意頁用 Portal email+password) -// • 回 404 = 舊世代(b8ca98c 之前,同意頁要 MCP_OWNER_SECRET, -// 而那把祕密沒有人拿得到 ⇒ 等於接不上) -// AUTH_GENERATION 跟著認證機制改才動;MCP_BUILD 是部署標記(deploy 時由 toml var 帶入)。 -// 對齊 cypher-executor /health 的形狀(ok + 版本 + 能力探針),不需認證、不吐任何機密。 +// ── GET /health — 讓「這台跑的是哪一版 MCP」用一條 curl 看得到 ───────────────────── +// 為什麼要有:cypher-executor 早就有 /health(bundle_version + auth_store 探針), +// arcrun-mcp 沒有 ⇒ 要判斷某台實例的 MCP 是哪一代認證,只能打 /authorize 剖 HTML 數欄位 +// (ops-facts 2026-08-10 的土法)。那個判準脆弱又難教。 +// +// ⚠️ 誠實界定(別把它當世代判準用過頭):本端點是**這個 commit 之後才有的**,所以 +// 「/health 回 404」只代表「比本版舊」,**不代表就是 owner_secret 世代**—— +// 現階段判世代仍要看 /authorize 的欄位(一個 owner_secret =舊;email+password =新)。 +// 等這版推到各實例之後,`auth` 欄位才會變成一眼可讀的世代判準。 +// 不需認證、不吐任何機密;MCP_BUILD 是部署標記,由各實例 toml [vars] 帶入。 _app.get("/health", (c) => c.json({ ok: true, service: "arcrun-mcp",