ModAST-MCP
ModAST-MCP
C++20/23 プロジェクト向けのモジュール対応 AST MCP サーバー。通常の AST/LSP 操作には永続的な clangd プロセスを使用し、clangd 22 がシンボルとして公開しないエンティティ(module、export module、インポートエッジ)についてはソースレベルでモジュールインデックスを維持します。
実行
npm install
npm run build
node dist/index.jsこのサーバーは MCP stdio トランスポートを使用します。Codex/Claude Desktop では、node dist/index.js をコマンドとして指定してください。
Related MCP server: clangd-mcp-server
Windows + Arch WSL
{
"mcpServers": {
"modast": {
"command": "node",
"args": ["D:/runtime/mcp/ModAST-MCP/dist/index.js"]
}
}
}最初にワークスペースを開いてください:
{
"root": "E:/github/cnetmod",
"buildDirectory": "E:/github/cnetmod/cmake-build-release-wsl",
"transport": "wsl",
"wslDistro": "Arch",
"experimentalModules": false
}mode は auto、cpp、modules のいずれかを受け付け、デフォルトは auto です。auto モードではモジュール拡張子とコンパイラフラグ(-x c++-module、-fmodule-output、/interface、/ifcOutput など)をチェックします。純粋な cpp モードでは PCM/modmap の検出をスキップし、clangd の実験的モジュールサポートを有効にしません。
workspace_open は、オペレーティングシステムの一時ディレクトリ配下に、ワークスペースパスとビルドパスのハッシュで分離された拡張コンパイルデータベースを作成します。CMake/Ninja が生成した .modmap ファイルがあればそれを再利用します。生成されたマップがない翻訳単位については、既存の PCM ファイルに対してソースレベルのインポートを解決し、既知の推移的 PCM マッピングをすべて含むキャッシュ済みレスポンスファイルを作成します。この高速パスでは experimentalModules はオフのままにしてください。必要な PCM ファイルが存在しない場合にのみ有効にしてください。
workspace_warm はノンブロッキングです。永続的な clangd バックグラウンドインデックスを構築している間は workspace_status を呼び出してください。ファイルを開いた後、クエリは同じ clangd セッションから処理されます。
開発時の更新とディスク書き込み
このワークスペースは、compile_commands.json に存在するファイルと、既知の .pcm および .modmap アーティファクトのみを監視します。リポジトリ内のすべてのファイルを再帰的に監視したり再スキャンしたりすることはありません。
監視対象のソースを編集すると、メモリ内のモジュールグラフが更新されます。開いているドキュメントは
textDocument/didChangeを通じて clangd に送信されます。ModAST キャッシュファイルは書き込まれません。モジュールインターフェースを編集すると、そのモジュールは「stale(古い)」とマークされます。対応する PCM が再ビルドされるまで、AST、定義、参照、診断のレスポンスには警告が含まれます。
PCM、modmap、コンパイルデータベースの変更は、1 回のワークスペースリフレッシュにまとめられます(デバウンス)。これにより、通常の「編集 → Ninja/CMake ビルド → クエリ」のループが処理されます。
新しい翻訳単位は、ビルドシステムが
compile_commands.jsonを更新した後、workspace_refreshによって検出されます。生成されたコンパイルデータベースとレスポンスファイルは内容比較を使用します。同一の内容は決して書き換えられません。
workspace_status.compileDatabaseは、最新の準備におけるdiskWritesとcacheFilesReusedを報告します。一時ワークスペースキャッシュは、オープン時に 14 日間の TTL、20 個の非アクティブワークスペース上限、512 MB の非アクティブキャッシュ上限で整理されます。アクティブなワークスペースは保持され、クリーンアップ結果は
workspace_status.cacheCleanupとして公開されます。セマンティッククエリは進行中のリフレッシュを待機するため、停止したクライアントではなく、置き換え後の clangd プロセスに対して実行されます。
workspace_status は sourceChanges、lastChangeAt、watchedFiles、staleModules、refreshes も報告するため、エージェントはクロスモジュールデータが最新かどうかを判断できます。
長時間実行されるツールと workspace_open はどちらも、クライアントが進行トークンを送信した場合に MCP notifications/progress を発行します。遅い clangd リクエストは 5 秒ごとにハートビートを発行します。workspace_status はポーリングしても安全です。phase、progressCompleted、progressTotal、elapsedMs、および最新 20 件の人間が読める events が含まれます。
ツール
workspace_open、workspace_status、workspace_refresh、workspace_warmmodule_search、module_graphmodule_quality、formatast、document_symbols、workspace_symbolsdefinition、references、diagnostics
行と文字の引数は 1 始まりです。エージェントが使用する場合は、definition と references は needle と occurrence を受け付けるため、手動で位置を計算する必要はありません。
format は clangd/clang-format に委譲し、プロジェクトの .clang-format を尊重します。デフォルトではプレビューのみで、フォーマット後のテキストと LSP の編集内容を返します。apply=true を指定するとソースへの書き込みが必要です。適用前に、サーバーはファイルが clangd のスナップショットと一致することを検証します。同時進行のエディタ変更があると、上書きされる代わりに競合エラーが発生します。書き込みが成功した場合は、同じディレクトリ内の一時ファイルとアトミックな名前変更を使用し、その後、永続的な clangd ドキュメントを同期します。
module_quality はソース正規表現ではなく clangd の AST ノードを使用します。モジュールインターフェースユニット内の実質的な関数本体を報告し、テンプレートと constexpr/consteval 定義は無視します。また、名前付きモジュールに .cpp、.cc、.cxx の実装ファイルやパーティション実装ユニットがない場合に警告します。2 つ目の非エクスポート .cppm ファイルがあっても、このアーキテクチャチェックは満たされません。しきい値とスキャンの並行度は設定可能です。
設計上の注意
clangd の
textDocument/astはclangdAstの下で変更されずに返されます。合成された
moduleContextがモジュールユニットとインポートを追加します。これは、clangd 22 がexport module ...に対して AST ノードを返さず、モジュール名をワークスペースシンボルとしてインデックス化しないためです。モジュール解析は意図的にソースベースであり、コンパイラベンダーに依存しません。clangd プロセスは C++ 宣言のセマンティックな権威であり続けます。
transportがwslの場合、Windows のワークスペースパスはプロセス境界でのみ/mnt/<drive>/...に変換され、MCP レスポンスは Windows パスにマッピングし直されます。MCP stdio を閉じる、stdin を終了する、または SIGINT/SIGTERM を送信すると、ファイルウォッチャーが閉じられ、clangd はグレースフルにシャットダウンされます。
検証
npm test はユニットテストとライフサイクルテストを実行します。MODAST_INTEGRATION=1 を設定すると、実際の clangd を使用したライブテストが追加されます。このテストは Windows では Arch WSL、Linux ではネイティブの clangd を使用します。GitHub Actions は Windows と Linux で Node.js 20 および 24 をテストし、Linux でのライブ clangd テストを実行し、高 severity の本番依存関係に関するアドバイザリを拒否します。
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to perform local code search, indexing, and analysis across Java, JavaScript/TypeScript, .NET/C#, and Python projects through the MCP protocol.2Apache 2.0
- AlicenseAqualityFmaintenanceProvides C++ code intelligence tools for AI agents via the Model Context Protocol, enabling symbol navigation, type information, and diagnostics.943Mozilla Public 2.0
- FlicenseNot gradedqualityBmaintenanceWorkspace-aware MCP server that provides AI clients with structural code understanding via AST parsing, hybrid retrieval, and git history, enabling accurate code search, definition lookup, and blame analysis.
- AlicenseAqualityDmaintenanceMCP server for C/C++ code analysis using clangd and clang tools, providing diagnostics, symbol search, include analysis, function listing, and code formatting.5MIT
Related MCP Connectors
Hosted MCP memory: save sessions/decisions once, search from Claude, Cursor, ChatGPT. EU-hosted FTS.
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/banderzhm/ModAST-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server