LAIN:コーディングエージェント向けのコードグラフとMCP
LAIN-mcpは、spuentespが公開するMITライセンスのオープンソースです。READMEによると、Tree-sitter、言語サーバー、Git履歴からメモリ上の構造プロパティグラフを作り、MCP経由でコーディングエージェントに影響範囲、呼び出しチェーン、共変更分析、複数エージェントのファイルクレームなどを提供し、ブラウザ用ダッシュボードも備えます。内容はREADMEの説明で、実行検証はしていません。
LAINとは何か:READMEの自己紹介
LAIN-mcpは、spuentespがGitHubで公開しているオープンソースプロジェクトで、ライセンスはMITです。READMEは、これを「AIコーディングエージェント専用に作られた、永続的で高性能なコードインテリジェンスと協調のエンジン」と説明しています。エージェントとはModel Context Protocol(MCP)で通信します。READMEが例に挙げるクライアントは、Claude Code、Cursor、Copilot、Codex、Agy、Cline、Windsurfです。
考え方は単純です。多くのコーディングエージェントは、コードを平坦なテキストとして扱い、キーワードで検索します。LAINは代わりに、コードベースをメモリ上の型付き構造プロパティグラフとしてインデックス化します。材料はTree-sitter、言語サーバー、Gitのコミット履歴です。そのうえで決定論的なMCPツール群を公開し、エージェントが構造に関する質問をして正確な答えを得られるようにします。READMEは、これによりエージェントが複雑なコードベースで「幻覚、盲目的な編集、コンテキストウィンドウの浪費なしに」作業できると述べています。これはプロジェクト側の主張であり、本記事では検証していません。
仕組み:READMEが示す5つの段階
第1段階はインデックス化と解析です。LAINはTree-sitterと言語サーバーでコードを走査し、関数、クラス、インポート、参照をプロパティグラフに取り込みます。第2段階は永続グラフストアです。グラフは `.lain/graph.bin` に直列化され、識別子はUUID v5で決定論的に導出されるため、素早く再読み込みできます。第3段階は時間軸のマイニングです。LAINはgitのコミットログを解析して「共変更カップリングレーダー」を作り、明示的なインポートがなくても一緒に進化するモジュールを見つけます。第4段階は助言的なプレゼンスです。メモリ上とディスク上の登録簿がエージェントのセッションとファイルのクレームを追跡し、編集の重複をリアルタイムに防ぎます。第5段階は汎用MCP配信で、ツールはstdioまたはHTTPで提供されます。
アーキテクチャ図には、さらに詳細があります。トランスポートは2種類で、単一リポジトリ向けのstdioと、ポート9999でJSON-RPCとSSEを使うHTTPです。その奥にコアがあり、統一ツールディスパッチャ、Petgraphを基にしたメモリ上のグラフエンジン、「助言的なリースとロック」と説明されるプレゼンス兼クレーム登録簿、N個のリポジトリを扱うフェデレーションエンジンが並びます。
ツールの全体像:6つの系統
READMEはMCPツールを6つの系統に分けています。
- **影響範囲と依存関係の追跡:** `get_blast_radius`、`get_call_chain`、`trace_dependency`、`get_coupling_radar`。シンボルを変更したときの下流への影響、2つの関数間の最短経路、上流の依存関係、一緒に変更されがちなファイルを返します。
- **アーキテクチャの発見:** `find_anchors`、`list_entry_points`、`get_context_depth`、`explore_architecture`。最も多く呼ばれ最も安定したシンボル、`main()`やHTTPルート、イベントハンドラなどのエントリポイント、階層的なモジュールツリーを扱います。
- **マルチエージェント協調(「Multiplayer Mode」):** `register_agent`、`heartbeat`、`claim_files`、`release_files`、`detect_overlap`、`list_active_agents`、`who_am_i`。
- **検索と深いクエリ:** `semantic_search`、`query_graph`、`explain_symbol`。`query_graph`は、`find`、`connect`、`filter`、`semantic_filter`、`sort`、`limit`を組み合わせられるJSONの処理パイプラインです。
- **マルチリポジトリのフェデレーション:** `list_repos`、`get_repo_info`、`get_federation_health`、`get_cross_repo_blast_radius`、`get_cross_repo_blast_radius_for_repo`、`search_org`。
- **コードの健全性:** `find_dead_code`、`suggest_refactor_targets`、`get_agent_strategy`、`get_world_state`。
`semantic_search`にはオプションのONNX埋め込みモデルが必要です。READMEはBAAI/bge-small-en-v1.5(384次元、約120MB)を推奨し、環境変数 `LAIN_EMBEDDING_MODEL` でその場所を指定します。モデルがなければ、このツールは `tools/list` から自動的に除外され、エージェントは使えないツールを目にしません。グラフ、影響範囲、ナビゲーション、協調のツールはモデルなしで動作する、とREADMEは明記しています。
インストールと接続
READMEは1行のインストーラを示しています。`curl -fsSL https://raw.githubusercontent.com/spuentesp/lain/main/install.sh | bash` を実行し、その後 `lain --version` で確認します。Homebrewや手動ビルドについてはQUICKSTARTを参照するよう案内されています。ビルドにはRust 1.75以上が必要で、共変更の分析にはGitが必要です。
エージェントへの接続は短い手順です。Claude Codeでは `claude mcp add lain -- lain mcp` を使います。CursorとWindsurfでは `lain setup --agent cursor` が `~/.cursor/mcp.json` を書き込みます。同じ `setup` コマンドは、VS Code、Codex、Continue、汎用の `.mcp.json` にも対応します。複数のリポジトリで共有するサービスとして動かす場合は、`lain server --config ./repos.yaml --transport http --port 9999` を実行します。
コマンドセンター、CLI、ホットリロード
HTTPモードでは、サーバーが `GET /` でCommand Centerというブラウザ用ダッシュボードを提供します。タブは5つで、Overview(ノードとエッジの統計、メモリ使用量、フェデレーションの健全性)、Graph(D3の力学配置ビュー)、Repos、Query、Toolsです。Toolsタブではフォームから任意のMCPツールを実行でき、「Copy as cURL」のスニペットも生成されます。
CLIのコマンドは多数あります。`lain mcp`は単一リポジトリのstdioサーバー、`lain server`は複数リポジトリのサーバーです。`lain doctor`はファイルを変更せずにリポジトリを診断し、終了コードは0が準備完了、1が利用可能だが劣化、2が利用不可です。`lain hooks`は、ファイルのクレームと重複チェックのための編集前フックを提供します。`lain schema`はツールのスキーマを出力し、CIでスキーマのずれを検出できます。`scripts/demo.sh`は、呼び出しグラフが構成上わかっている合成リポジトリに対してサーバーの答えを照合し、その後このリポジトリ(約3.5kノード)でベンチマークを行います。READMEにベンチマークの数値は載っていません。
ホットリロードは運用面で注目すべき機能です。サーバーは `repos.yaml` と `workspaces.yaml` を監視し、再起動もアクティブなエージェントセッションの切断もなしに状態を更新します。CLIコマンドは、ローカルのUnixソケットを通じて稼働中のサーバーと通信します。
私たちの分析
この設計は、テキストだけを扱うエージェントの現実的な弱点に応えています。キーワードの一致からは、誰がその関数を呼んでいるのか、変更すると何が壊れるのかがほとんどわかりません。呼び出しチェーンと影響範囲を持つ構築済みのグラフは、編集の前にエージェントが確認するための、より安価で正確な方法になります。共変更レーダーは有用な第2の信号です。Gitの履歴は、静的なインポートでは見えない結合を明らかにするからです。
マルチエージェントの部分は、より珍しい発想です。クレーム、ハートビート、重複検出は、同じワークスペースにいる複数のエージェントを協調の問題として扱います。READMEはロックを慎重に「助言的」と呼んでいます。私たちはこれを文字どおりに読みます。すべてのエージェントが手順に従うときに機能するもので、ルールを守らないエージェントを強制的に止めるものではないようです。
サプライチェーン関連のバッジにも触れておきます。READMEには、OpenSSF Scorecard、OpenSSF Best Practices、CycloneDXのSBOM、SLSA L2のビルド来歴、そして「Passes with Notes」と表示されたSafeSkillの88/100が示されています。これらはセキュリティレビューの手がかりであり、安全の証明ではありません。
限界と未解決の問い
ここに書いた内容はすべてREADMEに基づいています。LAINをインストールも実行もしていません。「ミリ秒で回答」、幻覚がないこと、数値が示されていない約3.5kノードのベンチマークは、いずれも未検証です。READMEは、どの言語で完全なグラフが得られるのかを説明しておらず、言語サーバーの例として `rust-analyzer` と `pylsp` を挙げるだけです。
メモリ上の設計がどれほど大きなリポジトリを保持できるのかも書かれていません。ただしトラブルシューティングの記述には限界の手がかりがあります。コールドキャッシュの大きな作業ツリーではインデックス化がタイムアウトすることがあり、その対処は `LAIN_REINDEX_TIMEOUT` を、既定の全体300秒、リポジトリごと60秒から引き上げることです。また、長く動き続けるstdioプロセスは、再ビルド後にクライアントを再起動するまで古い答えを返すことがある、とも注意しています。
読者への実践的なヒント
MCP対応のエージェントを使う開発者は、まず単一リポジトリの手順から試せます。インストールし、`lain doctor` を実行し、使っているクライアント向けのコマンドでサーバーを追加します。複数のリポジトリを持つチームは、フェデレーションのツールとHTTPモードを検討できます。
複数のエージェントを同時に走らせるチームは、クレームに頼る前に `docs/multiplayer.md` と `docs/hooks.md` を読むべきです。セキュリティを重視する読者は、インストールスクリプトをシェルに流し込む前に中身を読み、`docs/VERIFICATION.md` の来歴に関する説明を確認してください。`scripts/demo.sh` と自分自身のタスクで実行するまでは、精度に関する主張は仮説として扱いましょう。
Sources
FAQ
LAINとは何ですか。
LAIN-mcpは、AIコーディングエージェント向けのコードインテリジェンスと協調のエンジンで、ツールをMCPで提供します。READMEによると、Tree-sitter、言語サーバー、Git履歴からメモリ上の構造プロパティグラフを作ります。
ONNXモデルなしでも使えますか。
使えます。READMEによれば、ONNX埋め込みモデルが必要なのはsemantic_searchだけです。モデルがなければこのツールはtools/listから除外され、グラフ、影響範囲、ナビゲーション、協調のツールは動作します。
複数のエージェントが同時に編集する場合はどうなりますか。
claim_files、release_files、detect_overlapなどのツールとプレゼンス登録簿があり、助言的なリースとロックで編集の重複を防ぎます。READMEが助言的と述べているため、各エージェントが手順に従うことが前提です。