Skip to content

fix(mcp): force reset RagMcpAgent DO to clear stale init() schema cache #109

Description

@liplus-lin-lay

目的

search_issues tool schema の type enum を 6 値から 9 値 (issue_comment / pr_review / pr_review_comment 追加) に追従させる。

前提 (検証済み)

観測:

  • ソース (v0.8.0 HEAD 1edf74d, PR feat(ingest): index comments, PR reviews, inline comments (minor) #107) = type enum は 9 値で正しく実装済み
  • デプロイ済み Worker からクライアントに surface される tool schema = 6 値のまま
  • MCP クライアント側 zod 検証エラー: Invalid enum value. Expected 'issue'|'pull_request'|'release'|'doc'|'diff'|'all', received 'issue_comment'

真因確定:

  • Cloudflare Durable Object (RagMcpAgent) の init() で zod schema を定義 → 古い enum 値が DO メモリに cache
  • Worker deploy で新コードは流れたが、既存 DO インスタンスは natural eviction まで古いコードのまま
  • 当初仮説「全クライアント切断 → idle eviction → 新 init → 新 schema」は外れ。2026-04-23 の別セッション開始時点でも schema は 6 値のまま surface された
  • 推定原因: crons = [\"0 * * * *\"] の hourly trigger、および WebSocket hibernation が DO を温存している

影響範囲:

  • RagMcpAgent は MCP server session の薄いラッパー。data は全て IssueStore / VECTORIZE / DB_FTS 側に保持。RagMcpAgent SQLite の破棄で失う user data なし

制約

  • IssueStore は保持 (indexed issue data の損失は許容不可)
  • Vectorize / D1 FTS5 は触らない (binding 変更不要)
  • migration tag は append-only (既存 v1 を触らない)
  • Cloudflare の deleted_classes は binding が残った状態では拒否される。このため同一クラス名で delete + recreate する atomic 構成は採れない
  • 回避策として binding 側を新クラス名に切り替えた上で旧クラスを delete する

対象ファイル

  • src/mcp.ts — class RagMcpAgent → RagMcpAgentV2 へ rename
  • src/index.ts — import / export / serve reference を V2 に更新
  • wrangler.toml — MCP_OBJECT binding を V2 に切り替え、migration v2 (deleted_classes=[RagMcpAgent] + new_sqlite_classes=[RagMcpAgentV2]) 追加

検証手順

  1. PR merge → 手動 npm run deploy (= wrangler deploy)
  2. wrangler が v2 migration を適用: binding が V2 を指し、旧 RagMcpAgent クラス + instance が削除される
  3. 次の MCP リクエストで V2 の新 instance が cold start → init() が走って 9 値 enum を再登録
  4. Claude Code 再接続して tool schema を確認 → 9 値 enum が surface されれば解消
  5. search_issues type=issue_comment sort=updated_desc top_k=5 実行 → zod エラーなしで return

関連

  • v0.8.0 release: v0.8.0
  • 関連 PR: #105 (tool consolidation) / #107 (comment ingest) / #110 (本修正)
  • 同 memo: #108 (manifest.json stale tool list)

Activity

  1. added
    memoメモとして開始した状態。見出しは必要なものだけでよい
    on Apr 23, 2026
  2. changed the title [-]verify(mcp): type enum cache — DO init() に古い 6 値 enum が焼き付いている[/-] [+]verify(mcp): DO init() caches stale 6-value type enum[/+] on Apr 23, 2026
  3. added this to the milestone on Apr 23, 2026
  4. added
    ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能
    in-progress着手中、実装または検証が進行中
    and removed
    memoメモとして開始した状態。見出しは必要なものだけでよい
    on Apr 23, 2026
  5. changed the title [-]verify(mcp): DO init() caches stale 6-value type enum[/-] [+]fix(mcp): force reset RagMcpAgent DO to clear stale init() schema cache[/+] on Apr 23, 2026
  6. liplus-lin-lay commented on Apr 23, 2026

    @liplus-lin-lay
    MemberAuthor

    作業完了報告

    PR #110 + #112 merge 後、npm run deploy (non-versioned) を実行し V2 binding が live。

    Uploaded github-rag-mcp (3.95 sec)
    Deployed github-rag-mcp triggers (1.09 sec)
    Current Version ID: fa6ec8d3-c5b9-41b2-b1a9-0b35124ba7d2
    

    deploy 後 search_issues の scan mode が正常 return することを確認済み。V2 namespace の DO instance が cold start で新 init() を走らせた状態。

    Master verification (再起動後)

    現 Claude Code session は session 開始時点の 6 値 schema を client 側に cache しているため、本セッション内では新 schema 確認不可。次回以降の session で:

    1. search_issues type=issue_comment sort=updated_desc top_k=3 が zod エラーなしで return すること
    2. tool schema の type enum に issue_comment / pr_review / pr_review_comment が含まれること

    本件で判明した周辺 Li+ 知見

    1. Cloudflare Workers Builds は versioned deployment (gradual) を使用。DO migration は non-versioned deploy でしか適用できない (error code 10211)。migration を含む PR は Workers Builds check が構造上必ず失敗する
    2. deleted_classes migration は binding が残った状態では適用不可。binding を新 class に切り替えた上で旧 class を delete する必要がある
    3. 過去 migration で declare されたクラスは script export を維持する必要がある (error code 10064)。rename 時は V2 を追加し旧 class を stub として残す or 明示的 migration で扱う

    これらは docs/ か wiki に残す価値があるので別 issue で書き起こす予定。

  7. liplus-lin-lay commented on Apr 24, 2026

    @liplus-lin-lay
    MemberAuthor

    真因訂正 (2026-04-23 夜セッション)

    本 issue で立てた仮説「DO init() の zod schema が cache されて stuck」は誤診断だった。正しい真因は mcp-server/server/index.js (Claude Desktop/Code 向け stdio bridge) の search_issues.inputSchema.type.enum が 6 値のまま PR #107 時点で更新漏れしていたこと。

    観測経路

    • 再セッション開始時に tool schema を読み直したところ ["issue", "pull_request", "release", "doc", "diff", "all"] の 6 値のまま (Worker は fix(wrangler): force reset RagMcpAgent DO to clear stale init() schema cache (patch) #110/fix(mcp): retain RagMcpAgent stub to satisfy migration history (patch) #112 で V2 にリネーム + migration 適用済み、zod enum は 9 値に切替え済み)
    • grep '"issue_comment"' mcp-server/server/index.js = 不一致、bridge 側の schema が Worker 側と乖離
    • installed extension (~/AppData/Roaming/Claude/Claude Extensions/local.mcpb.liplus-project.github-rag-mcp/server/index.js:463) も同じ 6 値
    • client (Claude Desktop/Code) は bridge の JSON schema で validation → issue_comment を指定すると Worker に届く前に client-side で弾かれ、Worker 側の 9 値化が意味を持たない状態だった

    V2 rename (#110/#112) の評価

    • Roll back しない。Worker 側は V2 で 9 値 zod 有効、deploy 済み、問題なく稼働
    • ただし「fix(mcp): force reset RagMcpAgent DO to clear stale init() schema cache #109 の目的達成には不要な作業だった」ことは記録しておく
    • 獲得した副産物:Cloudflare DO migration の運用制約 4 点 (versioned-deploy 拒否 / binding coupling / export 維持 / fine-grained PAT と CI trigger) を実戦で特定 → reference memory 化済み

    誤診断の教訓

    • 「Worker 側の init() schema が stuck」仮説を立てた時に、bridge 側の独立 JSON schema 存在を検査しなかった。mcp-server/ を「mcpb packaging 用」と framing して scan 対象外にしていた
    • 真因切り分けには hypothesis-negative search (仮説と無関係な原因を積極的に排除する方向の調査) が必要。今回は「DO cache が原因」と前提した上で DO migration 関連の docs ばかり追った
    • rules/model/trigger-check-gate.md の Source check 二本柱 (literal Read + RAG) を適用する時、「現象が発生する経路全体」の map を先に取らないと false-positive diagnostic になる

    後続フロー

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bug動いていない、壊れているin-progress着手中、実装または検証が進行中ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions