Newer
Older
TelosDB / journals / 20260223-0023-MCPモジュールのリファクタリングと機能分割.md

20260223-0023-MCPモジュールのリファクタリングと機能分割

作業実施の理由

src/backend/src/mcp.rs が 1100 行を超え、ネストも 13 階層に達しており、新しく導入したコード品質基準(600行以内 / 7階層以内)を大幅に超過していたため。

指示内容

  • 背景: プロジェクトの保守性向上のため、巨大化したファイルを機能単位で分割する。
  • 観点: MCP (Model Context Protocol) の責務を、通信(axum)、データ型、バックグラウンド処理、個別ツールに分ける。
  • 意図: 各ファイルの役割を明確にし、今後の機能追加やデバッグを容易にする。

指示内容に対するAIエージェントの対応

1. 構成案の策定

mcp.rssrc/backend/src/mcp/ ディレクトリ配下の複数のモジュールに分割する計画を立てた。

2. モジュール分割の実行

以下の構成でファイルを新規作成し、コードを移譲した:

  • src/backend/src/mcp/types.rs: AppState や JSON-RPC 構造体の定義。
  • src/backend/src/mcp/handlers.rs: SSE やステータス確認用の axum ハンドラ。
  • src/backend/src/mcp/system.rs: LSA トレーニングや HNSW 同期などの基盤ロジック。
  • src/backend/src/mcp/tools/mod.rs: ツールのディスパッチャ。
  • src/backend/src/mcp/tools/items.rs: add, update, delete, get の実装。
  • src/backend/src/mcp/tools/search.rs: search_text のハイブリッド検索実装。
  • src/backend/src/mcp/tools/system.rs: lsa_retrain ツール。
  • src/backend/src/mcp/mod.rs: メインのメッセージハンドラとサーバー起動処理。

3. 指摘事項とその対応

  • 不一致の修正: 初期移行時、JapaneseTokenizer::new() の戻り値(Result)の処理漏れによりビルドエラーが発生したが、unwrap() を追加して修正した。
  • ハンドラの復旧: リファクタリング時に誤って削除された initialize ハンドラを src/backend/src/mcp/mod.rs に復旧し、LM Studio 等の外部クライアントからの初期化が失敗する問題を解決した。
  • インポートの欠落: 各サブモジュールで必要な log, serde_json, ndarray, sqlx などのインポートを補完した。

作業詳細

  1. src/backend/src/mcp/ ディレクトリを作成。
  2. 機能ごとにファイルを分割して書き出し。
  3. src/backend/src/mcp.rs を削除し、lib.rs からの参照が mcp/mod.rs に向くように調整。
  4. cargo check によるビルド確認を実施。
  5. count_loc.cjs および nesting_depth.cjs で品質基準の遵守を確認。

AI視点での結果

  • 行数: 1ファイル最大 348 行(items.rs)となり、基準の 600 行をクリア。
  • ネスト: 巨大な match 文やネストした関数を解消したことで、各関数の複雑度が低下。
  • 保守性: 機能追加時にどのファイルを編集すべきかが一目瞭然となり、開発効率の向上が期待できる。
graph TD
    A[lib.rs] --> B[mcp/mod.rs]
    B --> C[mcp/handlers.rs]
    B --> D[mcp/tools/mod.rs]
    B --> E[mcp/system.rs]
    D --> F[mcp/tools/items.rs]
    D --> G[mcp/tools/search.rs]
    D --> H[mcp/tools/system.rs]
    F -.-> I[AppState / types.rs]
    G -.-> I
    H -.-> I