Hybrid ctags + clangd code intelligence MCP server for C/C++ projects
Solid foundation with clear verb-based naming and comprehensive descriptions. All 8 tools have explicit schemas with typed parameters and descriptions. Tool names follow verb_noun pattern (find_definition, search_symbol, rebuild_index). Descriptions average ~150 chars, within the 10-1024 baseline. However, several parameters lack granular constraints (enums, ranges), and output schemas are documented only implicitly in code comments rather than formally in tool registration. Error handling is present but minimal, most tools return generic error dicts without recovery guidance. No pagination support despite search_symbol potentially returning large result sets. Missing idempotency guarantees and confirmation patterns for the destructive rebuild_index tool.
Get incoming (who calls this) or outgoing (what does this call) call hierarchy for a function at a specific file location. Uses clangd. Line and column are 1-based. direction: 'incoming' (default) or 'outgoing'.
Get the class/type inheritance hierarchy (parents and children) for a type at a specific file location. Uses clangd. Line and column are 1-based.
Find where a symbol is defined. Returns file, line, kind, scope, and signature. Use qualified names like 'MyNamespace::MyClass' for precision. Optional kind filter: class, struct, function, member, enum, macro, etc.
Find all declaration and definition sites of a symbol. Includes prototypes, forward declarations, and definitions. Optional kind filter.
Get type information, documentation, and declaration for a symbol at a specific file location. Uses clangd for precision AST analysis. Line and column are 1-based. First call may take a few seconds to start clangd.
search_symbol lacks pagination despite default limit=50 and potential for large result sets. No next_cursor, offset, or page parameters. LLMs cannot iterate through results beyond the first 50 matches.
rebuild_index is destructive (WRITE risk) but lacks confirmation or dry-run support. An LLM could accidentally trigger a full rebuild without user consent. No idempotency guarantee documented.
Parameters 'kind' and 'scope' accept free-form strings without enum constraints. LLMs may hallucinate invalid values like 'function_ptr' or 'partial' instead of valid kinds (class, struct, function, member, enum, macro).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
List all symbols defined in a file. Returns classes, functions, members, etc. Path can be relative to project root (e.g., 'src/server/game/RolePlay/RolePlay.h'). Optional kind filter.
Rebuild the ctags symbol index. Use scope='fast' (default) for incremental, or scope='full' to force a complete rebuild. Takes ~2-3 seconds.
Search for symbols by name pattern across the entire project. Supports glob patterns (e.g., '*Handler', 'Add*Script') and substring matches. Optional kind filter. Default limit 50.
Error responses are minimal. Most tools return {'error': str} without recovery guidance. E.g., 'clangd is not available' does not suggest installing LLVM or checking CLANGD_PATH environment variable.
Output schemas are documented only in code comments and return type hints, not formally in tool registration. LLMs cannot introspect the response structure from the MCP tool definition alone.