@cocorograph/hub-agent 0.7.56 → 0.7.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/hub-bundle.mjs +28 -12
package/package.json
CHANGED
package/src/hub-bundle.mjs
CHANGED
|
@@ -320,29 +320,45 @@ export async function applyMcpServers(bundle, { agentId, agentToken, logger } =
|
|
|
320
320
|
}
|
|
321
321
|
const transport = s.transport || "http"
|
|
322
322
|
const scope = s.scope || "user"
|
|
323
|
-
|
|
324
|
-
claudeBin,
|
|
325
|
-
"mcp",
|
|
326
|
-
"add",
|
|
327
|
-
"--transport",
|
|
328
|
-
transport,
|
|
329
|
-
"--scope",
|
|
330
|
-
scope,
|
|
331
|
-
]
|
|
323
|
+
|
|
332
324
|
// 越境制御 (2026-07): 一般向け `hub` MCP には、このホストの資格
|
|
333
325
|
// `X-Cockpit-Agent: <agentId>:<agentToken>` をヘッダで付与する。Hub backend は
|
|
334
326
|
// これを検証してホストのテナントを解決し、`hub` の acting tenant をそのテナントに
|
|
335
327
|
// **固定**する(クライアントホストは自テナントの外を触れない)。`hub_staff`(社内
|
|
336
328
|
// 横断)や外部 MCP には付けない。
|
|
337
|
-
|
|
329
|
+
const wantHeader = s.name === "hub" && agentId && agentToken
|
|
330
|
+
|
|
331
|
+
// ⚠️ 実 CLI で確認した 2 つの罠(claude-code、モックでは絶対に出ない):
|
|
332
|
+
//
|
|
333
|
+
// 1. `--header` は **可変長引数** (`-H, --header <header...>`)。オプションを
|
|
334
|
+
// 位置引数より前に置くと、後続の `<name> <url>` まで header 値として飲み込み、
|
|
335
|
+
// `error: missing required argument 'name'` で落ちる。
|
|
336
|
+
// → **必ず `<name> <url>` の後ろに置く**(実測: 後置なら headers に正しく入る)。
|
|
337
|
+
//
|
|
338
|
+
// 2. `claude mcp add` は **冪等ではない**。既存の同名 server があると
|
|
339
|
+
// `MCP server <name> already exists in <scope> config` を返して失敗し、
|
|
340
|
+
// **ヘッダは永久に適用されない**(=publish しても pin が発火しない)。
|
|
341
|
+
// → ヘッダを付ける対象は **remove してから add** して確実に再登録する。
|
|
342
|
+
// remove は「存在しなければ失敗する」ので、失敗は握り潰して続行する。
|
|
343
|
+
const argv = [claudeBin, "mcp", "add", "--transport", transport, "--scope", scope, s.name, s.url]
|
|
344
|
+
if (wantHeader) {
|
|
338
345
|
argv.push("--header", `X-Cockpit-Agent: ${agentId}:${agentToken}`)
|
|
339
346
|
}
|
|
340
|
-
|
|
347
|
+
|
|
341
348
|
try {
|
|
349
|
+
if (wantHeader) {
|
|
350
|
+
// 既存があると add が弾かれるため、先に落とす(無ければ失敗するので無視)。
|
|
351
|
+
try {
|
|
352
|
+
await runOnce([claudeBin, "mcp", "remove", s.name, "-s", scope], { logger })
|
|
353
|
+
} catch {
|
|
354
|
+
// 未登録 → remove は失敗するが正常系。
|
|
355
|
+
}
|
|
356
|
+
}
|
|
342
357
|
await runOnce(argv, { logger })
|
|
343
358
|
added.push(s.name)
|
|
344
359
|
} catch (err) {
|
|
345
|
-
//
|
|
360
|
+
// `hub_staff` 等(ヘッダ不要)は既存なら "already exists" で失敗する。これは
|
|
361
|
+
// 「既に正しく登録済み」なので実害なし。ログだけ残して継続する。
|
|
346
362
|
logger?.warn({ name: s.name, err: err.message }, "claude mcp add failed")
|
|
347
363
|
skipped.push(s.name)
|
|
348
364
|
}
|