Scala開発がもっとスマートに──Metals MCP Serverで開発者体験を変えよう
はじめに
Scala のような強力な静的型付け言語での開発において、AI 支援ツールの活用は大きな可能性を秘めています。しかし、これまで複数のリポジトリに分かれたプロジェクトでは、AI に正確なコンテキストを伝えることが難しい課題がありました。
私の開発現場を例に挙げると、モノレポ構成のプロジェクトでは AI Agent が全コードベースを把握できるため効果的に活用できていました。一方で、コードが複数の Git リポジトリに分散したプロジェクトでは、AI に必要な型情報やコンテキストを渡すことが非常に困難でした。モジュール間の依存関係を AI に伝えるために、コードを手動で抜粋してプロンプトに含めたり、ワークスペースに一時的にファイルをコピーしたりする手間が日常的に発生していました。
そんな状況を一変させたのが、Scala Metals の最近リリースされたバージョン (v1.5.3) で導入された「Metals MCP Server」です。
この機能により、AI Agent は Metals を通じて依存ライブラリの型情報に直接アクセスできるようになり、複数リポジトリ環境でも驚くほどスムーズな開発体験が実現しました。
Metals MCP Server に関するセットアップや基本的な使い方は、下記のブログで詳しく解説されています。こちらを参考にしてください。
本記事では、Metals MCP Server を実際に使用した体験と具体的な活用方法を紹介します。環境は VSCode と GitHub Copilot Agent Mode を使用しています。
注意事項
Metals MCP Server について
Metals MCP Server は、AI Agent が Scala の Language Server である Metals と連携するための機能です。この機能により、AI Agent は Metals が持つ豊富なプロジェクト情報 (コンパイル状態、シンボル定義、ドキュメントなど) に直接アクセスできるようになります。これにより、AI Agent はコードの文脈をより正確に理解し、開発者を的確にサポートできるようになります。
リリースノートにもあるように、これは AI Agent が「存在しない関数やクラスを勝手に作り出してしまう」といった問題を軽減し、より的確な提案を行うための重要な一歩です。
AI agents have the tendency to make up the existence of some functions, classes, arguments, and so on. If we allow them to use the information that Metals already has and provide them with such capabilities as searching for symbols, discovering class members, signature help, and getting symbol documentation, we expect AI agents to yield much more relevant suggestions.
Furthermore, giving the AI agent the capability to compile files, run tests, and import builds can further help automate your workflow.
Metals MCP Server でできること
現在、Metals MCP Server では以下のことができます。
| コマンド | 用途 |
|---|---|
| compile-file | 選択した Scala ファイルをコンパイル |
| compile-full | プロジェクト全体をコンパイル |
| test | テストスイートを実行 |
| glob-search | 部分文字列でシンボルを検索 |
| typed-glob-search | シンボル種別を指定して検索 (クラス・メソッド等) |
| inspect | シンボルの詳細情報 (メンバー・シグネチャ等) 取得 |
| get-docs | シンボルのドキュメントを取得 |
| get-usages | シンボルの使用箇所を取得 |
| import-build | ビルド情報を IDE にインポート |
Metals MCP Server のセットアップ
Metals MCP Server を使用するには、以下の手順が必要です。
- Metals をインストール: Metals v1.5.3 以降が必要です
- VSCode の設定: settings.json に MCP Server の設定を追加
VSCode の設定例
{
"metals.enableMcp": true
}
これにより、Metals MCP Server が有効になり、GitHub Copilot Agent Mode などの AI Agent が Metals の機能にアクセスできるようになります。

Metals MCP Server の起動ログ

Copilot によって実行できるコマンドが表示されています
Metals MCP Server を使った開発者体験
では、実際に Metals MCP Server の機能を見ていきましょう。
compile-file, compile-full: AI Agent へのコンパイル指示
これまでの開発においても、「sbtn some-project/compile を実行してコンパイルが通ることを確認してください」と指示すれば、AI Agent がターミナル上でコンパイルを実施し、結果を受けてエラー内容を修正してくれました。Metals MCP Server の compile-full compile-file を使用すると、同様のことを Copilot Chat 上で実行できます。
ただ、最初はこれまで通り sbtn compile を実行しようとしたので、「Metals でコンパイルしてください」「compile-full を実行してください」などと具体的に指示する必要があるかもしれません。

最初はちゃんと Metals でコンパイルしてください、と指示しないといけないかも
コンパイルできるだけだとあまり変わらないかなと思っていましたが、実際に使ってみると compile-file が非常に便利でした。compile-file コマンドはファイル単位でのコンパイルを行います。そのため、プロジェクト全体のコンパイルを待たずに、修正→コンパイル→フィードバックのサイクルを素早く回すことができます。エラーがあれば都度修正が入るため、レスポンスを待つストレスが軽減されました。

ファイルごとにコンパイル、修正してくれる
test: AI Agent へのテスト指示
test を使用すると Copilot Chat 上でテストを実行することができます。これまでも「sbtn some-project/testOnly xxx.yyy.SomeTest を実行してテストのエラー結果を元にテストコードを修正してください」と指示すれば同様のことができていましたが、Copilot Chat 上で直接実行できるようになりました。

大きくは変わらないのですが、Copilot Chat 上で完結できるためスムーズなフィードバックが得られるのかなと思います。
typed-glob-search, inspect, get-docs, get-usages: ワークスペースを超えたシンボル検索
これが私が特に大きな魅力を感じた点です。
これらのコマンドによって、Metals 上にある型情報やドキュメント、使用状況を AI Agent が取得することができます。これまでは同一ワークスペースにソースコードを含めたり、プロンプトに参考コードを手動で追加したりする必要がありましたが、ビルドして Metals が識別できれば AI Agent に型情報を直接渡すことができるようになりました。
つまり、ワークスペース内外に関わらず、シグネチャやドキュメント、使用方法を AI Agent に提供できるのです。これにより、分割されたリポジトリ構成でも、スムーズな開発体験が実現できます。
例えば、typed-glob-search を使えば特定の型のシンボルを検索でき、inspect でそのシンボルの詳細構造を取得し、get-docs でドキュメントを参照できます。また、get-usages を使えば、そのシンボルがどのように使われているかの具体例も取得できます。
型情報からコード生成してみよう
実際に、ワークスペース外部で実装したコードの型情報に Metals 経由でアクセスしてみました。
シナリオ
- ワークスペース1:
common-library-repoに新しい機能 (仮にNewFeatureクラスとしましょう) を追加し、sbt publishLocal。 - ワークスペース2:
common-library-repoを使用しているapplication-repoで、NewFeatureクラスを使った実装を行う。
このシナリオは、複数リポジトリに分かれたコード構成を想定しています。従来であれば、AI Agent には両方のコードベースが見えないため、正確なコード補完や提案が難しいケースでした。
実験
- まず
common-library-repoで新しい機能としてNewFeatureクラスを実装します。 -
sbt publishLocalでローカルに公開します。 - 次に
application-repoでimport-buildを実行し、Metals のビルド環境を更新します。 - 続いて AI Agent に以下のように指示します:
NewFeature クラスを検索し、その機能を使って〇〇の実装を作成してください。
最初、AI Agent は迷っているようでした。私も、何度か import-build の指示を出したり sbt bloopInstall しなおしたりしましたが、なかなかうまくいきませんでした。

最初はうまくいかなかった

import-build の指示をしてみたりした
が、具体的な指示を追加すると正確に機能しました:
typed-glob-search で NewFeature クラスを検索してください
すると AI Agent は typed-glob-search コマンドを使って、別ワークスペースのライブラリから publish した NewFeature クラスの情報を取得できました。さらに inspect で詳細な型情報も得られ、それを基にコードを生成してくれました。

typed-glob-search でクラスを検索できた
生成されたコードは、少しの調整だけですぐにコンパイルが通るようになりました。このように、AI Agent は Metals MCP Server を通じて、ワークスペース外のライブラリの型情報を正確に把握し、それに基づいたコード生成ができるようになりました。
まとめ
Metals MCP Server を実際に触ってみて、以下のメリットを体感しました:
-
Chat 上でのコンパイルとテスト:
- Copilot Chat 上でコンパイルやテスト実行が可能
- ファイル単位の素早いフィードバックサイクルによる開発効率の向上
-
ワークスペースを超えた型情報アクセス:
- モノレポではないプロジェクトでも、AI Agent に依存ライブラリの型情報を提供可能
- プロンプトに参考コードを手動で含める手間を省略
-
コード生成の質の向上:
- より正確なコード補完と提案
- 「存在しない関数やクラスを勝手に作り出す」問題の軽減
まだ experimental な機能ではありますが、今回紹介したように既に実用的な価値を提供しています。Metals の情報をいかに賢く活用するかは AI Agent のモデルや設定に依存しますが、Metals MCP Server を通じて、AI Agent はより正確な情報を取得できるようになりました。今後の機能改善や安定化が楽しみですね。
Scala での開発に携わる方々、特に「モノレポじゃないから AI Agent がうまく活用できない」「ファイルを読み込ませるのが大変」という課題で苦労されている方には、ぜひ Metals MCP Server を試していただきたいと思います。
Discussion