Skip to content

fix(mcp): accept wiki_doc in the proxy search type enum [mcp-server, scripts, docs, tests] - #193

Merged
liplus-lin-lay merged 1 commit into
mainfrom
181-wiki-doc-type-filter
Aug 1, 2026
Merged

liplus-lin-lay merged 1 commit into
mainfrom
181-wiki-doc-type-filter

Conversation

@liplus-lin-lay

Copy link
Copy Markdown
Member

Closes #181

何が起きていたか

search の type に wiki_doc を渡すと validation error になり、wiki ページだけに絞った検索・走査ができなかった。

原因は Worker と proxy のズレ。Worker 側 (src/mcp.ts) は #129 以降 enum に wiki_doc を持っているが、クライアントが tools/list で受け取り引数検証に使う proxy 側の静的ミラーが古いままだった。MCP クライアントは proxy の schema で検証するため、値は Worker に届く前に弾かれていた。Worker 側の絞り込み経路 (scan / dense / sparse) は元から wiki_doc を扱えている。

既存の drift check (scripts/check-schema-drift.mjs) が見逃したのは、比較していたのが param の名前だけで enum の値を見ていなかったため。

変更点

  • proxy の search schema を mcp-server/server/tools.js に切り出し、type enum に wiki_doc を追加。tool 説明と include_content 説明も wiki surface に合わせた。切り出しの理由は、stdio transport へ接続してしまう index.js を import せずに schema をテストできるようにするため。
  • drift check を 2 軸比較に拡張(param 名 + enum の値)。抽出が壊れたときに空同士の無意味な pass にならないよう、type enum が取れなければ exit 2 する sanity guard も追加。
  • テストで固定:
    • mcp-server/test/search-tool-schema.test.js — type enum の全 10 値(wiki_doc / all を含む)と説明文の wiki 言及。
    • src/fts.workers.test.ts — 同一 repo に doc と wiki_doc を入れ、type: "wiki_doc" で wiki だけに絞れること、および type 未指定なら従来どおり両方返ることを固定。
  • docs (docs/0-requirements.md / .ja.md) の schema mirror 記述を新しいパスと 2 軸比較に更新。

検証

  • 退行確認: proxy から wiki_doc を一時的に外すと drift check が enum values missing in proxy for "type": wiki_doc で exit 1 になることを実地で確認(確認後に復元)。
  • ローカル: node scripts/check-schema-drift.mjs / npm test(node 95 + workers 38)/ mcp-server 側 npm test(10)/ npx tsc --noEmit / npx wrangler deploy --dry-run すべて通過。

制約の充足

type 未指定・type: "all" の結果集合は変更していない(wiki_doc は元から all に含まれる)。既存の type 値の挙動も変更なし。

補足(本 PR 範囲外)

README.ja.md の include_content 説明が doc のみに触れており wiki content fetch が未記載(英語 README には記載あり)。本 issue の範囲外なので触っていない。

🤖 Generated with Claude Code

…scripts, docs, tests] (#181)

`search` の `type` に `wiki_doc` を渡すと validation error になり、wiki ページだけに
絞った検索ができなかった。原因は Worker 側 (`src/mcp.ts`) では #129 以降 enum に
`wiki_doc` が入っていたのに、クライアントが実際に検証に使う proxy 側の静的ミラーが
古いままだったこと。MCP クライアントは proxy の schema で引数を検証するため、値は
Worker に届く前に弾かれていた。

変更点:
- proxy の `search` schema を `mcp-server/server/tools.js` に切り出し、`type` enum に
  `wiki_doc` を追加。tool 説明と `include_content` 説明も wiki surface に合わせて更新。
  切り出しの理由は、stdio transport に接続する `index.js` を import せずに schema を
  テストできるようにするため。
- `scripts/check-schema-drift.mjs` を param 名だけでなく enum の値も比較するよう拡張。
  名前だけの比較だったことが今回の drift を見逃した直接の原因なので、CI gate 側を塞ぐ。
- テスト追加: proxy schema の `type` enum を固定 (`mcp-server/test/search-tool-schema.test.js`)、
  および FTS 側で `type: "wiki_doc"` の絞り込みと未指定時の結果不変を固定。
- docs の schema mirror 記述を新しいパスと 2 軸比較に更新。

Worker 側の絞り込み経路 (scan / dense / sparse) は既に `wiki_doc` を扱えており、
`type` 未指定・`all` の結果集合は変更していない。

Refs #181

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@liplus-lin-lay liplus-lin-lay self-assigned this Aug 1, 2026
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
github-rag-mcp 542ddc2 Aug 01 2026, 09:59 AM

@liplus-lin-lay liplus-lin-lay left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI self-review (auto mode)

now

なし。ローカルで drift check / node 95 件 / workers 38 件 / mcp-server 10 件 / tsc --noEmit / wrangler --dry-run を通し、CI も green。退行方向の確認として proxy から wiki_doc を一時的に外し、drift check が exit 1 で落ちることを実地で確認済み(確認後に復元)。

later

  • README.ja.md の include_content 説明が wiki content fetch に触れていない(英語 README は記載済み)。本 issue の範囲外なので別 issue 相当。
  • proxy schema の切り出しで mcp-server/server/tools.js が新設されたため、schema を追う人の入口が 1 つ増えた。drift check とテストが両側を縛るので実害は無いと判断。

accepted

  • schema ミラーは引き続き手動保守。tools/list を Worker に転送しない設計(起動時 auth/network 不要)を維持するための既定のトレードオフで、CI gate を 2 軸に強化することで受容している。
  • テストは proxy schema の構造 (TOOLS[0].inputSchema) に依存する。実際に MCP クライアントが検証に使う形そのものなので、この結合は意図的。

リリース種別の判断

patch。ユーザから観測される修正だが、変更規模は既存 enum への値追加 + CI gate の比較軸追加であり、構造的な大規模変更ではない。

@liplus-lin-lay liplus-lin-lay left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI self-review (parent, auto mode)

親側で独立に確認した点:

  • 診断が正しい面を指しているか — src/mcp.ts:164 の enum には wiki_doc が既に入っている。一方 merge 前の mcp-server/server/index.js の enum には無い。したがって worker 側は無罪で、拒否していたのは proxy の静的ミラーという本 PR の見立ては合っている。
  • クライアントがどちらを見ているか — Claude Desktop の設定は npx -y github-rag-mcp@latest + RAG_WORKER_URL で、proxy 経由。tools/list は proxy のミラーから返るため、type: "wiki_doc" は worker に届く前に弾かれていた。#181 の調査で 6 経路を要したのもこれが理由。
  • drift check の二軸化 — 名前軸に加えて enum 値軸を集合比較。type の enum が両側で 5 件未満なら exit 2 する sanity guard が入っており、抽出器が構造変更で空を返した時に「空 == 空」で素通りしない。旧実装が本欠陥を見逃した原因(名前しか比べていない)を塞いでいる。
  • 退行方向の確認(proxy から wiki_doc を外すと drift check が exit 1)は実行者側で実測済み。

完了条件との対応: type: "wiki_doc" が validation を通る / all と無指定の結果が不変(src/fts.workers.test.ts の新ケースで固定)/ テストで固定(proxy 側は 10 値 enum を pin)/ 説明と docs に反映、すべて満たしている。

版種別: patch。実行者の提案に同意する。ユーザー観測可能な変更ではあるが増分の範囲で、構造変更ではない。

運用上の注意(マージだけでは閉じない点): proxy は npm パッケージとして配布され、.github/workflows/cd.yml は release イベントで publish する。したがってクライアント側で type: "wiki_doc" が使えるようになるのは release を切って @latest が更新された後。release は human gate なので本 PR では触らない。

CI: test / CI / Workers Builds すべて green、mergeStateStatus CLEAN。マージする。

@liplus-lin-lay
liplus-lin-lay merged commit de61dd0 into main Aug 1, 2026
3 checks passed
@liplus-lin-lay
liplus-lin-lay deleted the 181-wiki-doc-type-filter branch August 1, 2026 10:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec(search): wiki_doc is missing from the search type filter enum

1 participant