Satori gives coding agents repo-aware retrieval through a fixed six-tool MCP surface: index lifecycle, semantic search, symbol outlines, exact reads, and bounded call-graph context.
Satori runs as an MCP server. The easiest path is the CLI installer: it writes managed client config and copies the first-party workflow skills without adding new MCP tools.
npx -y @zokizuan/satori-cli@0.2.0 install --client codex
Writes the Satori MCP entry to ~/.codex/config.toml
and installs Satori skills in ~/.codex/skills.
npx -y @zokizuan/satori-cli@0.2.0 install --client claude
Writes the Satori MCP entry to
~/.claude/settings.json and installs Satori skills
in ~/.claude/skills.
Use --client all to install both clients, and
uninstall with the same selector to remove only
Satori-managed config and skills.
For JSON-style clients, point the MCP server at the published
package through npx. Keep the startup timeout long
enough for first-run package resolution.
{
"mcpServers": {
"satori": {
"command": "npx",
"args": ["-y", "@zokizuan/satori-mcp@4.8.0"],
"timeout": 180000,
"env": {
"EMBEDDING_PROVIDER": "VoyageAI",
"EMBEDDING_MODEL": "voyage-4-large",
"EMBEDDING_OUTPUT_DIMENSION": "1024",
"VOYAGEAI_API_KEY": "your-api-key",
"VOYAGEAI_RERANKER_MODEL": "rerank-2.5",
"MILVUS_ADDRESS": "your-milvus-endpoint",
"MILVUS_TOKEN": "your-milvus-token"
}
}
}
}
~/.codex/config.toml.~/.codex/skills.~/.claude/settings.json.~/.claude/skills.The installer refuses to overwrite unmanaged Satori entries. If you already have one, remove or align it before rerunning install.
Configure the embedding provider and vector backend before indexing. Those values are part of the index fingerprint, so changing provider, model, dimension, or vector-store schema later requires a reindex.
EMBEDDING_PROVIDER=VoyageAI
EMBEDDING_MODEL=voyage-4-large
EMBEDDING_OUTPUT_DIMENSION=1024
VOYAGEAI_API_KEY=your-api-key
VOYAGEAI_RERANKER_MODEL=rerank-2.5
MILVUS_ADDRESS=your-milvus-endpoint
MILVUS_TOKEN=your-milvus-token
This is the recommended first path for quality: VoyageAI embeddings plus Milvus or Zilliz for vector storage.
EMBEDDING_PROVIDER=Ollama
EMBEDDING_MODEL=nomic-embed-text
OLLAMA_HOST=http://127.0.0.1:11434
MILVUS_ADDRESS=localhost:19530
MILVUS_TOKEN=your-token
Use this path when you want local embeddings. Keep model and dimension stable for any repo you have already indexed.
Satori only returns repo context after a codebase has been indexed. Start with one absolute repository path, confirm it appears in the codebase list, then search with runtime-first defaults.
Run list_codebases in your MCP client to verify the
server starts and can see its local state.
Run
manage_index action="create" path="/absolute/path/to/repo".
Use the repository root for the first index unless you have a
specific subdirectory workflow.
Run
search_codebase path="/absolute/path/to/repo" query="authentication flow".
Defaults are scope=runtime,
resultMode=grouped, and
groupBy=symbol.
Use file_outline, call_graph, and
read_file to lock exact spans before editing.
The default agent path is intentionally narrow. Search finds candidate symbols, outline locks deterministic spans, call graph adds nearby relationships, and exact reads provide edit context.
Use search_codebase with the user requested path.
Default scope is runtime, grouped by symbol, with changed-file
awareness when the repository supports it.
Use file_outline to lock symbol spans before reading
or editing. Exact mode reports ambiguity instead of guessing.
Use call_graph with the returned
callGraphHint.symbolRef. Treat the output as graph
context, not a complete impact guarantee.
Use read_file with open_symbol or the
returned navigation fallback. Reads are bounded and return
continuation hints when truncated.
If a tool returns requires_reindex, run
manage_index(action="reindex") for the hinted path
before retrying the original call.
Satori keeps the public MCP surface fixed. Diagnostics are added through existing tools, not through new product surface area.
Lists indexed repositories in deterministic buckets: ready, indexing, requires reindex, and failed.
Creates, syncs, checks status, reindexes, or clears indexes. Status includes health diagnostics when available.
Semantic search with runtime/docs/mixed scopes, path operators, must/exclude filters, grouped output, and debug metadata.
Reads sidecar symbol outlines and resolves exact symbols without guessing when matches are ambiguous.
Traverses sidecar caller/callee relationships with deterministic depth, limits, and transparency metadata.
Reads plain text or annotated content. Exact symbol opening delegates to outline resolution.
Lifecycle operations have different meanings. Use sync for ordinary file changes, reindex for fingerprint or sidecar incompatibility, and clear only when you intentionally want to remove a tracked codebase.
manage_index action="sync" is the immediate
convergence lever after normal file edits or ignore-rule changes.
Search also runs freshness checks before returning results.
manage_index action="reindex" rebuilds the index.
Use it when a tool returns requires_reindex or a
reindex hint. Do not substitute sync for fingerprint
incompatibility.
manage_index action="clear" is destructive. Do not
call it for routine refresh. Use it only when the user explicitly
asks to remove Satori's tracked index for a codebase.
manage_index action="status" answers why a repo is
or is not usable right now.
Satori separates usable degraded output from blocking lifecycle states. Agents should branch on structured statuses and warnings instead of parsing prose.
Warnings mean the result is usable but degraded. Examples include unsatisfied must filters, reranker failure, or a failed search pass that still left usable fallback output.
FILTER_MUST_UNSATISFIED
RERANKER_FAILED
SEARCH_PASS_FAILED:*
requires_reindex is not a warning. It is a blocking
status or remediation hint. Reindex the hinted path, then retry
the original call.
fingerprint_mismatch,
completion_marker_missing, sidecar readiness, and
watcher state are status diagnostics. They explain why the tool
chose a lifecycle state; they are not all search warnings.
Use debug=true on search_codebase when
you need ranking, filter, freshness, reranker, or relaxed-pass
explanations.
Normal search output should stay compact. Use
debug=true when you need to understand ranking, filters,
fallback passes, or exclusions.
Warnings mean usable but degraded. Failures and
requires_reindex statuses require remediation before
treating results as current.
Prefer status and debug output before guessing. The goal is to make repo state visible enough for the agent to choose the next operation.
Run manage_index(action="create") on the repository
root, then retry search.
Run manage_index(action="reindex"). Do not use sync
as a substitute for fingerprint incompatibility.
Apply suggested ignore patterns through repo
.satoriignore, then run
manage_index(action="sync") for immediate
convergence.
Follow the returned navigation fallback. Read exact spans and use additional scoped searches to enumerate usages.