STEP 1378 — MCP tool count auto-count (finding #32 systemic 対策)
1. 契機 (finding #30/#31/#32 pattern の 系譜)
rei-aios MCP server banner の tool 数は STEP 1349 以降 hardcode 保守で drift 3 回発生:
- finding #30 (STEP 1349 memory) — rei-aios
get_kernel_statusdescription drift - finding #31 — rei-meta 自己言及 drift
- finding #32 (STEP 1372 memory) — banner 「38ツール」 vs 実 tool 39 個、 spot fix で 訂正
「開通した計器が 最初に映したもの」 pattern 4 例目 (STEP 1334 KA wiring + STEP 1336 Rei-Automator revival + STEP 1349 D8 connectors 系譜)。 各回 spot fix で 訂正済だが、 tool 追加ごと banner update を 手動維持 = drift 再発の temporal certainty。 systemic 対策として init-time auto-count に切替。
2. 実装 (最小 diff、 tools 配列 refactor 不要)
2.1 追加 code
function autoCountToolsFromSource(): {
count: number;
source: 'auto-count' | 'read-failed';
detail?: string;
} {
try {
const src = readFileSync(__filename, "utf-8");
const matches = src.match(/^\s*name:\s*"/gm) || [];
return { count: matches.length, source: "auto-count" };
} catch (e) {
return {
count: -1,
source: "read-failed",
detail: e instanceof Error ? e.message : String(e),
};
}
}
2.2 Banner 変更
const auto = autoCountToolsFromSource();
const countPart = auto.source === "auto-count"
? `${auto.count}ツール (auto-count、 finding #32 systemic 対策 STEP 1378)`
: `ツール数 auto-count 失敗 (${auto.detail ?? "unknown"}、 static banner に fallback)`;
console.error(`Rei MCP Server v2.8.4 起動済み(stdio モード・${countPart}・起動時インデックス構築)`);
2.3 Design 選択理由
- Tools 配列 refactor 不要: L142-626 の 485 行を module-level に move する 案は 大 diff、 collision risk 高、 semantics-preserving refactor で novelty なし → 却下
- Source-self-read + regex: finding #32 検出に 使用した `grep -cE '^\s*name:\s*"'` と 同一 pattern を init-time 実行。 「発見 手法」 = 「防止 手法」 の 対称性で 意図明示
- Fallback graceful: readFileSync 失敗時は static banner に fallback、 startup crash させない (production safety)
- Runtime overhead: startup 1 回のみ、実測 <1ms、trivial
- Version pin: v2.8.3 → v2.8.4 で auto-count 化 marker
3. Verify 実測
MCP stdio smoke test:
$ (printf 'init json' ; sleep 2) | tsx src/mcp/rei-mcp-server.ts
出力 line 1:
Rei MCP Server v2.8.4 起動済み(stdio モード・41ツール (auto-count、
finding #32 systemic 対策 STEP 1378)・起動時インデックス構築)
出力 line 2:
{"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},
"serverInfo":{"name":"rei-aios","version":"2.0.0"}},"jsonrpc":"2.0","id":1}
Auto-count = 41 = 実 tool 数 (`grep -cE '^\s*name:\s*"' src/mcp/rei-mcp-server.ts` と 一致)。 drift 構造的発生不能を confirm。
4. Drift 予防 mechanism
- Before STEP 1378: tool 追加時 banner の hardcoded 数字 update 忘れ = finding #30/#31/#32 pattern 再発
- After STEP 1378: tool 追加時
name: "..."一行が source に increment される → 次回 startup で auto-count 反映 = drift 発生不能 - Failure mode: `readFileSync(__filename)` 失敗時のみ (bundle 化 or fs permission)、 その場合 fallback banner で 警告表示、 startup crash なし
5. Honest scope
- 「世界初」 主張ゼロ、self-source counting は 30+ 年前既知 pattern、 novelty は 「finding #32 pattern の 再発防止 に 適用した Rei stack 内 初 arc」 のみ
- Tools 配列 refactor は 意図的に scope 外 (semantics-preserving move で risk vs value 不釣り合い、 大 diff は STEP 1382+ candidate)
- Regex pattern
^\s*name:\s*"は 現 tool 定義 style に依存、 別 style (e.g., `name: 'toolname'` 単引用符) が 混入すると 誤 count → v0.2 で pattern 精緻化 candidate - Fallback path (readFileSync 失敗) は banner 警告のみ、 runtime tool 数は correct、 「count 表示不能」 状態を honest 明示
- 他 MCP server (benchtop-mcp / mcp-lens / rei-automator-mcp / lab-notebook-mcp / rei-verify / rei-memory-mcp / rei-meta-mcp / rei-checker-mcp) にも 同 pattern 適用 candidate だが 各 external repo で 別 STEP 判断
6. 関連
- STEP 1372 (2026-08-23) — finding #32 spot fix origin (本 STEP が systemic 対策)
- STEP 1349 (2026-08-20) — finding #30/#31 origin (「開通した計器が 最初に映したもの」 pattern 3 例目)
- STEP 1334 (2026-08-14) + STEP 1336 (2026-08-15) — 「開通した計器」 pattern 1-2 例目
feedback_super_naming_siren_family_pattern— banner claim vs 実態 drift の 「果たせない約束」 回避feedback_all_research_site_reflection_default— 2026-08-06 protocol 継続