Code Atlas
A code intelligence graph that gives AI coding agents deep, token-efficient understanding of your codebase — structure, docs, and dependencies in one searchable graph.
Map your codebase. Search it three ways. Feed it to agents.
The Problem
Every time an AI agent touches your codebase, it burns tokens just figuring out where things are. Grep for a function name. Read five files to understand the call chain. Search docs for context. Repeat — across every task, every session. On a large project, agents can spend 30–50% of their context window on orientation before they write a single line of code.
Many tools solve one piece of this: semantic search, or graph traversal, or keyword lookup. But a developer doesn't understand a codebase through one lens — they build a mental model that connects structure, meaning, and names simultaneously. Agents need the same thing.
Code Atlas is that mental model, externalized as a graph.
What Is This?
Code Atlas builds a graph database of your entire codebase — code structure, documentation, and dependencies — and exposes it via MCP tools that AI coding agents can use to understand, navigate, and reason about your code.
Three search types, one system:
- Graph traversal — follow relationships: who calls this function? What does this class inherit from? What services depend on this library?
- Semantic search — find code by meaning: "authentication middleware" finds relevant code even if it's named
verify_token_chain - BM25 keyword search — exact matches: find that specific error message, config key, or function name
All powered by Memgraph as a single backend.
Which backend am I actually on?
backend.graphdefaults to"auto", which uses Memgraph when it is reachable and silently falls back to an embedded SQLite engine when it is not — so on a machine without Docker running, SQLite is what you get. It is a fallback, not a parity replacement (ADR-0015): community detection (find_communities, and the map inatlas ui) is unavailable there, and some analyses differ.health_checkreports a warning rather than an OK while it is active, andindex_statuscarries abackendfield. Setbackend.graph = "memgraph"inatlas.tomlto fail loudly instead of falling back.
Key Features
- Monorepo-native — auto-detects sub-projects, tracks cross-project dependencies, scoped queries
- Documentation as first-class — indexes markdown docs, ADRs, and READMEs with links to the code they describe
- AST-level incremental indexing — only re-indexes the entities that actually changed, not entire files
- Pattern detection — pluggable detectors for decorator routing, event handlers, DI, test→code mappings, and more
- Library awareness — lightweight stubs for external dependencies, full indexing for internal libraries
- Self-hosted — runs locally with Docker. No data leaves your machine
- No additional API costs — agent-first design means all intelligence runs through your existing subscription; local embeddings via TEI, no extra API keys
- Token-efficient — budget-aware context assembly that prioritizes what matters most
- Pluggable AI — TEI for embeddings, LiteLLM for LLM calls, or bring your own
- MCP server — works with Claude Code, Cursor, Windsurf, or any MCP-compatible client
- Human-readable too —
atlas uiserves the same graph as a local web interface, including an architecture-health view (DSM, propagation cost, dependency cycles) for spotting decay
How Does This Compare?
Several excellent tools exist in this space — graph-based analyzers, semantic search engines, wiki generators, and IDE-integrated indexers. Code Atlas builds on their ideas while addressing a gap: no single tool combines graph traversal, semantic search, and BM25 keyword search with documentation intelligence and MCP exposure.
For a detailed comparison covering DeepWiki, Cursor, Sourcegraph Cody, Kit, code-graph-rag, codegraph-rust, and more, see wiki/landscape.md.
MCP Tools
23 tools exposed via the Model Context Protocol, designed to minimize context window overhead. On the SQLite fallback the server registers 22 — find_communities needs Memgraph and is unregistered rather than left to fail when called.
| Tool | What it does | Search | Full | Latency (avg / p95) |
|---|---|---|---|---|
| Search | ||||
hybrid_search |
Primary tool — fuses graph + BM25 + vector via RRF. Auto-adjusts weights by query shape. | ~198 | ~672 | 548 / 677 ms |
text_search |
BM25 keyword search. Quoted phrases, wildcards, field-specific queries. | ~111 | ~320 | 34 / 36 ms |
vector_search |
Semantic similarity via embeddings. Finds code by meaning, not name. | ~88 | ~329 | 102 / 125 ms |
get_node |
Find entities by name. Cascade: exact (uid + name) → partial (suffix > prefix > contains). | ~122 | ~369 | 7 / 8 ms |
| Navigation | ||||
get_context |
Expand a node's neighborhood: parent, siblings, callers, callees, docs. | ~90 | ~246 | 34 / 36 ms |
summarize_module |
Dense skeleton of a module or package — signatures, line spans, adjacency, fan-in and fan-out. | ~218 | ~407 | — |
trace_path |
Shortest path between two entities. Each hop carries its edge type, confidence and strategy. | ~114 | ~252 | — |
cypher_query |
Run read-only Cypher against the graph. Auto-limited, write-protected. | ~48 | ~128 | 3 / 3 ms |
| Analysis | ||||
analyze_repo |
Structure, centrality, dependencies, pattern, or quality analysis. | ~50 | ~470 | 22 / 23 ms |
blast_radius |
Transitive closure of callers/callees — "what breaks if I change this". Every hit reports via. |
~214 | ~473 | — |
find_communities |
Clusters modules into subsystems by deterministic greedy modularity. Memgraph only. | ~159 | ~341 | — |
find_dead_code |
Entities with no incoming edge. A lead, not a verdict — known false positives are listed. | ~171 | ~310 | — |
find_complexity_hotspots |
Top callables by LOC-span — a crude proxy, not cyclomatic complexity. | ~72 | ~213 | — |
find_hotspots |
Commit-count hotspots, bus-factor risks and co-change pairs from git history. | ~145 | ~286 | — |
generate_diagram |
Mermaid diagrams: packages, imports, inheritance, module detail. | ~82 | ~284 | 3 / 3 ms |
| Guidance | ||||
get_usage_guide |
Quick-start or topic-specific guidance for the agent. | ~24 | ~79 | < 1 / < 1 ms |
plan_search_strategy |
Recommends which search tool + params for a question. | ~29 | ~70 | < 1 / < 1 ms |
validate_cypher |
Catches Cypher errors before execution. | ~47 | ~89 | 1 / 2 ms |
schema_info |
Full graph schema: labels, relationships, Cypher examples. | ~64 | ~79 | < 1 / < 1 ms |
| Status | ||||
index_status |
Projects, entity counts, schema version, index health. | ~61 | ~76 | 22 / 23 ms |
list_projects |
Monorepo project list with dependency relationships. | ~45 | ~60 | 12 / 13 ms |
health_check |
Infrastructure diagnostics: Memgraph, TEI, Valkey, schema. | ~73 | ~88 | 218 / 264 ms |
knowledge_health |
Knowledge-vault lint: inbox, orphans, dangling links, duplicate ids, promotion candidates. | ~135 | ~150 | — |
Token counts measured from the registered MCP tool definitions (tiktoken cl100k_base) — reproduce with uv run python scripts/count_tool_tokens.py. Search = name + description (2,360 total); Full = name + description + parameter schema with field descriptions, enums and constraints (5,791 total). All parameters are self-documented, so agents can one-shot any tool without calling get_usage_guide first.
Latency was measured with local TEI embeddings on the code-atlas repo (~1,400 entities), 5 iterations, warm embedding cache — see scripts/profile_query.py. A — means that tool is not yet in the profiling harness; it is unmeasured, not instant.
Quick Start
Prerequisites
- Python 3.14+ (
requires-python = ">=3.14"). A hard floor, not a soft one: the codebase uses PEP 758 unparenthesizedexcepttuples, which are a syntax error before 3.14 — it will not even import.litellmis also held below 1.92, because newer releases dropped prebuilt Windows/3.14 wheels. - Docker and Docker Compose — for Memgraph and Valkey.
- uv (Python package manager).
uvxfetches a matching interpreter for you, so you do not need 3.14 already on your PATH.
1. Start infrastructure
Download the compose file and start Memgraph + Valkey:
curl -O https://raw.githubusercontent.com/SerPeter/code-atlas/main/docker-compose.yml
docker compose up -d
docker-compose.ymlruns the MAGE-enabledmemgraph/memgraph-mageimage (needed forfind_communities/community detection). Existing deployments on an older compose file:docker compose pull && docker compose up -dto switch over.
Optional — add local embeddings (no API keys needed):
docker compose --profile tei up -d
2. Index your project
uvx --from code-atlas-mcp atlas index /path/to/your/project
uvx --from code-atlas-mcp atlas status
3. Explore it yourself (optional)
The graph is not only for agents. atlas ui serves a local, project-scoped web interface — search,
entity detail with the evidence behind every edge, and an architecture-health view that reports whether
the codebase is trending toward a big ball of mud:
uvx --from "code-atlas-mcp[ui]" atlas ui # http://127.0.0.1:8420
It binds to loopback and talks to nothing but your local Memgraph.
4. Connect to your AI agent
Claude Code:
claude mcp add code-atlas -- uvx --from code-atlas-mcp atlas mcp
Cursor / other MCP clients — add to your MCP config:
{
"mcpServers": {
"code-atlas": {
"command": "uvx",
"args": ["--from", "code-atlas-mcp", "atlas", "mcp"]
}
}
}
See CLI usage guide for more commands and options.
Development
If you want to contribute or run from source:
git clone https://github.com/SerPeter/code-atlas.git
cd code-atlas
uv sync --group dev
uv run pre-commit install
Performance
| Metric | Value |
|---|---|
| Full index (107 files) | 55s (local TEI) |
| Parse-only throughput | 600–700 files/sec |
get_node / text_search |
7 ms / 34 ms |
vector_search |
102 ms |
| Concurrent QPS | 238 (zero errors) |
Full index includes parsing, graph upserts, and embedding via local TEI (8 concurrent workers). Parse-only is raw tree-sitter CPU time without I/O. Query latencies are averages from scripts/profile_query.py. Full benchmark tables: wiki/benchmarks.md
Documentation
- Architecture — system design, pipelines, deployment model
- Landscape — code intelligence tools comparison and design rationale
- Configuration — atlas.toml, .atlasignore, environment variables
- CLI Usage — indexing, searching, daemon mode
- Benchmarks — parsing, query latency, concurrency
- Repository Guidelines — structure your code for better indexing
Supporting Code Atlas
I built Code Atlas because my AI agents kept burning half their context just figuring out where things are in larger codebases. Nothing combined the search types I needed in one place, so I built it and open-sourced it so you can benefit as well.
If Code Atlas saves you time, tokens, or makes your agents noticeably better — consider sponsoring the project.
License
Third-party components. The web UI ships two vendored browser bundles, both MIT, each with its
upstream licence text alongside it: sigma.js 3.0.3 and
graphology 0.26.0, under
src/code_atlas/server/web/static/vendor/. Versions, sources and file hashes are recorded in
PROVENANCE.md. They are committed rather than
fetched, so atlas ui needs no network beyond your local Memgraph.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file code_atlas_mcp-0.8.4.tar.gz.
File metadata
- Download URL: code_atlas_mcp-0.8.4.tar.gz
- Upload date:
- Size: 711.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b748277bdd6ab71d3acce46af09848d9d610d05a50cf2e9ca1a9addff071069
|
|
| MD5 |
f68cdcc6624c3954f39003366e9442ef
|
|
| BLAKE2b-256 |
5cf56e9182be01f02750fceb9ae3377228c5198f42c8177d78e921831f16b048
|
Provenance
The following attestation bundles were made for code_atlas_mcp-0.8.4.tar.gz:
Publisher:
release.yml on SerPeter/code-atlas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
code_atlas_mcp-0.8.4.tar.gz -
Subject digest:
0b748277bdd6ab71d3acce46af09848d9d610d05a50cf2e9ca1a9addff071069 - Sigstore transparency entry: 2619504404
- Sigstore integration time:
-
Permalink:
SerPeter/code-atlas@29d03403d413b28d4818d1d49af89fff5543c8f4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/SerPeter
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@29d03403d413b28d4818d1d49af89fff5543c8f4 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file code_atlas_mcp-0.8.4-py3-none-any.whl.
File metadata
- Download URL: code_atlas_mcp-0.8.4-py3-none-any.whl
- Upload date:
- Size: 741.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96e8e1e021076bc23b0c5dfd7920fe87f84235aabc5911227e1008e1ebf09f04
|
|
| MD5 |
20efc6629ad2f6e55623c1ba75508c03
|
|
| BLAKE2b-256 |
a75023a2a1688e7ad6908672a5c29818964adeb90ee6db0b3de606351cd5f614
|
Provenance
The following attestation bundles were made for code_atlas_mcp-0.8.4-py3-none-any.whl:
Publisher:
release.yml on SerPeter/code-atlas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
code_atlas_mcp-0.8.4-py3-none-any.whl -
Subject digest:
96e8e1e021076bc23b0c5dfd7920fe87f84235aabc5911227e1008e1ebf09f04 - Sigstore transparency entry: 2619504430
- Sigstore integration time:
-
Permalink:
SerPeter/code-atlas@29d03403d413b28d4818d1d49af89fff5543c8f4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/SerPeter
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@29d03403d413b28d4818d1d49af89fff5543c8f4 -
Trigger Event:
workflow_dispatch
-
Statement type: