Agent
Claude Code, Codex, Cursor-style workflows, or another MCP client.
Satori is built as one repository-intelligence authority rather than a pile of independent search tools. Natural-language semantic retrieval, lexical evidence, symbol ownership, structural navigation, supported relationships, source freshness, and exact source are bound to one immutable Publication so an agent knows which repository state produced the answer.
Agent requests route through a fixed 11-tool MCP surface into one repository-intelligence authority. The runtime selects the current Publication, validates compatibility and freshness, and keeps the request pinned to that immutable generation. Indexing and maintenance build the next Publication separately and activate it only after the replacement is ready to become current authority.
Claude Code, Codex, Cursor-style workflows, or another MCP client.
Exposes 11 agent-safe operations instead of a wide internal API.
Coordinates indexing, search, sync, freshness, and lifecycle state.
Owns the current immutable generation: search state, symbols, structural evidence, relationships, manifest, and freshness identity.
@satori-code/coreOwns indexing, sync, chunking, metadata, and retrieval primitives.
@satori-code/mcpOwns the MCP server, 11-tool contract, lifecycle state, and agent envelopes.
@satori-code/cliInstalls the managed runtime and launcher, marked client config, and the canonical satori skill. It never edits AGENTS.md or hook files, and a real directory at a Satori skill-link path is refused and left in place.
Public setup is installer-owned. Supported clients should not pay package-manager resolution cost during every MCP startup, and users should not have to copy cache paths into each harness by hand.
npx -y @satori-code/cli@latest install resolves
the MCP runtime once, auto-detects supported clients, and writes
the installer-owned launcher, client config, and managed guidance
where supported.
Client config launches the installer-owned Node launcher at
~/.satori/bin/satori-mcp.js. Resident startup does
not call npx, npm, or a package manager.
Codex, Claude, OpenCode, and Antigravity config differences live in the installer and its tests, not in user-maintained snippets.
Satori exposes exactly 11 public MCP tools. They cover repository discovery,
lifecycle, natural-language + lexical search and pagination, architecture, structural and
relationship navigation, exact references, bounded source reads, and change orientation.
Every tool is read-only with respect to source code; only Satori index state is mutable
through manage_index.
list_codebasesLists known indexed repositories with readiness and live runtime-owner state.
Does not flatten incompatible or in-progress repositories into a false “ready” state.
search_codebaseRuns freshness-aware hybrid search, exact/lexical recovery, symbol-owned grouping, filters, and optional debug modes.
Refuses to serve an incompatible Publication as current evidence.
architecture_overviewSummarizes bounded Publication architecture evidence as logical areas, cross-area boundaries, call hotspots, and coverage/filtering counts.
Does not infer layers, services, clusters, or relationships that are absent from the current Publication.
continue_searchReveals more of one frozen grouped result set without rerunning embedding, retrieval, or reranking.
Expired, stale, conflicting, or authority-drifted handles fail closed.
file_outlineReturns Publication-owned symbols, ownership, spans, and supported structural analysis for one file.
Exact symbol resolution reports ambiguity instead of selecting a same-name guess.
detect_changesMaps a Git diff to current indexed symbol seeds and bounded transitive callers for change orientation.
Does not claim complete blast-radius coverage when relationship evidence is unavailable or truncated.
read_fileReads bounded source windows or opens one exact indexed symbol through current-source symbol resolution.
It is restricted to tracked searchable roots and is not a general host-filesystem reader.
call_graphTraverses bounded caller/callee relationship context and supported test references for an exact symbol reference.
Unsupported dispatch or missing relationship authority returns a capability/readiness fallback rather than a fabricated edge.
trace_pathFinds one deterministic shortest path between exact published symbol IDs over selected persisted relationships.
Hard depth/node/edge budgets report truncation; an empty result is not global proof that no path exists.
find_referencesScans validated published source for exact textual occurrences of one canonical symbol, independent of semantic ranking.
Textual matches remain observational evidence and never become CALLS without normal relationship proof.
manage_indexSupports create, sync, status, reindex, cancel, and clear while preserving atomic Publication activation.
Incomplete staging never becomes current; destructive actions stay explicit and incompatible live runtime owners block unsafe mutation.
Retrieval and navigation are different evidence layers, but they share one authority. A Publication binds the search snapshot, symbol registry, structural analysis, relationship evidence, manifest, and freshness identity into one immutable generation.
Indexing builds staged state without disturbing readers. Only a complete generation is promoted to current, so a request cannot mix new vectors with an old symbol graph or vice versa.
A read acquires the current Publication and keeps that exact generation pinned for the request. Concurrent publication changes do not mutate the evidence underneath an in-flight tool call.
Matching chunks are retrieval evidence. Navigation resolves them to exact symbol instances and source spans before exposing symbol-owned actions to the agent.
CALLS edges are published only when the language-specific strategy proves the target within its public capability boundary. Ambiguity, unsupported receiver dispatch, and unproved build context abstain.
Satori treats index state as part of the contract. Agents do not just receive search results; they also receive status, freshness, and recovery guidance when the index is unsafe or incomplete.
{ embeddingProvider, embeddingModel, embeddingDimension,
vectorStoreProvider, schemaVersion, parserVersion,
extractorVersion, relationshipVersion,
embeddingProjectionVersion, lexicalProjectionVersion
}
Prevents silent reads from incompatible embedding models/dimensions or schema-mode mismatches.
The trust model is simple: retrieve locally, resolve evidence through the current Publication, expose only language capabilities that are actually qualified, and refuse stale or incomplete authority.
Freshness gate -> operator parse -> dense/BM25 retrieval -> deterministic filters -> rerank policy -> owner-symbol grouping -> bounded evidence -> stable tie-breaks.
Search ordering is deterministic: fused retrieval score first, with a stable candidate identity breaking ties. When LateOn runs, its order is final. Grouped results carry no score; the returned sequence is the ranking.
Dense and BM25 hits merge through reciprocal rank fusion, then LateOn reranks a bounded candidate set. If reranking fails, the retrieval order is kept.
TypeScript, JavaScript, Python, Go, Java, C#, C++, Rust, and Scala
ship production symbols plus CALLS v0. The backend is
language-specific: OXC/Satori syntactic for JS/TS, Python-native
Satori resolution, CBM semantic resolution for Go/Java/C#/C++/Rust,
and Satori syntactic direct-call resolution for Scala. Kotlin and
PHP add conservative CALLS v0 over symbols from codebase-memory-mcp's
definition extractors.
Uses .gitignore, .satoriignore,
repo-local satori.toml, and configured patterns.
Signature checks converge even without watcher events.
OXC, Tree-sitter, and qualified semantic backends produce symbols, structural evidence, exact spans, ownership, and relationship inputs. MCP clients get useful code intelligence rather than a raw parser dump.
Runtime scope keeps implementation discovery first and still includes
test evidence (demoted unless test intent is explicit). Documentation
stays out of runtime by default; use scope=docs for
documentation-only results, or mixed for everything.
satori.toml selects default,
minimal, or all-text. Profiles control
what enters the index; search scope controls what gets queried.
Stat-first scanning and hash-on-change keep source discovery bounded. Indexing assembles the next complete search/symbol/relationship generation in staging, then atomically publishes it when ready.
Missing, stale, incompatible, ambiguous, or unsupported navigation never becomes guessed graph truth. Public tools return explicit capability/readiness outcomes and keep callers/callees advisory.
Potion + BM25 + LateOn + LanceDB is the managed Linux x64 / WSL2 path. Provisioning happens during install; the qualified offline runtime is designed for zero Satori runtime network requests afterward.
Exact path: searches can supplement dirty tracked
files with bounded live reads, so fresh regression lines are not
hidden by stale vector chunks.
Search can start from a package path inside an indexed parent. Satori resolves the effective root while keeping navigation fallbacks executable.
Active indexing progress belongs to the live runtime. After a restart, status reports durable current Publication state rather than inventing a process history that no longer exists.
The managed offline Potion + LanceDB path can share one resident runtime across compatible clients for the same state root. Mutation is blocked when live ownership would make Publication authority ambiguous.
Repository state removal is an explicit manage_index
action. Ordinary reads never mutate source files or silently repair
incompatible index state.
This is the intended architecture flow, not a simulated chat transcript.
search_codebase returns ranked behavior matches or exact identifier hits with freshness state, recommendedNextAction, capability confidence, and navigation hints.
file_outline resolves symbol ownership and read_file opens the exact indexed symbol or a bounded source span from the same Publication.
call_graph traverses the caller/callee directions supported by relationship evidence qualified for that language and Publication.
Stale Publications, unsupported call semantics, ambiguous targets, and incomplete indexing return explicit readiness or capability guidance.
Satori does not edit code. It gives the coding agent enough repo evidence to avoid blind changes.