---
name: project-step1378-mcp-auto-count-2026-08-23
description: "STEP 1378 MCP tool count auto-count — finding #32 systemic 対策、hardcoded banner drift 構造的排除、v2.8.4"
metadata: 
  node_type: memory
  type: project
  originSessionId: 1f71dc26-eff6-41db-8142-70648b0a0ec2
  modified: 2026-08-22T21:46:47.646Z
---

# STEP 1378 — MCP tool count auto-count (finding #32 systemic 対策)

Date: 2026-08-23
Status: 実装 + MCP smoke verify 完了
契機: finding #30/#31/#32 drift pattern 3 例発生 → systemic 対策

## 実装 (最小 diff、tools 配列 refactor 不要)

`src/mcp/rei-mcp-server.ts`:
- import `readFileSync` from "node:fs" 追加
- `autoCountToolsFromSource()` function 追加 (source-self-read + regex pattern `^\s*name:\s*"` gm)
- main() banner 変更: hardcoded "41ツール" → auto-count result (`${auto.count}ツール (auto-count、finding #32 systemic 対策 STEP 1378)`)
- banner version v2.8.3 → v2.8.4
- Fallback graceful: readFileSync 失敗時 static warn banner に fallback、startup crash なし

## Design 選択理由

- Tools 配列 (485 行) refactor 不要: 大 diff / collision risk / semantics-preserving = 却下
- Source-self-read + regex: finding #32 検出に使った grep pattern と一字一句同じを init-time 実行 = 「発見手法 = 防止手法」 対称性
- Runtime overhead: startup 1 回のみ、<1ms

## Verify 実測

MCP stdio smoke:
```
Rei MCP Server v2.8.4 起動済み（stdio モード・41ツール (auto-count、
finding #32 systemic 対策 STEP 1378)・起動時インデックス構築）
```

Auto-count = 41 = `grep -cE '^\s*name:\s*"' src/mcp/rei-mcp-server.ts` と一致。drift 発生不能。

## Drift 予防 mechanism

- Before: tool 追加時 hardcoded 数字 update 忘れ = finding #30/#31/#32 pattern 再発
- After: tool 追加 = name: "..." 1 行 increment → 次 startup で auto 反映 = drift 不能

## Honest scope

1. 「世界初」 主張ゼロ、self-source counting = 30+ 年前既知 pattern
2. Tools 配列 refactor は 意図的 scope 外 (別 STEP candidate)
3. Regex pattern は 現 tool 定義 style 依存 (単引用符混入なら誤 count)
4. Fallback path = banner 警告のみ、runtime tool 数は correct
5. 他 MCP server への 同 pattern 適用 candidate だが 各 external で 別 STEP

## 関連

- STEP 1372 — finding #32 spot fix origin
- STEP 1349 — finding #30/#31 origin
- STEP 1334/1336 — 「開通した計器」 pattern 1-2 例目
- feedback-super-naming-siren-family-pattern — banner claim vs 実態 drift 「果たせない約束」 回避
