🔧

AIによるGo言語コーディングを支援するMCPサーバーを作ってみた

に公開

サマリ

  • AI コーディング時のリネームや影響範囲調査は、リポジトリ全体を走査する従来方式ではトークン浪費と参照漏れが発生する
  • Goの静的解析を使った MCP サーバーを実装し、モジュール配下の影響範囲を正確・軽量に抽出できるようにした

背景 & 課題

Go リポジトリで 構造体や関数の名前を変える/フィールドを追加するといったリファクタリングを行う際、最近の AI コーディング支援は「レポジトリ全体をテキストとしてスキャンし、影響範囲を推定する」方式です。しかし、この方法には次のような改善点があります。

  • トークン浪費
    • レポジトリ全体を読み込んでトークンを消費
  • 誤検出・取りこぼし
    • mypkginternal/mypkg のような 同名パッケージ や、longpackagename "pkg" のような エイリアス が混在すると、真に変更すべき参照だけを抽出しにくい
  • フィードバックの非効率さ
    • Lint や CI で漏れが検出されてから再度修正 → 再ビルド、と手戻りが発生する

今回の取り組み

今回は静的解析を利用したMCPサーバー を用意し、AI が “正しく・軽量に” 影響範囲を把握できる仕組みを構築しました。MCPサーバー は次のtool を提供します。

  • list-refs
    • 指定シンボルの参照箇所を列挙
  • rename
    • 参照を含めて一括リネーム

仕組みの特徴

  1. 静的解析による正確な影響範囲列挙
    • 標準ライブラリを用いて静的解析を行い、定義箇所と参照箇所を機械的に抽出。エイリアスや同名パッケージの衝突も判別可能
  2. モジュール単位で完結
    • 指定ファイルから親ディレクトリを遡り go.mod を検出。モジュール配下 すべての .go ファイル を対象にするため、依存関係の抜け漏れを防ぐ
  3. AI との連携を前提に最小トークン化
    • MCPサーバーが返すのは “ファイルパス : 行番号 : カラム番号” のリストのみ。AI は不要なコード全文を読み込む必要がなく、リネームも 1 API 呼び出しで完了

プロトタイプの作成

  • リポジトリ:https://github.com/hacobu-inc/mcp-goref
  • 開発フロー
    1. ChatGPT とディスカッションしながら doc/design.md を策定
    2. OpenAI Codex CLI を使って、まずは CLI の形で実装
    3. 動作が確認できたらMCP のフロントを実装

実行してみて

  • 環境:GitHub Copilot Chat
  • 気づき
    • ファイルパスを正しく指定させるのが難しく、Copilot がパスを誤るケースが散発
    • mcp-goref を利用することをコンテキストとして事前に与えると適切に利用してくれる
    • 逆にコンテキストが不足していると、Copilot が別ツールを選択したり無視したりする

最後に

私はGoLand で実装することが多く、このような専用のIDEで提供されるリファクタリングツールをよく利用していました。AIによるコーディングを試している中でリファクタリングに失敗することがあり、GoLand みたいにやってくれたらいいのにと思ったのが今回のツールを作ったきっかけです。実際作ってみて、この方向での進化も案外アリなのではないかと感じました。

Hacobuテックブログ

Discussion