rag-rat
Local repo-intelligence MCP for coding agents: indexes source, symbols, call graphs, git/GitHub history, and source-bound repo memories into local database.
README
rag-rat
What a repository knows about itself. rag-rat is a local repo-intelligence index and MCP server
for coding agents. It keeps source files read-only, writes only its own SQLite database, and answers
with provenance on every result — current source, the code graph, git/GitHub history, and durable,
source-anchored repo memories that persist across sessions and agents.
Every harness already has grep and read. rag-rat is the layer they can't be: it carries the
rationale — the invariants, decisions, and risks bound to the code you're touching — and labels
every hit with confidence and coverage so you can judge it instead of trusting it.
sequenceDiagram
participant Repo as Repository
participant Engine as rag-rat engine
participant Agent as Coding agent
Repo->>Engine: Source · git/GitHub · repo memories
Engine->>Engine: Index → graph → (opt) SCIP oracle → reconcile
Agent->>Engine: where / why / who-calls / impact?
Engine-->>Agent: source + call paths + papertrail + memories (with provenance)
Agent->>Engine: record a finding
Engine->>Repo: persist a source-anchored repo memory
Why
- Provenance, not guesses. Every result carries a confidence label, coverage warnings, and the raw evidence — so a partial index or an ambiguous edge reads as exactly that.
- Repo memories. Typed, source-anchored notes (
Invariant,Decision,Risk, …) that survive refactors and surface automatically during future queries — the signal grep can't give you. - A real code graph. tree-sitter callers/callees/imports across Rust, TypeScript/TSX, Kotlin,
C/C++, and Python — with an optional compiler-grade SCIP oracle that upgrades
edges to
Compilerconfidence and ranks the load-bearing symbols. - History as evidence. Git history, lazy chunk blame, and cached GitHub issue/PR/review rationale, all queryable.
- Rides your existing grep. A PreToolUse hook injects the memories and symbols behind whatever you just searched for.
- Flags clones as you write them. A PreToolUse hook on Write/Edit/MultiEdit fingerprints the functions you're writing and warns when they're exact or near-duplicates of code already in the repo — so an agent reuses instead of re-implementing. Read-only, and a silent no-op when the index isn't ready, so it never blocks a write.
Install
cargo install rag-rat # from crates.io (FastEmbed included by default)
From a checkout:
cargo install --path crates/rag-rat-cli --bin rag-rat
Add --no-default-features for a smaller hash-only build without real embeddings. SQLite is bundled
(compiled in via rusqlite), so there is no system-library prerequisite — see
Platform support for the per-OS C-toolchain note.
Platform support
rag-rat builds and tests on Linux, macOS, and Windows. Linux is covered on every PR and on every
push to main; macOS and Windows are exercised on release, so cargo install rag-rat builds and
links on all three.
SQLite is bundled (compiled from source via rusqlite), so there's no system-library prerequisite,
but each platform needs a C toolchain: Linux ships one; on macOS install the Xcode Command Line
Tools (xcode-select --install); on Windows install the Visual Studio Build Tools with the C++
workload (MSVC). Requires Rust 1.95+ (the bundled SQLite build uses the cfg_select! macro,
stabilized in 1.95).
A few maintenance conveniences are Unix- or Linux-only by design and degrade quietly elsewhere — no feature of the index, query, or MCP surface is affected:
- Hot-upgrade of a running MCP server (the
SIGUSR1in-place re-exec) is Unix-only. On Windows, restartrag-rat mcpto pick up a new binary. - Fleet auto-upgrade (signalling other running servers when a new binary lands) is Linux-only —
it walks
/proc— and is a no-op elsewhere. - The grep-augmentation hook uses a warm Unix-socket listener (with per-session dedupe) on Linux and macOS; on Windows it falls back to a per-call read-only query straight against the index, which works the same but without cross-call dedupe.
Quickstart
From the repository you want to index:
cd /path/to/your/repo
rag-rat init
init scans the repo, prompts for languages and path bindings, writes rag-rat.toml, indexes,
offers to install the local embedding model, and can register the MCP server and git hooks. Preview
without writing anything with rag-rat init --dry-run; --yes runs the non-interactive defaults.
Manual setup and every config knob live in docs/config.md.
Connect it to your agent (MCP)
The MCP server is STDIO — the client launches rag-rat as a child process. rag-rat init is the
recommended path: it registers the server per project (claude mcp add --scope project /
codex mcp add), so each repo gets its own index.
To wire it up by hand, register a project-scoped server that runs in the repo directory:
claude mcp add --scope project rag-rat -- rag-rat mcp
or a project .mcp.json / equivalent:
{
"mcpServers": {
"rag-rat": { "command": "rag-rat", "args": ["mcp"] }
}
}
Don't pin a single global server to one repo's config. A user-scoped server with a hardcoded
--config /some/repo/rag-rat.tomlserves that repo's index and memories everywhere — so browsing a different codebase loads the wrong context. Register the server per project and let it resolverag-rat.tomlfrom the repo it runs in. (--config <path>still exists for the rare case you need to point at a specific profile.)
Pass rag-rat mcp --json if your client must parse tool text as JSON (results are
TOON by default). Full tool schemas: docs/mcp-tools.md.
The tools
The highest-leverage ones (full catalog + JSON schemas in docs/mcp-tools.md):
semantic_search— hybrid BM25 + vector recall over source/docs, validated against current source. Every hit reportsretrieval_mode;explain=truebreaks down the score.symbol_lookup— exact/fuzzy symbol resolution; cfg/overload duplicates grouped as one logical symbol.find_callers/trace_callees— reverse/forward graph traversal (low-signal std/macro noise filtered by default).impact_surface— the coding preflight: callers, callees, tests, git history, GitHub papertrail, and repo memories for a symbol in one call.repo_memoriesdefaults to a compact, scannable per-memory header (kind, title, confidence, anchor status, and where it's bound); passfull_memories: true(or usememory_for_symbol|path|call_path) for the full bodies + bindings.important_symbols— load-bearing symbols by (SCIP-aware) PageRank; seedocs/oracle.md.repo_brief/repo_clusters— orientation: spine / churn / god-modules / ownership clusters.find_clones/clones_for_symbol— exact + near-miss duplicate functions ranked by refactor ROI; the candidate graph is precomputed in the background so it scales to large repos.read_chunk— current text for a chunk with anchor validation.- Git/GitHub:
commit_search,git_history_for_path|symbol,git_blame_chunk,papertrail_for_*,rationale_search. - Memories:
memory_create,memory_update,memory_search,memory_for_symbol|path|call_path,memory_validate,memory_mark_obsolete.
Repo memories
Repo memories are first-class local evidence — not chat memory. They are typed
(Invariant, Decision, RejectedAlternative, Risk, BugPattern, PerformanceNote, …) and
source-anchored: bound to a logical symbol, concrete symbol, chunk, path+span, graph edge,
call-path, commit, or GitHub ref. rag-rat tracks each anchor as current, relocated, stale,
gone, or unverified, and surfaces matching memories through the memory_* tools and inline in
read_chunk, symbol_lookup, find_callers, trace_callees, and impact_surface. They're how
hard-won context reaches the next agent in one call instead of evaporating.
Compiler-grade resolution & ranking
The graph is heuristic by default. The opt-in SCIP oracle (rag-rat oracle run) upgrades edges
to a Compiler tier from a real language tool, recovers calls tree-sitter missed, flags external
edges, and makes important_symbols surface the genuine god-modules. Turn on [oracle] auto_run and
the MCP server keeps it fresh on its own (throttled, watcher-safe). Full details:
docs/oracle.md.
Freshness
rag-rat mcp runs a background file watcher (on by default; [watch] enabled = false or
RAG_RAT_NO_WATCH=1 to disable), so graph/symbol queries reflect uncommitted edits without a commit.
Indexed rows are git-context-aware: clean files are stored by commit_sha, dirty/untracked files in
a worktree overlay, so one database reuses rows across branch switches while reflecting local edits.
Optional git hooks (rag-rat hooks install) keep the index current on checkout/merge/rewrite/commit.
read_chunk and search validate hits against current source and heal stale entries before returning.
One watcher per worktree and one writer at a time are enforced with file locks (unreliable on
NFS / WSL2 /mnt mounts).
<a id="output"></a>Output format
The CLI and MCP results default to TOON (Token-Oriented Object Notation) — a token-efficient
encoding that renders uniform rows as a dense [N]{cols}: table (~30% smaller than compact JSON on
those payloads, never larger in practice). Pass --json (CLI, either position) or launch
rag-rat mcp --json (MCP) when a JSON parser must read the output.
Commands
rag-rat init # guided first-run setup
rag-rat index [--changed|--discover|--full]
rag-rat doctor
rag-rat query "semantic recall" # add --json for JSON
rag-rat important-symbols --limit 20
rag-rat brief --mode spine|churn|god_modules|refactor_candidates
rag-rat clusters --limit 10
rag-rat oracle run | status # compiler-grade resolution (docs/oracle.md)
rag-rat models list | install <model>
rag-rat reconcile --changed-first --max-seconds 60 --batch-size 64
rag-rat github sync --from-refs
rag-rat hooks install # git maintenance hooks
rag-rat gc # prune rows for dead git contexts
rag-rat eval [--json|--update-baseline] # CI search-quality gate; requires a `--features eval` build (absent from the released binary)
rag-rat mcp # start the STDIO server
Benchmarks
The headline workload is indexing the whole Linux kernel (v7.0, ~63k C/H files, 11.2M graph edges).
Full numbers — wall-clock, throughput, peak RSS, on-disk size, unresolved-edge taxonomy — are in
docs/benchmarks.md. Performance is tracked per-push and gated per-PR; the live
history is at bencher.dev/perf/rag-rat/plots (wiring:
docs/bencher.md).
Security
The MCP server exposes read-only source tools. It never executes shell commands or writes your source
files. It writes only the configured SQLite index — during indexing, migration, maintenance,
reconciliation, repo-memory operations, and automatic stale-index healing. GitHub sync is explicit
and uses gh api; normal query tools read only the local cache.
Releasing & license
Releases are automated by release-plz (the three crates ship in lockstep;
see docs/releasing.md). rag-rat is MIT-licensed — see LICENSE.
Prior art
rag-rat's clone-detection design is inspired by SourcererCC's scalable token-bag candidate generation, NiCad's normalized near-miss clone-detection framing, GumTree's move-aware AST differencing, and anti-unification / least-general generalization for template extraction. Planned fragment-level mining and copy-paste bug heuristics are inspired by CP-Miner.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。