Skip to main content

Fast semantic code search for AI agents — find symbols, references, and callers across any codebase

Project description

codeix

codeix.dev · Fast semantic code search for AI agents — find symbols, references, and callers across any codebase.

codeix                 # start MCP server, watch for changes
codeix build           # parse source files, write .codeindex
codeix -r ~/project build  # build from a specific directory

Why

AI coding agents spend most of their token budget finding code before they can work on it. They grep, read files, grep again, backtrack. On a large codebase the agent might burn thousands of tokens just locating the right function — or worse, miss it entirely and hallucinate.

Codeix gives the agent a pre-built map of your codebase. One structured query returns the symbol name, file, line range, signature, and parent — no scanning, no guessing.

What existing tools get wrong

Problem What happens today
No structure grep finds text matches, not symbols. The agent can't distinguish a function definition from a comment mentioning it.
Slow re-parsing Python-based indexers re-parse everything on startup. On large codebases, you wait.
Not shareable Indexes are local caches — ephemeral, per-machine. A new developer or CI runner starts from scratch.
No composition Monorepo with 10 packages? Dependencies with useful APIs? No way to query across boundaries.
Prose is invisible TODOs, docstrings, error messages — searchable by grep but not selectively. You can't search only comments without also matching code.

What codeix does differently

  • Committed to git — the index is a .codeindex directory you commit with your code. Clone the repo, the index is already there. No re-indexing.
  • Shareable — library authors can ship .codeindex in their npm/PyPI/crates.io package. Consumers get instant navigation of dependencies.
  • Composable — the MCP server auto-discovers dependency indexes and mounts them. Query your code and your dependencies in one place.
  • Structured for LLMs — symbols have kinds, signatures, parent relationships, and line ranges. The agent gets exactly what it needs in one tool call instead of piecing it together from raw text.
  • Prose searchsearch --scope text targets comments, docstrings, and string literals specifically. Find TODOs, find the error message a user reported, find what a function's docstring says — without noise from code.
  • Fast — builds in seconds, queries in milliseconds. Rust + tree-sitter + in-memory SQLite FTS5 under the hood.

The .codeindex format

An open, portable format for structured code indexing. Plain JSONL files you commit alongside your code — git-friendly diffs, human-readable with grep and jq, no binary blobs.

.codeindex/
  index.json        # manifest: version, name, languages
  files.jsonl       # one line per source file (path, lang, hash, line count)
  symbols.jsonl     # one line per symbol (functions, classes, imports, with signatures)
  texts.jsonl       # one line per comment, docstring, string literal

Any tool that can parse JSON can consume a .codeindex. Codeix builds it using tree-sitter, and AI agents query it through MCP (Model Context Protocol).

Examplesymbols.jsonl:

{"file":"src/main.py","name":"os","kind":"import","line":[1,1]}
{"file":"src/main.py","name":"Config","kind":"class","line":[22,45]}
{"file":"src/main.py","name":"Config.__init__","kind":"method","line":[23,30],"parent":"Config","sig":"def __init__(self, path: str, debug: bool = False)"}
{"file":"src/main.py","name":"main","kind":"function","line":[48,60],"sig":"def main(args: list[str]) -> int"}

Ship your index with your package

Include .codeindex in your package and every developer who depends on you gets instant navigation of your API — no setup, no re-indexing.

Works with Git repos, npm, PyPI, and crates.io.

MCP tools

Seven tools, zero setup. The agent queries immediately — no init, no config, no refresh.

Tool What it does
explore Explore project structure: metadata, subprojects, files grouped by directory
search Unified full-text search across symbols, files, and texts (FTS5, BM25-ranked) with scope/kind/path/project filters
get_file_symbols List all symbols in a file
get_children Get children of a class/module
get_callers Find all places that call or reference a symbol
get_callees Find all symbols that a function/method calls
flush_index Flush pending index changes to disk

Project discovery

Launch codeix from any directory. It walks downward and treats every directory containing .git/ as a separate project — each gets its own .codeindex.

Works uniformly for single repos, monorepos, sibling repos, and git submodules. No config needed.

Languages

Tree-sitter grammars, feature-gated at compile time:

Language Feature flag Default Extensions
Python lang-python yes .py .pyi .pyw
Rust lang-rust yes .rs
JavaScript lang-javascript yes .js .mjs .cjs .jsx
TypeScript lang-typescript yes .ts .mts .cts .tsx
Go lang-go yes .go
Java lang-java yes .java
C lang-c yes .c .h
C++ lang-cpp yes .cpp .cc .cxx .hpp .hxx
Ruby lang-ruby yes .rb .rake .gemspec
C# lang-csharp yes .cs
Markdown lang-markdown yes .md .markdown

Markdown support

Markdown files are parsed for headings (both ATX # and Setext underline styles) which are indexed as section symbols with hierarchical parent-child relationships — enabling TOC extraction and document structure navigation.

Fenced code blocks are extracted as code text entries, parented to their containing section.

Embedded scripts

HTML, Vue, Svelte, and Astro files are preprocessed to extract embedded <script> blocks, which are then parsed with the JavaScript or TypeScript grammar:

Format Extensions Script detection
HTML .html .htm <script> tags, with optional lang="ts"
Vue .vue <script> and <script setup>, with optional lang="ts"
Svelte .svelte <script>, with optional lang="ts"
Astro .astro --- frontmatter (always TypeScript) + optional <script> tags

Line numbers in the index point to the original file, not the extracted script block.

Install

# npm / npx — run without installing
npx codeix

# pip / uvx — run without installing
uvx codeix

# Rust
cargo install codeix

# Homebrew
brew install codeix

# Or build from source
git clone https://github.com/montanetech/codeix.git
cd codeix
cargo build --release

All channels install the same single binary. No runtime dependencies.

Usage

# Build the index for the current project
codeix build

# Build from a specific directory (discovers all git repos below)
codeix -r ~/projects build

# Start MCP server (default command, watches for changes)
codeix

# Or explicitly
codeix serve
codeix serve --no-watch

# Serve from a specific directory
codeix -r ~/projects serve

MCP client configuration

Add to your MCP client config (e.g. Claude Desktop, Cursor):

{
  "mcpServers": {
    "codeix": {
      "command": "codeix"
    }
  }
}

Design principles

  • Local only — no network, no API keys, works offline and air-gapped
  • Deterministic — same source always produces the same index (clean diffs)
  • Composable — dependency indexes are auto-discovered and mounted at query time
  • Minimal surface — 7 query tools, zero management plumbing

Architecture

See docs/architecture.md for the full set of architecture decision records.

License

MIT OR Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

codeix-0.5.0.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

codeix-0.5.0-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file codeix-0.5.0.tar.gz.

File metadata

  • Download URL: codeix-0.5.0.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for codeix-0.5.0.tar.gz
Algorithm Hash digest
SHA256 6a9b0e4d5f816cba1a8d0d40426f02b25bc415bfddfd5d555bb73f1a9a7afb3a
MD5 a82abf08b44e4e195f9ac79579c73722
BLAKE2b-256 ea43d8d568b46a81a69bc06d6379b4b9ce035ac9773b7ed29881a1fb7a94b73f

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeix-0.5.0.tar.gz:

Publisher: publish-wrappers.yml on montanetech/codeix

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codeix-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: codeix-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for codeix-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 50dfd9888456278814bc64270d5d240c7c4719460d3aa3d324def58460e5bcb6
MD5 7f4a9ad9212980bbb539b7caabcc2680
BLAKE2b-256 28ed240cbb19f44d11b2d260d0c1ae36a17dd83e1d2f959dd22adaf655295c67

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeix-0.5.0-py3-none-any.whl:

Publisher: publish-wrappers.yml on montanetech/codeix

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page