vex
MCPB · VEX-MCP-X86_64-UNKNOWN-LINUX-GNU.MCPB · 3 COMPONENTS
Local code search for agents: symbols, usages, call graph, AST patterns, grep and semantic search
Last scanned (8 hours ago)
Scores higher than 78% of MCPB servers
Category Code Search and Documentation
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security0
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
- Install-script risk not yet assessed.Unverified
- Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 17 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability62
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 14844 tokens (~530/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "eval" implies "eval" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities20
- Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28. See how to fix → Fail
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Nov 26 0
- Stability: 0.97 → pass security
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 20 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed mcpb/https://github.com/tenatarika/vex/releases/download/v1.28.0/vex-mcp-x86_64-unknown-linux-gnu.mcpb@1.28.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | mcpb |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
bundle ~719
Multi-source bundle — replaces 4 round-trips (show → callers → callees → similar) with 1. Three modes: `symbol` (body + callers + callees + similar for a named symbol; ~10ms), `pr-impact` (changed symbols + transitive callers + tests for a git base ref; ~50ms), `project` (top-N symbols by reverse call-graph indegree; ~5ms). Prefer over chaining find_symbol/show/callers/callees when you need cross-section context on one symbol or a PR. Mode-specific args are validated server-side; only `mode` is universally required. Response shape is uniform — `{ protocol_version, capabilities, _meta, results: { mode, items[], mode_hints } }`. Each `items[i]` carries 13.11 signals plus a `role` discriminator (`body | caller | callee | similar | changed | transitive_caller | test | top`). Scope filters (`include` / `exclude` / `exclude_tests`) apply only in `pr-impact` mode (changed files plus the caller and test rows); `symbol` and `project` modes ignore them.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap if missing, before running (default: true) |
| base | string | – | (mode: pr-impact) Git base revision to diff against (e.g. `origin/main`, `HEAD~3`, a SHA) |
| callees_max | integer | – | (mode: symbol) Max direct callees |
| callers_max | integer | – | (mode: symbol) Max direct callers |
| depth | integer | – | (mode: pr-impact) Transitive callers walk depth |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob (repeatable) |
| mode | string | yes | Bundle assembly mode |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| path_glob | string | – | (mode: project) Single path glob filter applied to ranked symbols (e.g. `src/**`); separate from the universal `include`/`exclude` arrays |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| similar_max | integer | – | (mode: symbol) Max semantic-similar matches; gated on `vex index --semantic` |
| symbol | string | – | (mode: symbol) Symbol name to resolve via the symbol FST |
| tests_max | integer | – | (mode: pr-impact) Max test-classified items |
| top_n | integer | – | (mode: project) Max number of top-ranked symbols |
No output schema declared.
No examples provided.
callees ~783
Direct callees of a function via the persistent call-graph FST (~4ms when indexed; falls back to live-scan). Prefer over Read+manual scanning when you want to know what a function calls without reading the whole body — callees gives the resolved outgoing edges as records. Phase 14.2 + 14.2.2 + 14.2.1: Python/Java decorators, Kotlin annotations, C# method/constructor attributes, TypeScript method decorators, and Rust outer attributes on fns/methods are surfaced as callees of the decorated function (decorator factories like `@lru_cache(maxsize=128)`, `@Inject`, `@Get("/x")`, or `#[tokio::test]` appear as the path-rightmost identifier `lru_cache` / `Inject` / `Get` / `test` alongside regular body calls). Rust `#[derive(...)]` is intentionally filtered. Supports diff scoping: `since` / `since_branched` / `changed_only` (mutually exclusive) to restrict callees to recently-touched code.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running — enables the call-graph fast path (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| symbol | string | yes | Exact function name — canonical key (v1.7+). |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
callers ~885
Direct callers of a function via the persistent call-graph FST (~4ms when indexed; falls back to live-scan). Prefer over grep for `who calls Foo?` — grep on the function name hits doc comments and string literals; the call-graph edges are resolved at parse time. Phase 14.2 + 14.2.2 + 14.2.1: Python/Java function/method decorators, Kotlin annotations / C# method+constructor attributes, and TypeScript method decorators / Rust outer attributes on fns/methods emit forward edges, so `callers GetMapping` lists every Spring handler, `callers get` lists every FastAPI route, `callers HttpGet` every ASP.NET action, `callers JvmStatic` every Kotlin function annotated `@JvmStatic`, `callers Get` every Nest.js `@Get(...)`, `callers test` every Rust `#[tokio::test]` (the rightmost identifier of the decorator/attribute path becomes the callee; arguments are ignored — `#[serde(rename = "x")]` → `serde`, not `rename`). Rust `#[derive(...)]` is filtered (compile-time codegen, not call edges). Note the rightmost-identifier convention means `callers get` mixes decorator handlers with any regular `.get()` call — narrow with `include`/`exclude` if needed. Pair with `paths` for multi-hop chains. Supports diff scoping: `since` / `since_branched` / `changed_only` (mutually exclusive) to restrict callers to recently-touched code.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running — enables the call-graph fast path (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| symbol | string | yes | Exact function name — canonical key (v1.7+). |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
capabilities ~19
Return vex protocol version + capability matrix for client capability negotiation.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
check ~334
Batch existence probe: confirm whether one or more symbol names exist in the index without paying for body extraction or ranked search (~4ms total). Use before show / usages / callers when working from an unverified list — skip the symbols that don't exist instead of letting downstream tools error.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| names | array | – | DEPRECATED — use `symbols`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| symbols | array | yes | Exact symbol names to probe — canonical key (v1.7+). |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
diff ~260
Symbol-level diff between a git revision and the working tree: lists added / removed / moved / body-changed symbols on the touched files. Prefer over `git diff` + manual scanning for PR review — git diff returns line hunks while this returns structured symbol records, so an agent can iterate over changed-functions directly instead of parsing unified-diff text.
| Name | Type | Req | Description |
|---|---|---|---|
| base | string | yes | Git revision to compare against (e.g. main, HEAD~3, origin/main). Working tree is the new side. |
| exclude | array | – | Blacklist changes by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist changes by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max changes to return |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
No output schema declared.
No examples provided.
duplicates ~638
Repo-wide near-duplicate scan: pairs of symbols whose embeddings exceed `threshold`. Use for refactor planning (`where else does this logic live?`) and dedup. Prefer over manual similar-walks — duplicates evaluates all pairs once with `min_body_lines` filtering out trivial bodies. Requires `vex index --semantic`. Supports diff scoping: `since` (rev), `since_branched`, `changed_only` (mutually exclusive) and `no_stale_check`.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| changed_only | boolean | – | Restrict pairs to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist pairs by path glob — a pair is dropped when either side matches (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| explain | boolean | – | Include reasoning per pair: identifier-set Jaccard overlap + truncated unified diff between the two bodies |
| filter_path | string | – | Substring path filter — keep pairs where at least one symbol's path contains this substring. Legacy alias: `filter`. |
| include | array | – | Whitelist pairs by path glob — a pair is kept when at least one side matches (repeatable) |
| limit | integer | – | Max pairs to return |
| min_body_lines | integer | – | Skip symbols with body shorter than this many lines (filters trivial wrappers) |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict pairs to files changed between `<rev>..HEAD`. Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict pairs to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| threshold | number | – | Minimum cosine similarity (0.0..1.0); 0.9 keeps only very close pairs |
| why | boolean | – | Surface a JSON trace under `_meta.why`: applied threshold + min_body_lines, pairs before/after path filter, filter snapshot. |
No output schema declared.
No examples provided.
eval ~254
Run the ranking-quality harness against a golden query set and return nDCG@10 / recall@10 / MRR per query and aggregated. Indexless in the sense that it never builds — consumes whatever index already lives at the project root (run `index` first if missing). Intended as a CI regression guard. MCP defaults to `json: true` so agents receive structured `EvalReport` JSON instead of the human-readable summary the CLI emits.
| Name | Type | Req | Description |
|---|---|---|---|
| bench | string | – | Path to the golden-set TOML. Defaults to the bundled `benches/ranking_golden/queries.toml` on the CLI side; pass this when running against a fixture. |
| json | boolean | – | Emit the EvalReport as JSON to stdout. Default `true` in MCP context (agents want structured output) — note the CLI default is `false`. Set explicitly to `false` to fall back to the human-readable su… |
| min_ndcg | number | – | Fail with non-zero exit if mean nDCG@10 drops below this floor. Default 0.0 (always succeed). CI pins a recorded floor. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
No output schema declared.
No examples provided.
find_similar ~369
Semantic-only search by natural-language description (e.g. 'payment processing' → ChargeUseCase, BillingService). Uses the HNSW vector index built by `vex index --semantic` (~7-15ms). Prefer over search when you do not know any concrete identifier and want concept-level matching; prefer search when you have a partial name (search fuses semantic + lexical channels for better recall on identifier-shaped queries).
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| query | string | yes | Natural-language description of the concept (not an identifier; use find_symbol for those). |
No output schema declared.
No examples provided.
find_symbol ~400
Resolve a symbol by exact name (with prefix fallback) against the FST inverted index (~4ms). Prefer over search when the symbol name is known and you want exactly that record back, not a fused-rank list. Prefer over grep for `git grep 'class Foo'`-style definition lookup — grep scans every byte; this is a constant-time index probe.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| symbol | string | yes | Exact symbol name (function/class/struct/etc.) — canonical key (v1.7+). Use search for partial or fuzzy names. |
No output schema declared.
No examples provided.
grep ~437
Regex content search across files (ripgrep-equivalent, no index needed). Use this for searching inside string literals, comments, config values, or any non-symbol text. Prefer search / find_symbol / usages for identifier lookups — those are index-backed (~4ms) while grep is a full-scan and returns raw line matches without symbol context.
| Name | Type | Req | Description |
|---|---|---|---|
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| filter_path | string | – | Substring path filter applied to result paths (single substring; use include/exclude for glob patterns). Legacy alias: `filter`. |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| pattern | string | yes | Regex pattern (Rust regex syntax) to match against file contents. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| text | boolean | – | Force-read every file, bypassing the binary-file skip (extension denylist + NUL/high-control content sniff). Escape hatch for a legitimately-textual file that got misclassified as binary; a genuinely… |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
history ~659
Every historical version of a symbol reachable from a chosen tip. With `vex index --history` previously run, queries hit a persistent FST sidecar (~ms); without it, shells out to `git log` (~seconds). Indexed mode also finds symbols whose name has been DELETED from HEAD — the walker can't. Use this to inspect how a function's body / signature changed over time, find when a bug was introduced, or recover a deleted symbol's last definition. NOTE: omitting `limit` returns the full history (walker mode is unbounded by default — set `limit` to cap latency on long-lived repos). `exact_presence: true` adds seconds-scale latency per file — only pass when you specifically need the exact commit set, not the convex-hull span. v1.20.0 (D5) surface — the CLI subcommand has existed since v1.15.0 but was MCP-invisible.
| Name | Type | Req | Description |
|---|---|---|---|
| author | string | – | Keep only entries whose commit author contains this substring (case-insensitive). Walker-only — the indexed path rejects this with an error pointing at `no_index: true`. |
| branch | string | – | Restrict the walk to this revision (`refs/heads/foo`, `origin/main`, a SHA). Defaults to `HEAD`. |
| depth | integer | – | Max commits to walk per file (walker mode). Unbounded by default; bump down on long-lived repos to keep latency in check. |
| diff | boolean | – | Render unified diffs between consecutive historical versions of the same `(symbol, kind)` pair instead of repeating the full body for each entry. Cuts output noise on deep histories. Mutually exclusi… |
| exact_presence | boolean | – | For each entry, list the exact set of commits where its blob lived in the file. Defeats the convex-hull span representation (LIMITATIONS §4c #4). Adds latency. |
| kind | string | – | Keep only entries whose symbol kind matches exactly (lowercase: `function` / `struct` / `impl` / …). |
| limit | integer | – | Cap the total result set. Omit for unbounded (walker mode) — set explicitly on long-lived repos to keep latency in check. The walker stops as soon as the limit is reached. |
| name | string | – | DEPRECATED alias for `symbol`; still accepted, emits a deprecated_args notice in _meta. |
| no_index | boolean | – | Force the v1.16 query-time walker even when a `git_history` section is present. Default (`HistoryMode::Auto`) picks the indexed path when available and falls back to the walker otherwise. Use for reg… |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Keep only entries whose commit date is `>= YYYY-MM-DD` (inclusive). |
| symbol | string | yes | Symbol name to walk through history. Matched whole-word via `git grep --word-regexp`, then filtered post-parse to exact `name == query`. |
| until | string | – | Keep only entries whose commit date is `<= YYYY-MM-DD` (inclusive). |
No output schema declared.
No examples provided.
impact ~812
Delete-safety blast-radius report. Composes four independent reference channels — strict refs (binder-resolved v5 edges), the legacy FST refs, `grep \b<Name>\b` against the project, and direct call-graph callers — into a single verdict (`safe` / `unsafe` / `uncertain`). Use this BEFORE proposing to delete or rename a symbol; one call collapses what CLAUDE.md previously documented as a manual dance across usages → grep → callers. Verdict rule: `unsafe` if strict_refs > 0 OR call_graph_callers > 0 (binder/graph confirmed real usage); `uncertain` if only text channels (FST / grep) hit (likely string-dispatch / decorator / comment mentions); `safe` only when every channel reports zero hits. `results` shape: { symbol, verdict, verdict_explanation, channels: { strict_refs, fst_refs, grep_word_boundary, call_graph_callers } } where each channel block has { available, count, sample[], truncated }.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| depth | integer | – | (v1.21.0) BFS hop budget for transitive callers. `1` (default) reports direct callers only via `call_graph_callers`; `>= 2` enables the `transitive_callers` channel, walking the call graph backward u… |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable). |
| exclude_docs | boolean | – | (v1.20.1, D4 parity) Opt-in: drop text-channel hits in prose-format files (`*.md`/`*.markdown`/`*.txt`/`*.rst`/`*.adoc`). Default off so a symbol mentioned only in CHANGELOG still yields `uncertain`;… |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable). Applied to every channel — useful for scoping to e.g. `src/**` when assessing a library symbol. |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| symbol | string | yes | Exact symbol name to assess — canonical key. |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
implementations ~564
Find every concrete type that extends a base class / implements a trait / interface. Walks the indexed inheritance edges (covers generic-parameterised bases). Prefer over grep for `find all subclasses of Foo` — grep misses `: Foo<T>`, indirect inheritance, and trait impls; this resolves the real hierarchy. Supports diff scoping: `since` / `since_branched` / `changed_only` (mutually exclusive) to restrict to recently-touched code.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| symbol | string | yes | Exact name of the base class / trait / interface — canonical key (v1.7+). |
No output schema declared.
No examples provided.
index ~301
Build or rebuild the vex index from scratch. Run once per project; use `update` afterward for incremental refreshes. Set semantic=true to also generate embeddings (slower; required for find_similar / similar / duplicates).
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | – | Advanced: pin a specific embedding execution provider (cpu | auto | cuda | directml | coreml). Mutually exclusive with `gpu`. |
| gpu | boolean | – | Use the GPU for embedding generation if this vex build supports it (DirectML on Windows / CoreML on macOS prebuilts; CUDA via source build), with silent CPU fallback. Only speeds up cold/large semant… |
| project_root | string | yes | Absolute path to the project root to index |
| semantic | boolean | – | Also generate per-symbol embeddings (enables semantic search / similar / duplicates; adds ~30-90s on a medium repo) |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
modules ~707
De-facto modules: clusters of symbols that call/reference each other (deterministic Leiden-CPM over call + ref + hierarchy edges, computed on full `vex index`). Without `symbol`: list clusters with a label (dominant path prefix; a bare file path when the cluster is a single file), size, cohesion and hub symbols. With `symbol`: that symbol's cluster and its members (`limit` caps the matching symbols). Use for `what are the modules` / `which module is X in` instead of reading directory listings. Requires a v9 index built by `vex index`; after `vex update` clusters are frozen and flagged `stale`. Returns an empty result with `empty_reason` and a hint on older indexes or when built with `--no-clusters`. Cluster ids are stable only within one full-index generation: do not persist them across `vex index` runs.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| exclude | array | – | Blacklist members by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist members by path glob, gitignore syntax (repeatable). A cluster is shown iff at least one member is in scope. |
| limit | integer | – | Max clusters to list, or max matching symbols when `symbol` is given (per repo with `workspace`). Must be at least 1. |
| members | integer | – | Members to list per cluster, ordered by path then line (default: 0 when listing, 25 for a `symbol` lookup). Must be in `[0, 10000]`. |
| min_size | integer | – | Hide clusters with fewer in-scope symbols than this. List mode only; ignored when `symbol` is given. Must be in `[1, 1000000]`. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| sort | string | – | Order clusters by in-scope size or by cohesion; ties by cluster id. |
| symbol | string | – | Symbol whose cluster to show. Omit to list all clusters. |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
outline ~151
List every symbol (kind + line range) in a single source file via cached tree-sitter parse. Prefer over Read when you only need the file's structure (what's in here?) rather than the full byte stream — outline returns ~50 lines of structured records vs reading thousands of lines of source.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | DEPRECATED — use `path`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| path | string | yes | Filesystem path to the source file — canonical key (v1.7+). Absolute or relative to project_root. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
No output schema declared.
No examples provided.
paths ~411
Enumerate every caller chain from `from` to `to` in the persistent call graph (multi-hop, max 6 by default). Prefer over repeated `callers` calls when you need to know how a function gets reached from a known entry point — paths walks the edges itself in a single response. Requires a v4 index with call graph (built without `--no-call-graph`).
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| exclude | array | – | Blacklist intermediate steps by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| from | string | yes | Exact name of the starting function (caller / entry point). |
| include | array | – | Whitelist intermediate steps by path glob, gitignore syntax (repeatable) |
| max_hops | integer | – | Maximum hops between from and to |
| max_paths | integer | – | Maximum paths to enumerate (caps output, aborts traversal early) |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| to | string | yes | Exact name of the destination function (callee being investigated). |
No output schema declared.
No examples provided.
pattern ~644
Structural AST pattern matching: match code by shape, not text. Metavars: `$NAME` captures an identifier or balanced expression, `$_` is a wildcard, `$$$` is an anonymous ellipsis, `$$$NAME` / `$$NAME` is a named ellipsis that captures multi-line bodies or arg lists, repeated metavars enforce back-reference equality. Composition: space-flanked ` && ` and ` || ` join sub-patterns (AND requires both shapes in the file with shared captures agreeing; OR takes the union). Prefer over grep / ast-grep for cross-language structural queries — grep cannot match nested syntax, and ast-grep needs per-language scripts; vex pattern works on the cached tree-sitter parse with a skeleton prefilter (~10-50ms). Set `why: true` to inspect indexed vs live-scan mode. Supports diff scoping: `since` (rev), `since_branched` (since this branch diverged from main), `changed_only` (working-tree changes) — mutually exclusive.
| Name | Type | Req | Description |
|---|---|---|---|
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| lang | string | yes | Language: rust, python, typescript, go, java, csharp, ruby, kotlin, swift, cpp, php, sql, markdown |
| limit | integer | – | Max matches to return |
| pattern | string | yes | Structural pattern with $METAVARS (e.g. `fn $NAME($$ARGS) -> Result<$T, $E> { $$$BODY }`, `interface $N || class $N`). NOT regex — see grep for regex. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| why | boolean | – | Surface a ScanTrace under `_meta.why` in the response: mode (indexed/live_scan), root_kind_inferred, candidate_files / total_files, fallback_reason. |
No output schema declared.
No examples provided.
reachable ~439
Every symbol that transitively calls `target` (the full upstream blast radius). Prefer over repeated `callers` walks when assessing the impact of changing a function — reachable does the closure in one call. Requires a v4 index with call graph.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| max_hops | integer | – | Maximum hops to walk back from target |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| target | string | yes | Exact symbol name whose callers (direct + transitive) you want. |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
search ~1,165
Hybrid structural + semantic code search across the indexed codebase. Fuses FST exact + BM25 + semantic channels in a single ranked list (~4ms FST hit, ~7-15ms with semantic). Prefer over grep for symbol or identifier lookup — grep does a full-scan (seconds on large repos) and returns line matches; this returns ranked symbol records with kind, signature, and line ranges. Use this when you need to find a definition by name, signature shape, or meaning rather than guessing a regex. Supports `filter` (substring path filter), `kind` (kind-boost / restrict), `context_path` (proximity hint), `no_bm25` (disable BM25 channel), and `no_stale_check` (skip pre-call staleness probe).
| Name | Type | Req | Description |
|---|---|---|---|
| async_only | boolean | – | Keep only async/suspend functions |
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| code_only | boolean | – | (v1.20.0 D4) Drop results in prose-format files (`*.md`/`*.markdown`/`*.txt`/`*.rst`/`*.adoc`). Default off so 'README' still finds the README; pass for code-intent queries where CHANGELOG/README hea… |
| context_path | string | – | Boost results near this file path (e.g. the agent's current editor file). |
| exclude | array | – | Blacklist results by path glob (wins over include); repeat for multiple globs |
| exclude_generated | boolean | – | Drop machine-generated files (protobuf stubs, sqlc output, bindgen bindings, ORM schemas) from the results, recognised from the generator's header banner. Pass on repos that check in generated code,… |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| filter_path | string | – | Substring path filter applied to result paths (single substring; use include/exclude for glob patterns). Legacy alias: `filter`. |
| include | array | – | Whitelist results by path glob, gitignore syntax (e.g. 'tests/**'); repeat for multiple globs |
| kind | array | – | Boost results matching one or more kinds (repeatable). Canonical names (function, struct, class, …) plus aliases: def, comment, test, ref. |
| limit | integer | – | Max results |
| no_async | boolean | – | Exclude async/suspend functions |
| no_bm25 | boolean | – | Disable the BM25 channel for this query (auto-on when the index has BM25 data otherwise). |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true (which already refreshes). |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| query | string | yes | Free-text query: symbol name, partial name, signature snippet, or natural-language description. Not for regex (use grep) or exact-only resolution (use find_symbol). |
| sealed_only | boolean | – | Keep only sealed (or Java-`final`) types |
| semantic | boolean | – | Enable the semantic vector channel (requires `vex index --semantic`); adds ~3-10ms but lets natural-language queries hit |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| static_only | boolean | – | Keep only static class members |
| visibility | string | – | Keep only symbols whose signature contains this explicit visibility keyword (no inferred defaults) |
| why | boolean | – | Surface a JSON trace under `_meta.why` in the response: normalized query, per-channel hits (FST/BM25/semantic/fuzzy), filter_applied snapshot |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
show ~764
Extract the full source body of one or more symbols by name (function, class, struct, etc.) using cached symbol byte-offsets (~4ms per symbol). Prefer over Read when you need a specific definition — show returns just that body, while Read pulls the entire file (often 10-100x more tokens). Accepts an array, so a single call replaces several Read calls. Phase 13.3 truncation: `signature_only` (signature line only), `head` (first N body lines), `no_body` (signature + leading doc only), `collapsed` (collapse nested methods — v1.9 NO-OP). Also supports `filter` (substring path filter), `kind` (kind-restrict), `context_path` (proximity hint), and `no_stale_check`.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| collapsed | boolean | – | Phase 13.3: collapse nested methods inside a class/impl/module. v1.9 NO-OP (flag-shape stable; emits a stderr warning). Mutually exclusive with `signature_only`, `head`, `no_body`. |
| context_path | string | – | Boost results near this file path (e.g. the agent's current editor file). |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| filter_path | string | – | Substring path filter applied to result paths (single substring; use include/exclude for glob patterns). Legacy alias: `filter`. |
| head | integer | – | Phase 13.3: print only the first N body lines and append `... (M more lines)`. Mutually exclusive with `signature_only`, `no_body`, `collapsed`. |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| kind | array | – | Boost results matching one or more kinds (repeatable). Same vocabulary as `search.kind`. |
| limit | integer | – | Max bodies returned per symbol name (handles overloads / duplicates) |
| no_body | boolean | – | Phase 13.3: print signature + leading docstring only; drop the body. Mutually exclusive with `signature_only`, `head`, `collapsed`. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| signature_only | boolean | – | Phase 13.3: print only the signature line(s). Mutually exclusive with `head`, `no_body`, `collapsed`. |
| symbol | string | – | DEPRECATED — use `symbols: [name]`. Pre-v1.7 singular alias, still accepted; emits a deprecated_args notice in _meta. |
| symbols | array | yes | Exact symbol names to extract — canonical key (v1.7+). Pass the array form even for a single symbol. |
No output schema declared.
No examples provided.
similar ~673
Nearest neighbours of an EXISTING symbol by its stored embedding (HNSW lookup, ~7-15ms). Distinct from find_similar (which embeds a free-text query). Use this when you have a function in hand and want `what else in this repo looks like it?` — useful for dedup, refactor planning, and finding parallel implementations. Requires `vex index --semantic`. Supports diff scoping: `since` (rev), `since_branched`, `changed_only` (mutually exclusive) and `no_stale_check`.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| explain | boolean | – | Include reasoning per match: identifier-set Jaccard overlap + truncated unified diff between bodies |
| filter_path | string | – | Substring path filter applied to result paths (single substring; use include/exclude for glob patterns). Legacy alias: `filter`. |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD`. Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| symbol | string | yes | Exact name of an existing indexed symbol to use as the seed — canonical key (v1.7+). |
| threshold | number | – | Minimum cosine similarity (0.0..1.0); raise to tighten matches |
| why | boolean | – | Surface a JSON trace under `_meta.why`: seed resolution, applied threshold, candidates before/after path filter, filter snapshot. |
No output schema declared.
No examples provided.
status ~60
Report index statistics: symbol count, byte size, embedding presence, last-update timestamp. Use to confirm an index exists and is fresh before running search-shaped tools.
| Name | Type | Req | Description |
|---|---|---|---|
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
No output schema declared.
No examples provided.
subtypes ~639
Find every TRANSITIVE subtype of a base class / interface — the full descendant tree via extends/implements edges (not just direct implementations; use `implementations` for direct-only). Requires a v8+ index with hierarchy edges (no live-walk fallback) — if the index predates this feature or has no hierarchy section, this returns an empty result with a hint to re-run `vex index`. Supports diff scoping: `since` / `since_branched` / `changed_only` (mutually exclusive) to restrict to recently-touched code.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| depth | integer | – | Max BFS hops (transitive descent) from the queried type. Bounds how many inheritance levels deep the search goes; independent of the mandatory cycle-detection guard. Must be in `[1, 4096]` (64 is a g… |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| limit | integer | – | Max results |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| symbol | string | yes | Exact name of the base class / trait / interface — canonical key. |
No output schema declared.
No examples provided.
tests_for ~480
Find test functions that transitively cover a target symbol (Phase 13.10). Walks the call graph backwards from `<target>`, keeps rows under recognized test-path globs (Rust / Python / TS-JS / Go / Java / Kotlin / C# / C++), stamps each row with a `framework` label (`pytest`, `jest`, `go-test`, …) so an agent can pick the right runner without parsing paths. Prefer over grep `test.*Foo` — that misses transitively-covered helpers and produces lots of false positives. v1.20.0 (D5) surface — the CLI subcommand exists since v1.19.0 but was MCP-invisible.
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| include_fixtures | boolean | – | Admit non-test-named helpers (fixtures) under test paths via a one-hop forward callee walk. Default off — only `test_*` / `*Test` names surface. |
| limit | integer | – | Max results to return. |
| max_hops | integer | – | Maximum reverse-call-graph hops from `target`. Default 6. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| symbol | string | – | DEPRECATED alias for `target`; still accepted, emits a deprecated_args notice in _meta. |
| target | string | yes | Symbol whose test coverage to find — the function/method/class you want to know is tested. |
| test_pattern | array | – | Glob patterns for test paths (repeatable). When set, REPLACES the default pattern set (does NOT append) — pass the full set you want. |
No output schema declared.
No examples provided.
update ~278
Incremental index refresh: only re-parses files whose mtime changed since the last index. Prefer over `index` when an index already exists — typically <1s on small change sets vs full rebuild cost. Most other tools default to auto_update=true and call this implicitly.
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | – | Advanced: pin a specific embedding execution provider (cpu | auto | cuda | directml | coreml). Mutually exclusive with `gpu`. |
| gpu | boolean | – | Use the GPU for embedding generation if this vex build supports it, with silent CPU fallback. Mostly a no-op for incremental updates (few/zero embeddings recomputed). Omit to let .vex.toml gpu/device… |
| project_root | string | yes | Absolute path to the project root whose index should be refreshed |
| semantic | boolean | – | Also refresh embeddings for changed files |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
usages ~999
Find every reference to a symbol across the codebase. Prefer over grep for refactor-style `find all callers` queries — grep on a common identifier returns string-literal and comment noise; usages with strict=true uses the scope-binder to resolve real cross-file refs (Rust/TypeScript/Python/C#/C++). Without strict, runs the legacy refs FST (~4ms) — v1.20.0 also strips the row at the symbol's own definition line and prose mentions in `*.md`/`*.markdown`/`*.txt`/`*.rst`/`*.adoc` (override with `include_self` / `include_docs`).
| Name | Type | Req | Description |
|---|---|---|---|
| async_update | boolean | – | With auto_update, refresh a stale index in the background instead of waiting for it: results come from the index already on disk and _meta.vex.dev/stale says so (default: false) |
| auto_update | boolean | – | Auto-update the index if stale, or bootstrap it if missing, before running (default: true) |
| changed_only | boolean | – | Restrict results to working-tree changes (staged + unstaged + untracked). Mutually exclusive with `since` and `since_branched`. |
| exclude | array | – | Blacklist results by path glob; wins over include (repeatable) |
| exclude_tests | boolean | – | Drop test files from the results (tests/ dirs, *_test.*, test_*.py, *.spec.ts, __tests__/, tests.rs, ...; same set as tests_for). Composes with include/exclude. Path-based only: Rust unit tests insid… |
| filter_path | string | – | Substring path filter applied to result paths (single substring; use include/exclude for glob patterns). Legacy alias: `filter`. |
| include | array | – | Whitelist results by path glob, gitignore syntax (repeatable) |
| include_docs | boolean | – | (non-strict only) Keep matches in `*.md` / `*.markdown` / `*.txt` / `*.rst` / `*.adoc` files. v1.20.0+ strips them by default — README/CHANGELOG mentions of a symbol are prose, not callers. No-op whe… |
| include_self | boolean | – | (non-strict only) Keep the row at the symbol's own definition line. v1.20.0+ strips it by default — `find all callers` queries don't want the declaration showing up as a usage. No-op when `strict=tru… |
| limit | integer | – | Max results |
| name | string | – | DEPRECATED — use `symbol`. Pre-v1.7 alias, still accepted; emits a deprecated_args notice in _meta. |
| no_stale_check | boolean | – | Skip the staleness check that runs before each call; assumes the index is fresh. Redundant when `auto_update` is true. |
| project_root | string | – | Absolute path to the project root (defaults to the MCP working directory) |
| since | string | – | Restrict results to files changed between `<rev>..HEAD` (accepts anything `git diff` understands: `main`, `HEAD~3`, `origin/main`, SHA). Mutually exclusive with `since_branched` and `changed_only`. |
| since_branched | boolean | – | Restrict results to files changed since this branch diverged from `origin/main` (or `main`/`master`). Mutually exclusive with `since` and `changed_only`. |
| strict | boolean | – | Use scope-resolved (type-aware) references from the binder — drops string-literal/comment/wrong-scope noise. Recommended for refactor work; falls back to legacy refs FST on languages without binder s… |
| symbol | string | yes | Exact symbol name to find references to — canonical key (v1.7+). |
| why | boolean | – | Surface a JSON trace under `_meta.why`: mode (strict/fst_lookup), mode_legacy (back-compat alias for v1.9.x consumers, removed in v1.12), hits before/after path filter, prefix-suggestion count when n… |
| workspace | boolean | – | Multi-repo: fan out across every repo declared in the nearest `.vex-workspace.toml` (set `project_root` at or above it — the manifest is found by walking up). Results become an object `{workspace, re… |
No output schema declared.
No examples provided.
How do I install the vex MCP server?
vex ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 58b85689adb781d16d63c0672d0a29b7b56c412e6ef693b4bce3d3b7d5d8352d; the commands to do that are on this page. If it does not match, do not open it.
mcpb · vex-mcp-x86_64-unknown-linux-gnu.mcpb
Download bundleCheck the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.
SHA-256
58b85689adb781d16d63c0672d0a29b7b56c412e6ef693b4bce3d3b7d5d8352d
macOS / Linux
echo "58b85689adb781d16d63c0672d0a29b7b56c412e6ef693b4bce3d3b7d5d8352d vex-mcp-x86_64-unknown-linux-gnu.mcpb" | shasum -a 256 -c
Windows (PowerShell)
(Get-FileHash -Algorithm SHA256 .\vex-mcp-x86_64-unknown-linux-gnu.mcpb).Hash -eq "58b85689adb781d16d63c0672d0a29b7b56c412e6ef693b4bce3d3b7d5d8352d"
Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.
What is the vex MCP server?
vex is an MCP server listed in the public MCP registry as io.github.tenatarika/vex. Local code search for agents: symbols, usages, call graph, AST patterns, grep and semantic search. This page covers its MCPB bundle (https://github.com/tenatarika/vex/releases/download/v1.28.0/vex-mcp-x86_64-unknown-linux-gnu.mcpb).
Is the vex MCP server safe to use?
vex scores 48 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the vex MCP server expose?
vex exposes 28 tools: search, find_symbol, find_similar, outline, index, and 23 more. Their descriptions and schemas cost roughly 14,844 tokens of context every time the server is loaded.
What licence is the vex MCP server under?
vex declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.