Files
admin/.wiki/concepts/mcp-init-resilience.md

3.6 KiB
Raw Permalink Blame History

title, type, ingested_at, ingested_by, source_project
title type ingested_at ingested_by source_project
mcp-init-resilience concept 2026-06-10T10:58:09.003Z OpeItcLoc03@DESKTOP-NSEF0UK OpeItcLoc03/workshop

MCP init resilience — почему user-level MCP не стартуют

Зафиксировано 2026-05-23. Round 2 не начат.

Класс инцидента

Два прецедента (2026-05-21, 2026-05-23): Claude Code не поднимает часть user-level MCP-серверов при инициализации. /reload-plugins не помогает (он reload'ит только plugin-MCPs, не user-level entries).

Пострадавшие серверы: interns, kicad, context7 — общее: все имеют multi-step launcher.

  • internspass show (blocking gpg-agent call) → exec python
  • kicad — node spawn'ит python helper (двойной spawn)
  • context7npx -y @upstash/context7-mcp (npm fetch / cache lock при первом запуске)

4 успешных используют прямой launcher (direct npx/node/uv).

Гипотеза root cause

CC MCP supervisor запускает MCPs параллельно при init, ждёт initialize JSON-RPC в пределах timeout (значение неизвестно). Multi-step launchers не укладываются → помечаются disconnected. Retry в сессии не делается. Параллельная вторая CC сессия (+28с) — вероятный contributing factor.

7 открытых вопросов

  1. Сколько секунд ждёт CC initialize ответа? Есть ли mcp.startupTimeoutMs knob в settings.json?
  2. Можно ли получить MCP transport stderr-логи? (claude --mcp-debug / CLAUDE_MCP_DEBUG=1)
  3. pass show в interns-mcp-launcher.sh — заменить на env-file (уже делается для других секретов)?
  4. Serial-launch wrapper между двумя CC окнами?
  5. MCPs как long-lived daemons + CC connect по сокету?
  6. Plugin MCP (context7) — почему тоже упал при /reload-plugins?
  7. Enhancement request Anthropic: /reload-mcp для user-level серверов

Fix-направления (не выбраны)

Направление Эффект Цена
Убрать pass show из interns launcher → env-file устраняет gpg-blocking API key plain at rest
Serial-launch wrapper CC сессий снимает race UX friction (ждать 30s)
Найти mcp.startupTimeoutMs knob увеличить порог если knob'а нет — null
MCPs как long-lived daemons + sockets устраняет per-session re-init зависит от CC поддержки
Push к Anthropic: /reload-mcp runtime recovery долго, off our hands

Preemptive guards

  • Не редактировать interns-mcp-launcher.sh импульсивно — сначала воспроизвести без параллельной .admin сессии
  • Не выпиливать pass без обсуждения security trade-off
  • Не предлагать --mcp-debug рестарт в активной сессии

Round 2: первые два шага

  1. Проверить mcp.startupTimeoutMs в ~/.claude/settings.json schema
  2. Воспроизвести в чистой сессии (только одна CC, без параллельной .admin) — если стартуют → виновен race; если нет → виноват launcher