A deterministic code structure oracle server that exposes read-only tools for querying enrolled repositories: file structure, symbols, diffs, hashes, and symbol location with exact AST-based verification.
RunEcho MCP provides well-structured tool definitions with clear, substantive descriptions and detailed input schemas. All 6 tools have descriptions ranging from 140 - 310 characters, exceeding the 10-character minimum and staying within the productive 50 - 200 char range for LLM optimization. All tools include proper JSON Schema input definitions with required fields, type constraints, and parameter descriptions. However, output schemas are not documented in the visible code, which is a notable gap for agents planning downstream calls. Tool naming uses domain-specific verbs (structure, diff, hash, status, health, locate) that are clear within the codebase context, though 'structure' and 'locate' are slightly less action-oriented than verb_noun conventions (e.g., 'get_structure', 'search_symbols' would be clearer for LLM dispatch). Error handling is mentioned but not detailed in the source excerpt. No tool annotations (readOnlyHint, destructiveHint) are visible despite all 6 tools being read-only operations. Security is well-addressed: no secrets in parameters, repo-based access control, and git integration for safe operations.
Structural drift for an enrolled repo. With a+b (snapshot ids) diffs those snapshots; with `since`=label diffs that snapshot vs live code; default diffs the latest snapshot vs live code.
Deterministic root hash + file count of an enrolled repo's current code. Same code → identical hash across machines.
Store-wide health: schema version, integrity check, number of enrolled repos, db path.
Deterministically locate symbols in an enrolled repo: name → file:line (+ short body hash). Pass `symbol` to find a specific definition without grepping (a named lookup searches every kind); omit it to list all (capped, paginate with `offset`) — the unfiltered list defaults to functions+classes. Use this to verify a symbol exists before claiming it does: a zero-match result is definitive (parsed from the live AST), unlike grep, which can miss real symbols (formatting/whitespace variance, multi-line signatures) or hit false positives (comments, strings).
Per-repo health: last indexed, staleness, parse errors, coverage %, snapshot count, latest stored hash, file cap.
Output schemas not documented. LLMs cannot plan downstream tool calls without knowing what fields will be returned. Tools like 'structure' and 'diff' return complex nested objects (file trees, symbol lists, hashes) but the response structure is opaque to agents.
Tool naming lacks action verbs. 'structure', 'diff', 'hash', 'status', 'health', 'locate' are nouns or commands, not verb_noun patterns. LLMs optimize dispatch when names follow get_X, list_X, search_X conventions. Recommend: get_structure, compute_diff, compute_hash, get_status, get_health, search_symbols (for locate).
No tool annotations present. All 6 tools are read-only operations but lack readOnlyHint in schemas. Adding "readOnlyHint": true to InputSchema would clarify to agents that these tools are safe to call without side effects.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
Deterministic structure (files + symbols) of an enrolled repo's current code. Use to ground claims about what functions/types/exports exist. Scope with `paths` globs and pick a `detail` level to keep responses small.
Pagination guidance for 'locate' tool is present (offset/next_offset) but the schema does not show max result count or total count in return. Large symbol lists could exhaust context window without explicit caps stated in the description or schema.
Error handling strategy not visible in source. Tools accept enrolled repo names and must handle 'repo not found' errors, but recovery guidance (how to list available repos, how to enroll a new one) is not documented in tool descriptions or visible in handler implementation.