Zero-dependency interactive call-graph navigator for Python codebases — one script in, one self-contained HTML file out. Includes an MCP server for AI agents.
CallScope provides 6 well-named, verb-first tools with complete input schemas and clear descriptions. All tools follow the verb_noun pattern (analyze_project, search_functions, get_function, callers_of, call_path, generate_map). Descriptions are substantive (100-200 chars), explaining what each tool does and when to use it. Input schemas are properly typed with required fields and defaults. However, output schemas are not documented, LLMs cannot predict what fields to expect from responses. Error handling is absent from descriptions. The generate_map tool performs a write operation but lacks confirmation/dry-run guidance. Parameter descriptions are good but could specify constraints (e.g., 'limit' has no min/max bounds stated).
Statically analyze a Python codebase and build its call graph (functions, methods, resolved call edges). Results are cached for the other tools. Returns stats and the module list. Use refresh=true after the code changes.
Shortest call chain from one function to another (BFS over resolved call edges). Answers 'how does A end up invoking B?'.
List every function that calls the given function (reverse edges).
Write the interactive HTML call-graph navigator (Miller-column UI) for a human to open in a browser. Returns the output file path.
Get one function: source code, file:line, docstring, every call it makes (with resolved targets) and every caller. The core primitive for walking the call graph.
Search functions/methods by name, Class.method, or module substring. Returns function ids usable with get_function / callers_of / call_path.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Forces agents to guess what data is available after each call.
generate_map performs a write operation (creates HTML file) but lacks confirmation/dry-run pattern. Agents cannot preview output before committing.
Parameter 'limit' in search_functions has no min/max bounds documented. LLMs may pass invalid values (0, negative, or absurdly large numbers).
No error handling guidance in tool descriptions. If a path is invalid, function_id not found, or call_path has no route, LLMs receive no recovery hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
callers_of description is minimal (under 100 chars). Does not explain when to use it vs get_function or call_path, or what 'reverse edges' means to an LLM unfamiliar with graph terminology.