purpose / 目的
worker の型チェック (tsc --noEmit) が CI で走っておらず, agent.ts に 2 件の型エラーが静かに蓄積していた (PR #237 のセルフレビュー中に発見). 2 件を修正し, 再発防止に tsc 型ゲートを CI に追加する.
premise / 前提
- CI の test ジョブ =
tsx --test test/*.test.ts && vitest run で tsc --noEmit を一度も走らせていない. 型エラーは CI を素通りする (これが 2 件見逃された構造的原因).
tsc --noEmit の現状 = ちょうど 2 件 (全体確認済み), いずれも worker/src/agent.ts:
- agent.ts:31 TS2344:
TenantProps (interface) が Record<string, unknown> 制約を満たさない. TypeScript の interface は暗黙の index signature を持たないため, McpAgent<Env, unknown, TenantProps> の Props 制約に不適合.
- agent.ts:32 TS2416:
@modelcontextprotocol/sdk が依存ツリーに 2 コピー存在する (worker 直下 1.27.1 / agents@0.8.2 の nested 1.26.0). 別コピーのため McpServer の private フィールド _serverInfo が非互換となり, this.server が McpAgent の期待する型に代入できない. 版差ではなく「2 コピーある」こと自体が原因 (1.26/1.27 は実質互換).
@cloudflare/workers-types は既に worker/package.json overrides で pin 済み (同 family の transitive 重複問題). 今回は別パッケージ (@modelcontextprotocol/sdk) の同種ケース.
design / 設計・制約
- (1) dedupe (error 2): worker/package.json の
overrides に @modelcontextprotocol/sdk を追加しツリーを単一版に寄せる. 既存の @cloudflare/workers-types override がテンプレート. agents@0.8.2 が要求する 1.26.0 に合わせる方向を優先 (安全側: より制約の強い consumer に合わせる). 適用後に tsc --noEmit クリア + 全テスト + Workers build 通過を必ず確認.
- (2) type 化 (error 1): worker/src/agent.ts の
interface TenantProps を type TenantProps = に変更.
- (3) CI 型ゲート追加: worker に typecheck script (
"typecheck": "tsc --noEmit") を追加し, .github/workflows/ci.yml の CI で実行. 型エラーで CI が fail するゲートにする.
- 順序: (1)(2) を先に直し tsc を完全クリアにしてから (3) のゲートを有効化する (ゲートを先に入れると既存エラーで赤くなる). ゲート追加前に
tsc --noEmit がエラーゼロであることを全体で再確認.
- runtime 挙動は不変 (型/ビルド健全性のみ, 機能変更なし).
scope out / スコープ外
- agent.ts の機能変更, MCP ツールの挙動変更.
- 他パッケージ (mcp-server / local-mcp / shared) の typecheck ゲート化 (本 issue は worker 限定. 必要なら別 issue).
target files / 対象ファイル
- worker/package.json (overrides + typecheck script)
- worker/src/agent.ts
- .github/workflows/ci.yml
completion conditions / 完了条件
Refs #237
purpose / 目的
worker の型チェック (
tsc --noEmit) が CI で走っておらず, agent.ts に 2 件の型エラーが静かに蓄積していた (PR #237 のセルフレビュー中に発見). 2 件を修正し, 再発防止に tsc 型ゲートを CI に追加する.premise / 前提
tsx --test test/*.test.ts && vitest runでtsc --noEmitを一度も走らせていない. 型エラーは CI を素通りする (これが 2 件見逃された構造的原因).tsc --noEmitの現状 = ちょうど 2 件 (全体確認済み), いずれも worker/src/agent.ts:TenantProps(interface) がRecord<string, unknown>制約を満たさない. TypeScript の interface は暗黙の index signature を持たないため,McpAgent<Env, unknown, TenantProps>の Props 制約に不適合.@modelcontextprotocol/sdkが依存ツリーに 2 コピー存在する (worker 直下 1.27.1 /agents@0.8.2の nested 1.26.0). 別コピーのため McpServer の private フィールド_serverInfoが非互換となり,this.serverが McpAgent の期待する型に代入できない. 版差ではなく「2 コピーある」こと自体が原因 (1.26/1.27 は実質互換).@cloudflare/workers-typesは既に worker/package.json overrides で pin 済み (同 family の transitive 重複問題). 今回は別パッケージ (@modelcontextprotocol/sdk) の同種ケース.design / 設計・制約
overridesに@modelcontextprotocol/sdkを追加しツリーを単一版に寄せる. 既存の@cloudflare/workers-typesoverride がテンプレート.agents@0.8.2が要求する 1.26.0 に合わせる方向を優先 (安全側: より制約の強い consumer に合わせる). 適用後にtsc --noEmitクリア + 全テスト + Workers build 通過を必ず確認.interface TenantPropsをtype TenantProps =に変更."typecheck": "tsc --noEmit") を追加し, .github/workflows/ci.yml の CI で実行. 型エラーで CI が fail するゲートにする.tsc --noEmitがエラーゼロであることを全体で再確認.scope out / スコープ外
target files / 対象ファイル
completion conditions / 完了条件
cd worker && npx tsc --noEmitがエラーゼロ@modelcontextprotocol/sdkが単一版に dedupe される (nested コピー解消)TenantPropsが type 化されるtsc --noEmitを実行し, 型エラーで fail するゲートになっているRefs #237