Verdict: 55% — 8 MCP tools are exposed (3 of them graph-aware, added in phase 2) and 11 CLI commands are registered. The parity table below shows where each MCP tool maps to a CLI subcommand and where the gap is. The remaining 45% is the 4 MCP-only tools (
vec_read_lines,vec_find_callers,vec_find_dependents,vec_trace_imports), the cross-workspace aggregation invec_status(MCP-only), and therouting=autoheuristic that chooses dense vs. graph per query (MCP-only).
VectorCode ships an MCP server and a CLI; the two are not full peers. The MCP surface is the rich one: 8 tools (vec_search, vec_status, vec_reindex, vec_read_lines, vec_outline, vec_find_callers, vec_find_dependents, vec_trace_imports) defined in src/mcp/handler.rs. The CLI surface is broader on orchestration (init, install, uninstall, upgrade, benchmark, bench-store) and narrower on read operations. There is no vec_read_lines CLI subcommand, no vec_find_* CLI subcommand, and no vec_trace_imports CLI subcommand — graph-aware and snippet-aware reads are MCP-only. Multi-workspace users get a cross-workspace vec_status only via MCP (src/mcp/handler.rs:367 aggregates AppInnerState across all workspaces); the CLI vectorcode status is per-project. The routing=auto heuristic that picks dense vs. graph per query lives in the MCP path (src/engine/router.rs); CLI users must force --mode graph explicitly.
- 8 MCP tools —
src/mcp/handler.rs:179vec_search,:367vec_status,:409vec_reindex,:480vec_read_lines,:540vec_outline,:600vec_find_callers,:643vec_find_dependents,:690vec_trace_imports. - 11 CLI subcommands —
src/cli/mod.rs:50-73(theCommandsenum):init,index,search,outline,status,serve,install,uninstall,upgrade,benchmark,bench-store. - MCP↔CLI parity table — see below.
- Cross-workspace
vec_status—src/mcp/handler.rs:367aggregates acrossAppInnerStatefor every entry instate.workspaces. The CLIvectorcode statusresolves one project root viasrc/cli/mod.rs:103-129and never sees the multi-workspace map. routing=autoheuristic —src/engine/router.rsexists and is used by the MCPvec_searchpath. CLI users can--mode graph | dense | sparse | hybrid | hybrid-rerank(persrc/cli/mod.rs:111-114in the README usage block) but cannot delegate the choice to the engine.
| MCP tool | CLI equivalent | Notes |
|---|---|---|
vec_search |
vectorcode search |
Full parity (CLI supports --mode, --limit, --threshold, …). |
vec_status |
vectorcode status |
CLI is per-project; MCP aggregates across workspaces. |
vec_reindex |
vectorcode index --full |
Flag, not a subcommand. CLI also has vectorcode index (incremental). |
vec_outline |
vectorcode outline <file> |
Full parity. |
vec_read_lines |
none | MCP-only. CLI has no read_lines subcommand. |
vec_find_callers |
none | MCP-only. CLI has no find_callers subcommand. |
vec_find_dependents |
none | MCP-only. |
vec_trace_imports |
none | MCP-only. |
- 4 MCP tools have no CLI equivalent —
vec_read_lines,vec_find_callers,vec_find_dependents,vec_trace_imports. A user who wants to script a graph traversal or read a 50-line snippet from the shell cannot do it without an MCP client. - Cross-workspace status is MCP-only — multi-repo users (the fase-3 deliverable) get the cross-workspace view only via MCP. The CLI
vectorcode statusis single-root. routing=autois MCP-only — the engine knows when a question is structural ("who calls X?") vs. conceptual ("where is auth handled?"), but the CLI forces the user to pick. The CLI does not have a--mode autoflag.- MCP
vec_statusschema is JSON-string-typed — it returns aString(JSON-encoded) rather than a structured response. Agents parse it manually. The 8 tools have the same shape; this is a constraint of thermcpmacro shape. - No streaming in MCP — long searches block until done. A streaming
vec_searchis a non-trivial addition.
- docs/benchmarks.md — the bench harness exercises the same code path the CLI uses (
cargo run -- benchmark), independent of MCP. - ADR-0001 — the
Storeport makes both the CLI and the MCP server share the same hot path. - Related: P3 (the 3 graph tools come from P3's graph port) · P5 (the
SearchStrategyport makes the CLI↔MCP parity trivial in principle).