The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Codeseeker listing page.
Four-layer hybrid search and knowledge graph for AI coding assistants.
BM25 + vector embeddings + RAPTOR directory summaries + graph expansion — fused into a single MCP tool that gives Claude, Copilot, and Cursor a real understanding of your codebase.
Works with Claude Code, GitHub Copilot (VS Code 1.99+), Cursor, Windsurf, and Claude Desktop.
One command to index; the Claude Code plugin keeps it in sync from there.
AI assistants are powerful editors, but they navigate code like a tourist:
"find authentication logic" returns every file containing the word "auth"CodeSeeker fixes this. It indexes your codebase once and gives AI assistants a queryable knowledge graph they can use on every turn.
A 4-stage pipeline runs on every query:
The knowledge graph is built from AST-parsed imports at index time. It's what powers the graph action, dead-code detection, and graph expansion in every search.
| Approach | Strengths | Limitations |
|---|---|---|
| Grep / ripgrep | Fast, universal | No semantic understanding |
| Vector search only | Finds similar code | Misses structural relationships |
| Serena | Precise LSP symbol navigation, 30+ languages | No semantic search, no cross-file reasoning |
| Codanna | Fast symbol lookup, good call graphs | Semantic search needs JSDoc — undocumented code gets no embeddings; no BM25, no RAPTOR, Windows experimental |
| CodeSeeker | BM25 + embedding fusion + RAPTOR + graph + coding standards + multi-language AST | Requires initial indexing (30s–5min) |
What LSP tools can't do:
What vector-only search misses:
--scope user makes it available in every project you open, not just the current one.
Why global rather than npx -y: on a machine that has never seen the package, npx
downloads it and builds native dependencies before the server can answer, which measured
13.7 seconds to a completed MCP handshake. Clients that give up sooner report that as
a connection failure. A global install answers in 759 ms — the download happens once,
at a moment when you are expecting it to.
Portable, and fine once the package is cached. Expect a slow first start.
Add this to your MCP config file (see below for per-client locations) and restart your editor.
For Claude Code CLI users — adds auto-sync hooks and slash commands:
Slash commands: /codeseeker:init, /codeseeker:reindex
Ask your AI assistant: "What CodeSeeker tools do you have?"
You should see a single tool named codeseeker. That is intentional: one tool with an
action routing key keeps per-request token overhead low (ADR-002). The actions are
search, sym, graph, analyze and index.
The MCP config JSON is the same for all clients — only the file location differs:
| Client | Config file |
|---|---|
| VS Code (Claude Code / Copilot) | .vscode/mcp.json in your project, or ~/.vscode/mcp.json globally |
| Cursor | .cursor/mcp.json in your project |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows) |
| Windsurf | .windsurf/mcp.json in your project |
CodeSeeker exposes one MCP tool, codeseeker. You pick behaviour with action and
fill only the matching nested parameter group:
Always pass project (the absolute project root) — an MCP server cannot detect your
working directory.
| action | Parameters | What It Does |
|---|---|---|
search | search:{q} | Hybrid search: BM25 + vector embeddings fused with RRF, then graph expansion; RAPTOR directory summaries surface for abstract queries |
search | search:{q, type:"vector"} | Pure embedding cosine-similarity search |
search | search:{q, type:"fts"} | Pure BM25 text search with CamelCase tokenisation |
search | search:{q, full:true} | Include a code snippet with each result (default: summaries only) |
search | search:{q, exists:true} | Quick yes/no — returns {found, count, top_file} |
sym | sym:{name} | Look up a class/function by name and show its graph neighbours |
graph | graph:{seed, depth, rel, dir} | Traverse the knowledge graph from a file (imports, calls, extends) |
graph | graph:{q} | Same, but find the seed files semantically first |
analyze | analyze:{kind:"standards"} | Your project's detected patterns (validation, error handling) |
analyze | analyze:{kind:"duplicates"} | Find duplicate/similar code blocks |
analyze | analyze:{kind:"dead_code"} | Detect unused exports, orphaned files, coupling issues |
index | index:{op:"init", path} | Build the index for a project (required once — see below) |
index | index:{op:"sync", changes} | Update the index for specific files |
index | index:{op:"exclude", paths} | Exclude/include paths from the index |
index | index:{op:"status"} | List indexed projects with file/chunk counts |
index | index:{op:"parsers"} | List/install Tree-sitter parsers |
You don't invoke these manually—Claude uses them automatically when searching code or analyzing relationships.
A project must be indexed once before search works. CodeSeeker does not index on first query — if the project is unknown it returns an error telling you to initialise it. This is deliberate: silently indexing a large repository inside a tool call would block the assistant for minutes with no way to cancel.
Index once, either way:
Indexing runs in the background and takes 30 seconds to several minutes depending on
project size. Poll it with index({op:"status"}). Subsequent searches are instant.
If you use the Claude Code plugin, /codeseeker:init does this for you and hooks keep
the index current afterwards.
18 hand-labelled queries across two real-world codebases:
| Corpus | Language | Files | Queries | Query types |
|---|---|---|---|---|
| Conclave | TypeScript (pnpm monorepo) | 201 | 10 | Symbol lookup, cross-file chains, out-of-scope |
| ImperialCommander2 | C# / Unity | 199 | 8 | Class lookup, controller wiring, file I/O |
Each query has one or more mustFind targets (exact file basenames) and optional mustNotFind targets (scope leak check). Queries were run on a real index built from source — real Xenova embeddings, real graph, real RAPTOR L2 nodes — to reflect production conditions.
Metrics: MRR (Mean Reciprocal Rank), P@1 (Precision at 1), R@5 (Recall at 5), F1@3.
| Configuration | MRR | P@1 | P@3 | R@5 | F1@3 | Notes |
|---|---|---|---|---|---|---|
| Hybrid baseline (BM25 + embed + RAPTOR, no graph) | 75.2% | 61.1% | 29.6% | 91.7% | 44.4% | Production default |
| + graph 1-hop | 74.9% | 61.1% | 29.6% | 91.7% | 44.4% | ±0% ranking, adds structural neighbors |
| + graph 2-hop | 74.9% | 61.1% | 29.6% | 91.7% | 44.4% | Scope leaks on unrelated queries |
| No RAPTOR (graph 1-hop) | 74.9% | 61.1% | 29.6% | 91.7% | 44.4% | RAPTOR contributes +0.3% |
BM25 + embedding fusion (RRF)
The workhorse. Handles ~94% of ranking quality on its own. BM25 catches exact symbol names and camelCase tokens; vector embeddings catch semantic similarity when names differ. Fused with Reciprocal Rank Fusion to combine both signals without manual weight tuning.
RAPTOR (hierarchical directory summaries)
Generates per-directory embedding nodes by mean-pooling all file embeddings in a folder. Acts as a post-filter: when a directory summary scores ≥ 0.5 against the query, results are narrowed to that directory's files. Measured contribution: +0.3% MRR on symbol queries. Fires conservatively — only when the directory is an obvious match. Its real value is on abstract queries ("what does the payments module do?") which don't appear in this benchmark; for those queries it prevents broad scattering across the entire codebase.
Knowledge graph (import/dependency edges)
Average connectivity: 20.8 file→file edges per node across both TS and C# codebases. Measured ranking impact: ±0% MRR for 1-hop expansion. The graph doesn't move MRR because the semantic layer already finds the right files — the graph's neighbors are usually already in the top-15. Its value is structural: the analyze dependencies action and explicit graph search type give Claude traversable import chains, inheritance hierarchies, and dependency paths that embeddings alone cannot provide.
Type boost / penalty scoring
Source files get +0.10 score boost; test files get −0.15 penalty; lock files and docs get −0.05 penalty. Without this, integration.test.ts would rank above dag-engine.ts for exact symbol queries because test files import and exercise every symbol in the source. The penalty corrects this without eliminating test files from results.
Monorepo directory exclusion fix
The single highest-impact change in v1.12.0: removing packages/ from the default exclusion list. For pnpm/yarn/lerna monorepos where all source lives under packages/, this exclusion was silently dropping all source files. Effect: 10% → 72% MRR on the Conclave monorepo benchmark.
| Query | Target | Issue | Root cause |
|---|---|---|---|
cv-prompts | orchestrator.ts | rank 97+ even with 2-hop graph | prompt-builder.test.ts outscores prompt-builder.ts semantically; source file never enters top-10, so we can't graph-walk from it to orchestrator.ts. Test-file dominance on cross-file queries. |
cv-exec-mode | types.ts | rank 11–12 | types.ts is a pure type-export file; low keyword density. Found within R@5 (rank ≤ 15). |
Reproduce with:
Requires C:\workspace\claude\conclave and C:\workspace\ImperialCommander2 to be present locally (or update paths in scripts/real-bench.js).
CodeSeeker analyzes your codebase and extracts patterns:
Detected pattern categories:
When Claude writes new code, it follows your existing conventions instead of inventing new ones.
If Claude notices files that shouldn't be indexed (like Unity's Library folder, build outputs, or generated files), it can dynamically exclude them:
Exclusions are persisted in .codeseeker/exclusions.json and automatically respected during reindexing.
CodeSeeker helps you maintain a clean codebase by finding duplicate code and detecting dead code.
Ask Claude to find similar code blocks that could be consolidated:
CodeSeeker uses vector similarity to find semantically similar code—not just exact matches. It detects:
Ask Claude to identify unused code that can be safely removed:
CodeSeeker analyzes the knowledge graph to find:
Example workflow:
| Language | Parser | Relationship Extraction |
|---|---|---|
| TypeScript/JavaScript | Babel AST | Excellent |
| Python | Tree-sitter | Excellent |
| Java | Tree-sitter | Excellent |
| C# | Regex | Good |
| Go | Regex | Good |
| Rust, C/C++, Ruby, PHP | Regex | Basic |
Tree-sitter parsers install automatically when needed.
The plugin installs hooks that automatically update the index:
| Event | What Happens |
|---|---|
| Claude edits a file | Index updated automatically |
Claude runs git pull/checkout/merge | Full reindex triggered |
You run /codeseeker:reindex | Manual full reindex |
You don't need to do anything—the plugin handles sync automatically.
codeseeker({action:"index", index:{op:"sync"}})| Setup | Claude Edits | Git Operations | Manual Edits |
|---|---|---|---|
| Plugin (Claude Code) | Auto | Auto | Manual |
| MCP (Cursor, Desktop) | Ask Claude | Ask Claude | Ask Claude |
| CLI | Auto | Auto | Manual |
Good fit:
Less useful:
All data stored locally in .codeseeker/. No external services required.
For large teams (100K+ files, shared indexes), server mode supports PostgreSQL + Neo4j. See Storage Documentation.
For the complete technical internals — exact scoring formulas, MCP tool schema, graph edge types, RAPTOR threshold logic, pipeline stages, analysis confidence tiers — see the Technical Architecture Manual.
npx -y codeseeker --versionnode --version (need v18+)First-time indexing of large projects (50K+ files) can take 5+ minutes. Subsequent uses are instant.
Open an issue: GitHub Issues
| Client | MCP Support | Config |
|---|---|---|
| Claude Code (VS Code) | ✅ | .vscode/mcp.json or plugin |
| GitHub Copilot (VS Code 1.99+) | ✅ | .vscode/mcp.json |
| Cursor | ✅ | .cursor/mcp.json |
| Windsurf | ✅ | .windsurf/mcp.json |
| Claude Desktop | ✅ | claude_desktop_config.json |
| Visual Studio | ✅ | codeseeker install --vs |
Claude Code and GitHub Copilot share the same
.vscode/mcp.json— configure once, works for both.
If CodeSeeker is useful to you, consider sponsoring the project.
Apache License 2.0. See LICENSE and NOTICE.
Free for any use, commercial included — no company-size or revenue limits. Apache-2.0 adds an explicit patent grant over MIT, which is why it is the choice here.
Everything above is the local, single-developer setup: the index lives in .codeseeker/
on your machine and never leaves it.
There is a centralized deployment for teams — one shared index over your organisation's repositories (PostgreSQL + pgvector, Neo4j), so engineers aren't each paying to reindex the same code, and so the graph spans service boundaries instead of stopping at one repo. It also surfaces what the local tool structurally cannot: how code understanding is actually distributed across a codebase and where the knowledge gaps sit.
If that's useful to your team, get in touch: https://pragmaworks.dev
CodeSeeker gives Claude the code understanding that grep and embeddings alone can't provide.
An Apache-2.0 tool behind Generative Specification (GS) — the discipline for building software with AI that doesn't drift: you author a specification precise enough that a stateless AI derives correct code from it, and a harness verifies it against a live system.