Build-aware code intelligence MCP server for embedded C/C++ firmware (Mbed OS, Zephyr, PlatformIO)
Project description
fw-context
mcp-name: io.github.turbyho/fw-context-mcp
MCP server for embedded C/C++ firmware — gives AI assistants (Claude Code, Cursor, OpenCode, etc.) real understanding of your codebase. Parses your actual build with libclang, extracts every symbol, and builds a persistent index with full-text search, call graph, and vector embeddings.
No hallucination. No grepping. No reading thousands of framework headers into context.
What it does
Your AI assistant goes from guessing to knowing:
"What does
uart_initdo and who calls it?" →get_symbol_context("uart_init")— body, callers, callees in one call."Find all BLE advertising functions and how they're connected." →
search_code("ble advertising", kind="function")→find_call_path("gap_init", "start_advertising")"Show me the implementation of
adc_read— not the declaration." →get_source("adc_read")— exact body via libclang, no file reading."What would break if I change
spi_transfer?" →find_all_callers_recursive("spi_transfer")— every caller, direct and indirect."Give me a map of
modem_msg.cppbefore I read it." →get_file_map("src/modem_msg.cpp")— 426 symbols grouped by kind.
21 MCP tools — symbol search, source reading, call-graph traversal, hotspot
analysis, dead code detection, vector search. All backed by real compiler flags
from compile_commands.json — #ifdef-aware, not grep.
Quick start
1. Install
Prerequisites
| Component | Linux (apt) | macOS (brew) |
|---|---|---|
| Python 3.11+ | python3 |
python |
| uv | uv |
uv |
| bear | bear |
bear |
| libclang | libclang-dev |
llvm |
| Ollama (optional) | ollama |
ollama |
# Linux
sudo apt install python3 bear libclang-dev
# macOS
brew install python bear llvm
# Both — uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Both — Ollama (optional)
curl -fsSL https://ollama.com/install.sh | sh # Linux
brew install ollama # macOS
git clone git@github.com:turbyho/fw-context-mcp.git ~/.fw-context/src
cd ~/.fw-context/src && make install
2. Ollama (optional)
Powers smart_search (natural-language search) and explain_symbol.
Works without it — the AI assistant processes results on its own.
See the installation guide for detailed setup.
3. Register with your AI assistant
fw-context init
4. Update
cd ~/.fw-context/src && make update
5. Index your firmware project
cd your-firmware-project
# One command — auto-detects build system, runs clean build, indexes:
fw-context index
# Skip the build step (use existing compile_commands.json):
fw-context index --no-build
Auto-detection: mbed-os (.mbed, mbed-os/), Zephyr (west.yml),
PlatformIO (platformio.ini), or any build with bear.
What happens: On fw-context index without arguments, the tool:
- Detects your build system
- Runs a clean build via
bear/west/pioto produce a completecompile_commands.json - Parses every translation unit with libclang
- Builds the SQLite index with symbols, references, and embeddings
Subsequent runs are incremental — seconds for a few changed files.
Use --no-build if you already have an up-to-date compile_commands.json.
6. Restart your assistant and start asking about your code
For detailed prerequisites, Ollama setup, and AI assistant integration: Installation guide →
Why not just use LSP?
LSP servers (clangd, ccls) are excellent for interactive editing. But they have limitations for AI-assisted exploration:
| Limitation | fw-context solution |
|---|---|
| No full-text search across the codebase | FTS5 over 6 columns — find "all functions related to modem init" |
| Index dies with the server — rebuild from scratch | Persistent SQLite file — survives reboots, reads in milliseconds |
| Editor protocol, not AI protocol | MCP tools purpose-built for AI assistant workflow |
Blind to which #ifdef branch is active |
Uses real compiler flags from compile_commands.json |
Use clangd for editing, fw-context for AI-assisted exploration.
Architecture
Data flow
graph TB
subgraph BUILD["Build"]
build[Bear / West / PIO<br/>cmake / make]
cc[(compile_commands.json)]
build --> cc
end
subgraph INDEX["Index"]
libclang[libclang parses each TU<br/>extracts symbols + refs<br/>generates embeddings]
db[(SQLite on disk<br/>~/.fw-context/index/)]
cc --> libclang
libclang --> db
end
subgraph QUERY["Query"]
mcp[MCP tools<br/>JSON-RPC stdio]
ai[AI assistant answers<br/>your question about the code]
mcp --> ai
end
db --> mcp
Components
graph LR
cli[CLI: fw-context<br/>index, export, watch, status]
server[MCP Server: fw-context-mcp<br/>21 tools across search, source,<br/>graph, and maintenance categories]
ollama[Ollama<br/>optional]
db[(SQLite + FTS5<br/>+ vec0 + refs)]
cli -->|writes| db
server -->|reads| db
ollama -->|HTTP| server
| Component | Runs as | Purpose |
|---|---|---|
CLI (fw-context) |
User command | Index, export, watch, status, reset, init, search |
| Indexer | Called by CLI | libclang parses every TU, stores in SQLite + FTS5 + vec0 |
MCP server (fw-context-mcp) |
Subprocess (AI assistant) | 21 tools over JSON-RPC — search, graph, source, maintenance |
| Ollama (optional) | Local daemon | NL search, symbol explanation, embedding generation |
Features
- Fast lookups — FTS5 full-text search, prefix/exact symbol lookup, call-graph traversal
- Natural-language search — "how does the modem connect?" → finds
network_registration,modem_attach, … (Ollama, optional) - Vector search — semantic similarity via
sqlite-vec+ Ollama embeddings, hybrid FTS5+vector re-ranking - Graph analytics — call paths, transitive callers/callees, dead code detection, hotspot analysis
- Indirect call detection — resolves function-pointer arguments at direct call sites, uncovering call-graph edges that grep/cscope miss
- Incremental indexing — only changed files re-parsed; auto-reindex on query detects and fixes staleness
- Offline-first — index is a file on disk at
~/.fw-context/index/. No daemon, no cloud, no network. #ifdef-aware — uses real compiler flags; sees exactly what your compiler sees
Supported ecosystems
Works with any build system that produces compile_commands.json:
| Ecosystem | Auto-detection | Build command |
|---|---|---|
| Mbed OS | .mbed, mbed-os/, mbed_app.json |
bear -- mbed compile --clean |
| Zephyr RTOS | west.yml or zephyr/ |
west build -b <board> --pristine |
| PlatformIO | platformio.ini |
pio run --target compiledb |
| Custom | Any [build] command override |
User-specified |
fw-context index handles the build automatically. Use --no-build to
skip and use an existing compile_commands.json.
Subsequent runs are incremental — seconds for a few changed files.
Documentation
| Document | Covers |
|---|---|
| Installation | Prerequisites, install, upgrade, Ollama setup, AI assistant integration |
| Tools Reference | All 21 MCP tools, 9 CLI commands, internal workings, search pipeline |
| Configuration | .fw-context/config.toml — global defaults, per-project overrides, every setting |
| MCP Server | JSON-RPC protocol, tool schemas, error handling, debugging |
Directory layout
~/.fw-context/
├── config.toml # global defaults
├── .venv/ # Python virtual environment
│ └── bin/
│ ├── fw-context # CLI
│ └── fw-context-mcp # MCP server
└── index/
└── <project-id>/
└── index.db # SQLite + FTS5 + vec0 + refs
your-firmware/
├── .fw-context/
│ └── config.toml # per-project overrides
└── compile_commands.json
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fw_context_mcp-0.4.1.tar.gz.
File metadata
- Download URL: fw_context_mcp-0.4.1.tar.gz
- Upload date:
- Size: 128.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
873b69ac735898b2acdc38d54955839723fcb5d6bb5d2c9140391ceb5a820ff4
|
|
| MD5 |
7f032af3c2b39b3f07a60160786e1385
|
|
| BLAKE2b-256 |
38a56ee0f488aae9ffc12b8518472fcdc1d6a33b7bfa6eb5d30abf69ceedf50b
|
File details
Details for the file fw_context_mcp-0.4.1-py3-none-any.whl.
File metadata
- Download URL: fw_context_mcp-0.4.1-py3-none-any.whl
- Upload date:
- Size: 99.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd016a86098f3d3cb9f26478983b95961fe86ee5a408b4a669371b718d2fad41
|
|
| MD5 |
889952ca2a44bba02f1b56ddf3b3267f
|
|
| BLAKE2b-256 |
58f63bb36b4977864cab24cb22c095e1a39067e3e3069914d3ecad0d90cea92a
|