Install
$ agentstack add mcp-daveelton-clast ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Clang AST MCP Server
Semantic C++ code index for Claude Code. Reduces token consumption by delivering precise code chunks — function bodies, class outlines, call sites — instead of making Claude read entire files.
How it works
- Index — Clang parses your C++ source files, extracting symbols (functions,
classes, methods) with their signatures, doc comments, source bodies, and cross-references. Stored in a local SQLite database.
- Query — Claude Code calls MCP tools (
ast_search,ast_get_symbol, etc.)
to retrieve just the code it needs. No file reading, no grep, no glob.
Prerequisites
- Python 3.11+
- libclang (system package:
apt install libclang-devorbrew install llvm) - python3-clang (matching version:
apt install python3-clang-18) - compile_commands.json from CMake (recommended but not required)
Quick start
0. Clone into your C++ project
From your project root, clone the repo and add it to .gitignore so neither the tool nor its index database get committed to your project:
git clone git@github.com:daveelton/clast.git
echo "clast/" >> .gitignore
./clast/bootstrap.sh
1. Generate compile_commands.json (if using CMake)
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
For CLion: Settings > Build, Execution, Deployment > CMake — append -DCMAKE_EXPORT_COMPILE_COMMANDS=ON to the "CMake options" field, then rebuild.
2. Index your project
There are two ways to run the indexer: standalone or via CMake.
Option A: Standalone (simplest)
Run the indexer directly from the command line:
cd clast
./index.sh # auto-finds compile_commands.json
./index.sh /path/to/cmake-build-debug # or specify the build dir
./index.sh --force # re-index everything
This works well when all headers exist before indexing. If your project generates headers during the build (e.g. JUCE's JuceHeader.h), build first, then run index.sh.
Option B: CMake integration
For projects with generated headers, integrate the indexer as a CMake build target. This guarantees the index runs after the build, so all headers exist.
Add to your CMakeLists.txt:
include(clast/cmake/ClastIndex.cmake)
add_clast_index(YourMainTarget)
The ast-index target is part of the default ALL build, so the index is updated automatically every time you build. The indexer is incremental (content-hash based), so no-change builds add negligible overhead.
3. Configure Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"clang-ast": {
"command": "bash",
"args": ["-c", "./clast/.venv/bin/python3 -m clang_ast_mcp serve --db ./clast/.ast-index.db 2>>./clast/mcp.log"],
"env": {
"LIBCLANG_PATH": "/opt/homebrew/opt/llvm/lib/libclang.dylib"
}
}
}
}
Logs are appended to ./clast/mcp.log — use tail -f ./clast/mcp.log to watch tool calls, response sizes, and timing in real time.
bootstrap.sh will offer to append clast instructions to your project's CLAUDE.md. If you prefer to do it manually, copy the contents of [CLAUDE-CLAST-ADDITION.md](CLAUDE-CLAST-ADDITION.md) into your project's CLAUDE.md.
MCP Tools
| Tool | Purpose | When to use | |------|---------|-------------| | ast_search | Keyword/natural language search | "How does parameter smoothing work?" | | ast_get_symbol | Get full definition by name | "Show me MyPlugin::processBlock" | | ast_get_outline | Class/file outline (no bodies) | "What's the interface of MyPlugin?" | | ast_get_references | Find call sites | "What calls parameterChanged?" | | ast_get_hierarchy | Inheritance tree | "What derives from AudioProcessor?" | | ast_index | Re-index project | After changing files | | ast_status | Index stats | Check if index is loaded |
Output format
By default, tool responses use a compact plain-text format that renders native C++ syntax instead of JSON field names, saving ~3,000-5,000 tokens per session. See [docs/compact-response-format.md](docs/compact-response-format.md) for the full specification and rationale.
To switch to JSON output, use the CLI flag:
python3 -m clang_ast_mcp serve --db .ast-index.db --format json
Or the environment variable:
AST_OUTPUT_FORMAT=json python3 -m clang_ast_mcp serve --db .ast-index.db
In .mcp.json:
{
"mcpServers": {
"clang-ast": {
"command": "bash",
"args": ["-c", "./clast/.venv/bin/python3 -m clang_ast_mcp serve --db ./clast/.ast-index.db 2>>./clast/mcp.log"],
"env": {
"AST_OUTPUT_FORMAT": "json",
"LIBCLANG_PATH": "/opt/homebrew/opt/llvm/lib/libclang.dylib"
}
}
}
}
The format is server-wide — restart with a different setting to switch. This makes A/B comparison straightforward: run a full session in each mode and compare token usage from Claude Code's reporting.
Architecture
compile_commands.json
│
▼
┌──────────┐ ┌───────────┐ ┌──────────┐
│ libclang │────▶│ SQLite │────▶│ BM25 │
│ indexer │ │ index │ │ search │
└──────────┘ └───────────┘ └──────────┘
│
▼
┌───────────┐
│ MCP tools │◀──── Claude Code
│ (stdio) │
└───────────┘
- Indexer uses
libclangto parse each translation unit, extracting symbols
with USRs (Unified Symbol Resolution IDs) for precise cross-referencing
- Storage is SQLite with indexes on symbol names, USRs, and file paths
- Search uses BM25 keyword ranking over symbol names, signatures, and doc comments
- MCP server uses FastMCP with stdio transport (local to Claude Code)
Incremental re-indexing
The indexer tracks file content hashes. Running ast_index again only re-parses files that have changed. Use --force to re-index everything.
Indexing third-party headers
For JUCE or similar large frameworks, index only the public headers:
clang-ast-mcp index /path/to/JUCE/modules \
--db /path/to/your/project/.ast-index.db
This gives Claude access to JUCE class outlines and API signatures without indexing implementation files.
Advanced topics
Manual CMake index target
If you prefer to run the indexer on demand rather than on every build, pass EXCLUDE_FROM_ALL:
include(clast/cmake/ClastIndex.cmake)
add_clast_index(YourMainTarget EXCLUDE_FROM_ALL)
Then build the index explicitly:
cmake --build cmake-build-debug --target ast-index
The ast-index target depends on your main target, so it will build your project first if needed.
Xcode projects
Xcode doesn't produce compile_commands.json natively. You may be able to use Bear to generate one by intercepting compiler calls during a real build:
brew install bear
bear -- xcodebuild -project Foo.xcodeproj -scheme Foo build
Then run ./clast/index.sh as usual — it will find the generated compile_commands.json in the project root.
LLM Generated Code Caveat Emptor
The content of this project contains largely LLM-generated code with all the benefits and limitations that entails.
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: daveelton
- Source: daveelton/clast
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.