Code Index

io.github.achreftlili由 GitHub 帳號 achreftlili 發布v1.0.6更新於 Oct 24, 2026

SQLite-backed hybrid (vector + FTS) code search index for Claude Code over MCP.

已驗證STDIO僅桌面知識與記憶開發者工具

概覽

AI 產生的概覽

本機 SQLite 混合(向量加全文)程式碼索引,讓助理在儲存庫中檢索符號、檔案大綱與呼叫關係,而不必盲目 grep。

可以做什麼
  • 以向量加全文的混合檢索依概念搜尋程式碼,或依精確名稱查找符號
  • 列出單一檔案或整個目錄子樹的符號大綱,並找出某一列所屬的符號及其外層呼叫鏈
  • 依符號 ID 取得程式碼片段,支援單筆或批次
  • 追蹤呼叫圖:呼叫者、被呼叫者、參照、遞迴呼叫樹以及檔案匯入關係
  • 列出最近幾次 git 提交中異動的檔案,並產生同檔案重新命名的編輯清單
  • 管理索引:建立或更新索引、檢查環境、安裝自動重建索引掛鉤、查看統計並驗證完整性
適用情境
適合助理在中大型儲存庫中工作、需要回答某函式在哪裡定義、誰呼叫它、某類邏輯位於何處,而不想整份檔案讀完的情境。對 Python、TypeScript/JavaScript、Go 與 Rust 程式碼庫特別合適,離線快速檢索優於盲目讀取檔案。
執行需求
以 PyPI 套件 mcp-code-index 透過 stdio 在本機執行,通常用 uvx 啟動或以 pip 安裝。需要 Python 3.10+ 且支援可載入的 SQLite 擴充功能(sqlite-vec),首次初始化需約 600 MB 磁碟空間,用於從 Hugging Face 下載嵌入模型。不需要 API 金鑰或帳號。可用 CODE_INDEX_DB、CODE_INDEX_EMBED_DEVICE、CODE_INDEX_EMBED_BATCH 等環境變數調整索引路徑與嵌入裝置。
安裝前請注意
首次初始化會從 Hugging Face 下載約 600 MB 的模型,需要一次網路連線。選用的掛鉤會寫入專案的 .claude/settings.json,並在每次編輯後重建索引;索引資料庫預設寫在 .claude/index.db。在助理之外搬移檔案或切換分支後索引會過期,需重新執行 init。重新命名工具只回傳編輯清單,由助理自行套用。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Code Index,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

code-index

A local, SQLite-backed code index for Claude Code, exposed over MCP. It replaces blind Read / Grep / Glob exploration with targeted retrieval — "where is parseAuthToken defined", "what calls Indexer.reindex_all", "find the rate-limiting code" — answered in milliseconds against an offline index.

No API keys. No external services. The embedder runs locally on your machine.

How it works (30-second tour)

  1. Parse your repo with tree-sitter (Python, TypeScript/JavaScript, Go, Rust).
  2. Chunk code per symbol and expand identifiers (getUserAuthToken → get user auth token) so search matches both styles.
  3. Embed each chunk locally with jina-embeddings-v2-base-code (768-dim) via sentence-transformers.
  4. Store symbols, chunks, vectors, and call/import edges in .claude/index.db (SQLite + sqlite-vec + FTS5).
  5. Serve 14 retrieval tools + 1 admin tool over MCP (see Tools).
  6. Stay fresh via an optional PostToolUse hook that incrementally re-indexes touched files.

Tools

Retrieval

ToolPurpose
code_searchHybrid (vector + FTS) search for conceptual queries (e.g., "auth flow", "where do we parse JSON").
symbol_lookupExact-name lookup of functions / classes / methods / types. Prefer over code_search for identifiers.
file_outlineSymbols (with signatures) in a file, in source order. Use instead of Read when you only need shape.
module_outlineSymbols across a directory subtree in one call. Use instead of looping file_outline.
where_am_iGiven path + line, returns the innermost symbol and the full enclosing chain.
get_symbol_bodyFull chunk for a symbol_id from symbol_lookup / code_search / file_outline.
get_symbol_bodiesBatch version of get_symbol_body (up to 20 ids per call).
callersSymbols that CALL the given symbol. depth (1-5) expands transitively.
calleesSymbols that the given symbol CALLS. depth (1-5) expands transitively.
referencesNon-call uses (subclasses, free identifier references). Companion to callers / callees.
traceBuild a call-graph tree from an entry symbol; flat=true returns nodes/edges for cheap LLM scans.
file_importsFiles this file imports (direction=imports) or that import it (direction=imported_by).
recent_changesFiles touched in the last N git commits.
propose_renamev1: same-file rename. Returns an edit list the agent applies via its own Edit tool; refuses on clash.

Admin

Tool / opPurpose
admin op=initBuild or refresh the index. Incremental by default; force=true rebuilds from scratch.
admin op=setup_checkDiagnose hook wiring + embedder + host. Round-trip-tests the hook end-to-end.
admin op=install_hookWire the auto-reindex PostToolUse hook into .claude/settings.json. Idempotent.
admin op=statsRead-only: file counts by language, symbol totals, embed model fingerprint, last-index time.
admin op=verifyIntegrity sweep: orphan rows, parse-failure files, dangling edges.

embed_query_debug is a dev-only ranking diagnostic, hidden from list_tools unless CODE_INDEX_DEBUG=1 is set.

All tools return bounded JSON; large bodies use get_symbol_body rather than inlining whole files.

Requirements

  • Python 3.10+ with loadable SQLite extension support (required by sqlite-vec).
    • Python 3.13 has this enabled by default.
    • On 3.10–3.12, install via the python.org installer or via pyenv with PYTHON_CONFIGURE_OPTS=--enable-loadable-sqlite-extensions pyenv install 3.12.x.
    • Homebrew Python often ships without the extension hook — use one of the two methods above instead.
  • uv / uvx (install) — recommended runner. Or pip if you prefer a permanent install.
  • ~600 MB free disk for the embedding model on first init.

Quick start (Claude Code)

One command, no API keys:

bash
claude mcp add-json -s user code-index "$(cat <<'JSON'{  "type": "stdio",  "command": "uvx",  "args": ["--refresh", "--from", "mcp-code-index", "code-index-mcp"]}JSON)"

Then open Claude Code in any repo and ask:

"Build the code index for this repo."

Claude calls the init MCP tool, which writes .claude/index.db. From then on, ask things like "where is parseAuthToken defined?" or "what calls Indexer.reindex_all?" — Claude routes them through symbol_lookup / callers / code_search instead of grepping.

What --refresh does — fetches the latest PyPI release on every Claude Code launch. Convenient during preview; drop it once you want to pin a version (saves ~1s of startup).

Project-only install — drop -s user to register the server in the current project's .claude/settings.json instead of the global ~/.claude.json.

First-run model download — the first init pulls jina-embeddings-v2-base-code (~600 MB) into ~/.cache/huggingface and caches it forever. Subsequent runs are fully offline. If your network blocks Hugging Face, pre-warm the cache from a machine that has access.

Already installed without --refresh? Run claude mcp remove code-index first, then re-run the command above.

Alternative: permanent install (no uvx)

bash
pip install mcp-code-indexclaude mcp add -s user code-index -- code-index-mcp

Optional: keep the index live as you edit

Without a hook, the index drifts when files change outside the agent (mv, git checkout, IDE saves) until you call init again. With one, every Edit / Write / MultiEdit Claude performs triggers an incremental reindex of the touched file.

Easiest path: ask Claude. On first use in a new project, ask "set up the code-index" — Claude calls setup_check → install_hook → init. The hook command is derived from how the MCP server was launched (uvx-aware), so it uses the same Python toolchain. Hook output goes to .claude/code-index-hook.log so failures are debuggable.

Manual install — add this block to the project's .claude/settings.json under hooks.PostToolUse (the version you want depends on how you launch the server — install_hook derives the right one for you):

json
{  "matcher": "Edit|Write|MultiEdit",  "hooks": [    {      "type": "command",      "command": "uvx --with 'sentence-transformers<5' --with 'numpy<2' --from mcp-code-index code-index-hook"    }  ]}

In other MCP-compatible agents

The server speaks standard MCP over stdio, so any client that supports MCP servers works (Cursor, Continue, Cody, Zed, etc.). Configure the client to launch uvx --refresh --from mcp-code-index code-index-mcp (or code-index-mcp after pip install mcp-code-index). Once connected, call the init tool from inside the client to bootstrap the index. Drop --refresh when you want to pin to a stable version instead of always pulling latest.

From source (development)

bash
git clone https://github.com/achreftlili/code-indexcd code-indexpip install -e .code-index init        # CLI alternative to the `init` MCP toolcode-index-mcp         # starts the MCP server on stdio (for manual wiring)

Configuration

All settings are optional — the defaults work out of the box. Override them via environment variables. Inside Claude Code, set them in the env block of your code-index server entry in ~/.claude.json (then reconnect the MCP server).

Common knobs (most users only ever touch these):

VarDefaultWhen to set it
CODE_INDEX_EMBED_DEVICEautoForce the torch device: cpu, mps, or cuda. Set cpu on Apple Silicon if init fails with MPS out-of-memory.
CODE_INDEX_EMBED_BATCH32Encode batch size. Lower (e.g. 8 or 4) to cut peak GPU memory while staying on mps/cuda.
CODE_INDEX_DB.claude/index.dbOverride the SQLite index path (e.g. to share an index across sibling worktrees).

Advanced (rarely needed):

VarDefaultNotes
CODE_INDEX_EMBEDDERjinaOnly jina (local sentence-transformers) is supported today; the variable exists for future expansion.
CODE_INDEX_EMBED_MODELjinaai/jina-embeddings-v2-base-codeHuggingFace model id. Only override if you know the model is dim-compatible (768d).
CODE_INDEX_EMBED_DIM768Must match the embedding model's output dimension.

Troubleshooting

init fails with MPS backend out of memory on Apple Silicon. A large file produced a chunk batch bigger than your GPU's free VRAM. Quickest fix — re-run on CPU (slower but bulletproof):

json
"env": {  "CODE_INDEX_EMBED_DEVICE": "cpu"}

To stay on the GPU, shrink the batch instead: "CODE_INDEX_EMBED_BATCH": "8". Reconnect the MCP server (/mcp → reconnect, or restart Claude Code) so the new env takes effect. init is incremental — already-embedded files are skipped on the retry.

init fails with a Hugging Face network error on first run. Your network is blocking model downloads. Pre-warm the cache on a machine that has access:

bash
huggingface-cli download jinaai/jina-embeddings-v2-base-code# then copy ~/.cache/huggingface/ to the offline machine

sqlite3.OperationalError: not authorized or sqlite-vec fails to load. Your Python build doesn't have loadable SQLite extensions. See Requirements — install via python.org or a pyenv build with PYTHON_CONFIGURE_OPTS=--enable-loadable-sqlite-extensions.

code_search / symbol_lookup returns stale paths after a refactor or branch checkout. The auto-reindex hook only fires on Claude's Edit / Write / MultiEdit. After bulk file moves outside the agent (mv, git checkout, IDE rename), re-run init (it's incremental). Or wire up the hook so the index keeps up with agent edits automatically.

Layout

src/code_index/  db.py           SQLite schema, connection, sqlite-vec loading  parser.py       Tree-sitter wrapper, symbol + edge extraction  imports.py      Per-language import target → file path resolution  chunker.py      Per-symbol chunks, identifier expansion  embedder.py     Local Jina (sentence-transformers) backend  indexer.py      Pipeline: walk → parse → chunk → embed → write  reindexer.py    Per-root engine cache; one entry point for "reindex one file"  retriever.py    Hybrid search (vector + FTS5) with RRF  watcher.py      File watcher (watchdog)  admin.py        setup_check / install_hook / init logic (pure, no MCP state)  mcp_server.py   MCP wiring, shared helpers, schema fragments  tool_registry.py  Shared `@_tool` decorator + `_TOOLS` registry  tools/          Per-domain MCP handlers (graph, paths, refactor, …)  hook.py         `code-index-hook` console script — the PostToolUse entry point  cli.py          init / reindex / watch / stats

來源:README.md,提交 27a6bf8

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.0.6最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分