Cut your AI coding agent's token usage. MCP server + CLI that turns any codebase into a deterministic code graph and serves Claude Code, Cursor, Codex & Windsurf a ranked, token-budgeted query surface — agents query structure (symbols, imports, call edges, path:line anchors) instead of crawling files. ~30x fewer exploration tokens. Local-first, read-only, no network, no embeddings.
OpenVisio MCP server provides 11 code-analysis tools with strong verb-based naming (resolve_, get_, find_, search_, trace_, describe_) and reasonably detailed descriptions. However, there are significant gaps in parameter type definitions, output schema documentation, and error handling guidance. Most tools have descriptions (194-char baseline met for many), but several lack complete schema visibility. The tools are well-scoped (each performs one clear function) and composition is sound, output from one tool chains naturally into others (e.g., find_symbol returns anchors that feed into trace_calls). However, schema rigor and output documentation are inconsistent across the set.
Analyze an image file and return a natural-language description. Used by agents to understand diagrams, screenshots, and visual assets without reading binary data.
Locate a function/class/type by exact name, regex pattern, OR natural-language query (BM25 — ranks by relevance, splits camelCase, so "update cloud client" finds updateCloudClient without knowing the exact name). Returns signature, exact path:line anchor, and the (elided) definition body — no whole-file reads. Use `query` when you know WHAT the code does but not its name.
What a file or symbol imports (file-level forward dependencies). The inverse of get_dependents: call this to understand what a symbol/file depends on before you change it.
Who imports a file or symbol (file-level reverse dependencies). Call this to measure impact before refactoring: how many files/symbols depend on the one you are changing.
Files with high churn (frequently edited) AND high centrality (import-central): refactor/risk candidates. Pass a `metric` to rank by churn, centrality, or combined score. Call this to spot architectural debt and high-impact targets for improvement.
Output schemas not documented for ANY tool. No specification of return type structure, fields, nesting, or encoding for the response of any of the 11 tools.
Mutual-exclusivity relationships between file_path and symbol_name parameters in get_dependents, get_dependencies, and get_neighborhood are documented in descriptions but not formalized in schema (should use oneOf or explicit validation). LLMs may pass both, causing ambiguity.
No error handling guidance. No description of what happens on invalid inputs (e.g., symbol not found, regex syntax error, image file cannot be read). No indication of retryable vs. fatal errors, or how LLM should respond.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
The local import subgraph around a file or symbol: what it imports, what imports it, and the connectors (one hop in each direction). Call this to scope a refactor or understand a symbol's peers.
Complete map of the repo: the most import-central files with their public symbols + signatures (budgeted), then a full inventory of EVERY other file path — nothing hidden. Call this FIRST instead of crawling files.
Drain the next user instruction from the open viewer (requires `--spotlight`). Used by agents to accept developer-composed queries from the UI.
Turn a task description into ready-to-work context in ONE call: a task-ranked skeleton + the neighborhoods of the most relevant files. Call this FIRST on any task.
Full-text search over the indexed repo — the grep/ripgrep replacement. Find any literal string, regex, TODO, error message, or config key. Returns matches ranked by file importance, each with its enclosing symbol and an exact path:line anchor. Use this instead of grep/rg/find/Grep.
Trace the call graph from a function/method: callers (who calls it — impact) or callees (what it calls). Multi-hop, ranked by importance, rendered as an anchored tree. Use this instead of grepping for call sites or "who uses this".
get_user_request has unclear availability, requires --spotlight flag, but no guidance on how LLM detects whether this is available. If the flag is not set, does the call fail? Block? Timeout? This creates an undefined state.
describe_image has no documented constraints: supported formats, max file size, max dimensions. Output format unclear (plain string vs. structured object). No error guidance for unsupported types.
budget_tokens parameter appears in 8 tools but is lightly documented. No explanation of what happens when budget is exceeded (truncation? error? partial results?). No guidance on reasonable defaults beyond 'default 2500'.