Skip to content

Quickstart

jarvis gives your coding agent structural code intelligence — go-to-definition, find-references, call/type hierarchy, and search — computed locally from your own repositories, so it can ask who calls this? or where is this defined? instead of guessing from grep. Everything runs on your machine (macOS or Linux); nothing is uploaded.

Before you install, check your language is supported — navigation tools cover four language families, and every other language gets search only.

Choose your install path:

setup.sh installs the SCIP fork, Zoekt, and the language indexers into ~/.jarvis/bin:

Terminal window
curl -fsSL https://raw.githubusercontent.com/jarvis-intelligence/jarvis-index/main/setup.sh | sh

setup.sh is idempotent — re-running it skips whatever is already installed. Use --force to reinstall everything, or --only <name> to retry one dependency.

setup.sh installs the SCIP fork, Zoekt, and the language indexers into ~/.jarvis/bin:

Terminal window
curl -fsSL https://raw.githubusercontent.com/jarvis-intelligence/jarvis-index/main/setup.sh | sh

setup.sh is idempotent — re-running it skips whatever is already installed. Use --force to reinstall everything, or --only <name> to retry one dependency.

You’ll know it works when…

summary
scip ok
zoekt ok
scip-swift ok
scip-typescript ok
scip-python ok
scip-java ok

You’ll know it broke when…

summary
scip FAILED
zoekt ok
scip-swift ok
scip-typescript ok
scip-python ok
scip-java ok

Re-run just the failed dependency: sh ./setup.sh --only scip --force. If a binary installs but your shell still can’t find it, that’s a PATH issue — see PATH troubleshooting.

Terminal window
uv tool install --python 3.13 jarvis-mcp

The --python 3.13 pin is deliberate: on a machine with no Python at all, uv tool install fetches its own interpreter and can resolve an older jarvis-mcp for it (observed: 0.5.1 on a fresh 3.12-only environment — below the >=0.6.0 registration floor). Pinning 3.13 always resolves the current release.

This puts jarvis and jarvis-server on PATH, and it’s also the fix for the uvx cold-start timeout you’d otherwise hit in Step 4 — uv tool install builds and caches the wheel once, so later uvx calls start in seconds.

See the Install guide for alternatives (pip, uvx ad-hoc).

You’ll know it works when…

Terminal window
$ jarvis --help
usage: jarvis [-h] {index,list,status,reindex,forget,watch} ...
$ command -v jarvis-server
/Users/you/.local/bin/jarvis-server

You’ll know it broke when…

Terminal window
$ jarvis --help
zsh: command not found: jarvis

~/.jarvis/binor uv's tool bin directory isn't onPATH` yet — see PATH troubleshooting.

Terminal window
jarvis index /path/to/your/repo

The slug defaults to the directory name. Re-running jarvis index (or jarvis reindex <slug>) against the same repo always re-indexes and republishes atomically — safe to run again any time.

You’ll know it works when…

Terminal window
$ jarvis status <slug>
:indexed

You’ll know it broke when…

jarvis index: error: installed scip 0.8.3 is below the required 0.9.0 — refusing to publish
a zero-chunk index

Below scip 0.9.0, the converter silently writes a schema-valid database with zero chunks and zero mentions — see the scip version-gate entry.

Terminal window
/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Full guide: Claude Code.

Registering jarvis in several clients at once is safe — the stdio transport means each client launches its own jarvis-server process, so there’s no shared state to race on.

You’ll know it works when…

Your client lists the jarvis tools (9 tools) after connecting.

You’ll know it broke when…

The first connect times out. On a cold uv cache and a platform without a prebuilt wheel (macOS and common Linux glibc platforms have wheels — anything else builds jarvis-mcp’s Rust extension from source, 5+ minutes) — see the uvx cold-start entry (Step 2’s uv tool install is the fix).

Ask your agent to call getIndexStatus:

{ "repo": "toy-repo" }

You’ll know it works when…

{
"repo": "toy-repo",
"indexed": true,
"status": "indexed",
"commit": "abc1234",
"generated_at": "2026-07-08T12:00:00+00:00",
"stale": false,
"freshness": "fresh",
"checked_at": "2026-07-08T12:00:05+00:00",
"searchCoverage": { "expected": 120, "indexed": 120, "complete": true },
"last_index_run": {
"outcome": "indexed",
"origin": "signature",
"reason": null,
"recovery": null
},
"capabilities": {
"navigation": { "available": true, "reason": null, "recovery": null },
"search": { "available": true, "reason": null },
"semantic": { "available": false, "reason": "semantic index not built for this repo (requires the `semantic` extra)" }
}
}

Then try a real navigation query — goToDefinition:

{ "repo": "toy-repo", "symbol": "Greeter" }
{
"symbol": "Greeter",
"resolvedSymbol": "scip-typescript npm @toy/pkg 0.0.1 src/`greeter.ts`/Greeter#",
"definitions": [
{
"path": "toy/greeter.ts",
"range": { "start": { "line": 0, "character": 6 }, "end": { "line": 0, "character": 13 } }
}
],
"commit": "abc1234",
"generated_at": "2026-07-08T12:00:00+00:00",
"stale": false,
"freshness": "fresh",
"checked_at": "2026-07-08T12:00:05+00:00"
}

You’ll know it broke when…

If symbol is ambiguous, you get a structured candidates list instead of a definition:

{
"error": "'dup' is ambiguous in toy-repo (2 matches). Retry with a qualifier, e.g. 'a.C.dup'.",
"candidates": [
{ "symbol": "sym-a", "dottedPath": "a.C.dup", "kind": "METHOD" },
{ "symbol": "sym-b", "dottedPath": "b.D.dup", "kind": "METHOD" }
],
"candidateTotal": 2
}

Retry with a qualified name from candidates (e.g. a.C.dup). For anything else, work through the troubleshooting decision tree.

This is a real cold-install run recorded on a fresh, isolated environment (fresh HOME, prerequisites-only PATH), following exactly the steps above — setup.sh, the pinned uv tool install, indexing a tiny repo, and the first getIndexStatus tool call over stdio JSON-RPC. Timings are wall-clock, not edited.

  • Tools — the 9 MCP tools
  • CLI — the jarvis indexer CLI
  • Install Channels — PyPI, plugins, and the MCP Registry compared
  • Concepts — how indexing and search actually work