codemap
MCP server for local-first code intelligence, providing structural code graph, semantic search, and impact analysis to AI agents.
README
codemap
Local-first code intelligence that gives AI agents and people structural awareness of codebases — combining a code graph (LSP + parsers) with semantic vector search (veclite), exposed through a CLI, an MCP server, and an interactive terminal UI.
Working on the code? Read AGENTS.md first — it is the source of truth for conventions, architecture, and gotchas.
codemap answers questions that grep and a single LSP call can't: who calls this function and which tests cover it, what's the blast radius of changing this type, find auth-like code and then show me everything that calls into it. It precomputes the structure once, then serves narrow, structured answers — so an agent spends a few tool calls instead of dozens of file reads.
Features
- Structural code graph — files, functions, types, methods, and tests as nodes; call edges
(name-based by default, exact via
go/typeswith--precise) and defines edges (file → symbol). Test coverage is derived by walking the call graph to test nodes. Stored in pure-Go SQLite, queryable offline. v0.1 indexes Go (stdlibgo/parser); the schema reservesimports/implements/overrides/referencesedge types for the planned LSP and tree-sitter backends. Semantic search is language-agnostic. - Semantic search — every node's source is embedded (Ollama
nomic-embed-text, 768-dim) into veclite; vector + BM25 hybrid search. - Impact analysis —
impactreturns a symbol's definition sites, direct callers, the transitive blast radius (everything affected by a change), and which tests cover those paths (flagging untested code). - Multi-project registry — one shared store indexes all your repos;
projectslists what's indexed, and any query targets one project (resolved from cwd, or--path). - Annotations — pin notes and external data (DB rows from mongosh/postgres, vidtrace/vecgrep
findings, …) to a symbol or a call path; they persist across reindex. A knowledge layer over the
graph for agent harnesses (
annotate/annotations, also on MCP). - Precise call resolution (go/types) — the fast name-based graph over-matches same-named methods
(
x.Close()links to everyClose). Onecodemap index --preciseruns an in-process, pure-Gogo/typespass that resolves each call to the method it actually invokes and makes every query — callers, callees, impact, hotspots, path — exact at once, no per-query flag (e.g. aClosemethod that name-matching credited with 71 callers shows only its real ones). Opt-in and additive (name-based stays the default); degrades to name-based with a note when thegotoolchain or module isn't available. For a one-off exact answer without reindexing,callers/calleesalso take--lsp(goplscallHierarchy). CLI + MCP. - Incremental — hash-based reindex; an embedding-profile guard forces a rebuild when the provider/model/dimension changes instead of corrupting the vector space.
- Three surfaces, one store — a Cobra CLI (with
--jsonfor agents), a stdio MCP server, and the studio TUI for humans. - Graph analytics —
hotspots(hubs),orphans(dead-code candidates), andpath(shortest call path between two symbols). - Local-first & private — everything runs on your machine; no cloud, no uploads.
- Single binary — pure-Go,
CGO_ENABLED=0, cross-compiled and shipped via Homebrew.
studio (TUI)
codemap studio opens an interactive, full-screen explorer of your code (Charm v2 — Bubble
Tea / Lip Gloss / Bubbles). Switch tabs with 1–4 or tab; navigate with ↑/↓.
codemap studio codemap · 509 nodes · 1849 edges · 35 files
1 Graph 2 Metrics 3 Impact 4 Search
Hubs │ lspsrc.Extractor.Close
57 lspsrc.Extractor.Close │ Called by (57)
56 app.Session.Close │ ▸ main.runInit cmd/codemap/main.go:186
56 graph.Store.Close │ main.runIndex cmd/codemap/main.go:209
26 app.NewService │ Calls (9)
19 app.Open │ app.Session.Close internal/app/session.go:80
│ ⟩ func runInit(cmd *cobra.Command, ...) error
↑/↓ hub · → walk callers/calls · enter → impact · p precise · ctrl+c quit
Fully-qualified names disambiguate same-named symbols (six different Close methods above), and
the selected node's signature is previewed (⟩ func runInit(...)).
- Graph — a call-graph explorer: hubs (most-referenced symbols) on the left as jump
points, the centered node's callers and callees on the right. Press
→to focus the right pane and walk the graph —enterre-centers on a caller/callee so you can traverse the call chain;backspacesteps back;sreads the selected symbol's source in a scrollable overlay, without leaving studio. - Metrics — an overview dashboard: counts and bar charts (by kind/language) on the left;
the call graph's two extremes on the right — top hubs (most-referenced) and dead-code
candidates (no callers). Both lists are navigable —
enterdrills a row into Impact,ctrl+sreads its source. - Impact — type a symbol, see its callers, blast radius, and which tests cover it.
- Search — semantic search by meaning, falling back to fast name search when there are no embeddings (so it works even without Ollama).
Installation
Homebrew (recommended)
brew install abdul-hamid-achik/tap/codemap
Prerequisites
- Go 1.25+ (only to build from source)
- Ollama with the embedding model:
ollama pull nomic-embed-text(optional — without it, indexing is structure-only) - gopls — optional, for
--lspprecise Go results - Optional: Task for the dev workflow
Languages: v0.1 indexes Go. Pointing
codemap indexat a non-Go project reports what it skipped; broader language support is planned.
From source
git clone https://github.com/abdul-hamid-achik/codemap
cd codemap
task build # → ./bin/codemap (or: go build ./cmd/codemap)
Go install
go install github.com/abdul-hamid-achik/codemap/cmd/codemap@latest
Quick start
# 1. Register and index a project
codemap init # registers the current directory
codemap index # extract graph + embed nodes (incremental)
codemap index --no-embed # structure only (no Ollama needed)
codemap index --precise # exact call edges via go/types (Go; needs the go toolchain)
# 2. Navigate the call graph
codemap callers authenticateUser # who calls it (fast, name-based)
codemap callers authenticateUser --lsp # exact callers via gopls (Go)
codemap callees authenticateUser # what it calls
codemap path Handler Login # shortest call path between two symbols
# 3. Analyze impact and structure
codemap impact authenticateUser --depth 3 # callers + blast radius + tests
codemap hotspots --top 20 # most-referenced symbols (hubs)
codemap orphans # functions with no callers (dead-code candidates)
# 4. Search by meaning (needs an embedded index)
codemap semantic "jwt validation middleware" --top 10
# 5. Explore visually
codemap studio
Add --json to any query command for machine-readable output (for agents/scripts).
The flagship impact answers what breaks if I change this, and what do I run to check? in one call
(real output, from codemap on itself):
$ codemap impact Stats --depth 2
Impact of Stats (codemap)
defined: internal/graph/store.go:291
direct callers: 4
blast radius: 18 (depth ≤ 2)
tests covering: 9
covering tests (run these):
graph.TestStats internal/graph/graph_test.go:387
app.TestServiceLifecycle internal/app/app_test.go:29
index.TestIndexProject internal/index/indexer_test.go:87
… (6 more)
affected (blast radius):
[1] app.Service.Status internal/app/service.go:165
[1] index.Indexer.IndexProject internal/index/indexer.go:89
✓ [1] graph.TestStats internal/graph/graph_test.go:387
[2] main.runStatus cmd/codemap/main.go:252
… (14 more)
Commands
| Command | What it does |
|---|---|
init / index / status |
register, index (incremental; --reindex, --no-embed, --precise), show stats |
projects |
list all registered projects and their index sizes |
callers / callees / path |
call-graph navigation (--lsp on callers/callees for exact gopls results) |
symbols |
list a file's symbols (structured alternative to reading it) |
find |
find symbols by name (offline) |
source |
print a symbol's source code (the body behind its signature) |
docs |
print the agent guide to codemap (docs [topic]) |
annotate / annotations |
pin / list notes + external data on a symbol or call path |
impact |
blast radius + test coverage for a symbol (--depth) |
hotspots / orphans |
hubs / dead-code candidates (--top) |
semantic |
meaning-based search (--top) |
serve |
run the MCP server (stdio) |
studio |
open the interactive TUI |
All query commands accept --json.
Accuracy: name-based vs precise (go/types)
codemap's graph is name-based by default — instant, offline, and tolerant of broken code. It
resolves calls within a package precisely (Go), but a cross-package method call like x.Close()
links to every method named Close, because resolving the receiver's type needs a type-checker.
codemap is honest about this rather than hiding it: callers/callees/impact flag when a name
resolves to multiple definitions, and hotspots marks name-collision inflation.
For an exact graph, reindex with codemap index --precise (Go). It runs an in-process, pure-Go
go/types pass that resolves every call to the one method it actually invokes and replaces the
name-based call edges — so every query (callers, callees, impact, hotspots, path) becomes
precise at once, with no per-query flag. On the codemap repo itself this collapses the Close/Error
fan-out (e.g. one Close method that name-matching credited with 71 callers drops to its real ~12)
and turns hotspots from name-collision noise into genuine hubs. Requirements and guarantees:
- Needs the
gotoolchain and a buildable module. A package that doesn't type-check keeps its name-based edges (per-package degrade); a project with nogo/go.modfalls back wholesale with a note — never a hard error, and never worse than name-based. - Purely additive and opt-in: without
--precise, indexing is byte-for-byte the fast name-based path. - Interface dispatch is statically undecidable, so a precise edge points at the interface method, not the concrete implementors.
For a one-off exact answer without reindexing, callers/callees also accept --lsp (gopls
callHierarchy), which likewise degrades to name-based with a note when gopls can't resolve.
orphans finds call-graph dead ends; it can't see callers reached via interface dispatch or
reflection, so treat its output as candidates, not proof.
Use it from an agent (MCP)
codemap is a stdio MCP server. Register codemap serve with your agent — most CLIs have a one-liner:
claude mcp add codemap -- codemap serve # Claude Code (add --scope user for all projects)
codex mcp add codemap -- codemap serve # OpenAI Codex
copilot mcp add codemap -- codemap serve # GitHub Copilot CLI
For any other MCP client, add a stdio server to its config (the key may be mcpServers, mcp, or
context_servers):
{
"mcpServers": {
"codemap": { "command": "codemap", "args": ["serve"] }
}
}
Once connected, an agent can call codemap_docs to learn the tools and workflow on its own.
Tools (17): codemap_init, codemap_index, codemap_status, codemap_semantic,
codemap_callers, codemap_callees, codemap_impact, codemap_hotspots,
codemap_orphans, codemap_path, codemap_symbols, codemap_find, codemap_source,
codemap_projects, codemap_docs, codemap_annotate, codemap_annotations. Each takes an
optional path (the project directory) and returns JSON. codemap_callers / codemap_callees
accept precise: true for exact, gopls-resolved results (Go); codemap_source returns a symbol's
body; codemap_projects lists what's indexed; codemap_docs returns an agent guide so a
harness can learn the tool; codemap_annotate / codemap_annotations pin notes and external
data (DB rows, findings) to symbols and call paths — a knowledge layer over the graph (see below).
Results carry each symbol's signature (e.g. func (s *Store) Hotspots(projectID int64, limit int) ([]Hotspot, error)) and docstring, so an agent understands what callers/callees/hits are
and what they do without a follow-up file read — and same-named symbols are easy to tell apart.
The flagship is codemap_impact — one call returns a symbol's definition sites, callers, the
transitive blast radius, and which tests cover those paths, replacing many file reads.
Configuration
XDG-style, with CODEMAP_* environment overrides and an ecosystem fallback:
$XDG_CONFIG_HOME/codemap/config.yaml # config (~/.config/codemap/…)
$XDG_DATA_HOME/codemap/ # graph DB, veclite, project registry
$XDG_CACHE_HOME/codemap/ # caches
If ~/.codemap/ already exists it is used (back-compat with vecgrep/noted). Use
codemap init --local to keep repo-local state. Precedence and all keys are documented in
AGENTS.md. Override paths with CODEMAP_CONFIG / CODEMAP_DATA.
How it fits the ecosystem
codemap is built on veclite and shares conventions with vecgrep (semantic code search) and noted (code notes). An agent can combine them: vecgrep/codemap to find code by meaning, codemap to learn what calls it and what breaks if it changes.
Documentation
Full docs: docs/ (VitePress). Design rationale: SPEC.md.
License
MIT © 2026 Abdul Hamid Achik
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。