MCP server for C++ semantic analysis using ClangXref.dll. Provides cross-reference database queries for symbols, call graphs, definitions, references, and class members.
Six tools with clear verb-noun naming (find_*, get_*) and detailed descriptions (150-250 chars each). All tools are READ_ONLY and well-scoped. However, input schemas are minimal, each tool accepts only a single string parameter with basic description. Output schemas are completely undocumented: callers/callees/references return formatted text (StringBuilder), but the structure is not formally specified. No pagination, no error recovery guidance, no parameter constraints (enums, ranges). Descriptions reference related tools (good composition awareness) but lack actionable error messages or prerequisites.
Find all functions/methods that the given symbol directly calls (1-hop outgoing). Shows what a function does internally — its direct dependencies. For multi-hop paths between two functions, use find_call_path. Example: find_callees('main') or find_callees('Scene::update')
Find all functions/methods that directly call the given symbol (1-hop incoming). For multi-hop reachability ('can A eventually reach B?'), use find_call_path. For transitive blast-radius ('what's affected if I change this?'), use get_impact_radius. Example: find_callers('HashGrid::query') or find_callers('Scene::update')
Find all usage sites of a C++ symbol (function, class, variable, macro) across the codebase. Includes call sites, macro expansions, and #include directives. For finding just the callers of a function (structured call graph), use find_callers. For finding where a symbol is defined, use get_cpp_definition. Example: find_cpp_references('HashGrid') or find_cpp_references('MAX_OBJECTS')
List all members of a C++ class or struct. Shows member names, kinds, signatures, and source locations. For member-level caller counts and dead code analysis, use get_symbol_stats instead. Example: get_class_members('HashGrid') or get_class_members('StaticScene')
Find where a C++ symbol is defined (class, function, method, variable, enum, macro, etc.). Returns the file, line, kind, and signature. Also finds #define macro definitions. Example: get_cpp_definition('HashGrid') or get_cpp_definition('MAX_OBJECTS')
Output schemas completely undocumented. Tools return formatted text (StringBuilder) with no formal structure specification. LLMs cannot parse results reliably or chain outputs to downstream tools.
Input schemas minimal: single string parameter per tool with no type constraints, enums, or validation rules. No guidance on symbol naming conventions (qualified names vs short names), case sensitivity, or namespace handling.
No error recovery guidance. TryFuzzyFallback() is called on empty results, but the error message and fallback behavior are not visible in source. LLMs receive no actionable next steps when a symbol is not found.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | <=2025-11-25 | v2 |
Per-member fan-in (caller count) for every member of a class. Answers: 'Is this a god-class?', 'Which methods are dead code (0 callers)?', 'Which methods are hotspots (many callers)?' For just listing members without stats, use get_class_members. Example: get_symbol_stats('HashGrid')
No pagination or result limits documented. Large codebases could return thousands of references/callers, exhausting context window. No limit parameter, no cursor, no total count in response.
Tool descriptions include example symbols (HashGrid, Scene::update, MAX_OBJECTS) which LLMs may reuse literally in real calls. Should use parameter constraints or separate discovery tools instead.