MCPcopy Index your code
hub / github.com/cocoindex-io/cocoindex-code

github.com/cocoindex-io/cocoindex-code @v0.2.37

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.2.37 ↗ · + Follow
575 symbols 2,511 edges 44 files 281 documented · 49% updated 5d agov0.2.37 · 2026-06-23★ 2,46820 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

cocoindex code

AST-based semantic code search that just works

effect

A lightweight, effective (AST-based) semantic code search tool for your codebase. Built on CocoIndex — a Rust-based ultra performant data transformation engine. Use it from the CLI, or integrate with Claude, Codex, Cursor — any coding agent — via Skill or MCP.

  • Instant token saving by 70%.
  • 1 min setup — install and go, zero config needed!

Discord GitHub Documentation License

PyPI Downloads CI release

🌟 Please help star CocoIndex if you like this project!

Deutsch | English | Español | français | 日本語 | 한국어 | Português | Русский | 中文

Get Started — zero config, let's go!

Install

Using pipx:

pipx install 'cocoindex-code[full]'          # batteries included (local embeddings)
pipx upgrade cocoindex-code                  # upgrade

Using uv:

uv tool install --upgrade 'cocoindex-code[full]'

Two install styles — they mirror the Docker image variants of the same names: - cocoindex-code[full] — batteries-included. Pulls in sentence-transformers so local embeddings (no API key required) work out of the box. The ccc init interactive prompt defaults to Snowflake/snowflake-arctic-embed-xs. - cocoindex-code (slim) — LiteLLM-only; requires a cloud embedding provider and API key. Use when you don't want the local-embedding deps (~1 GB of torch + transformers).

Next, set up your coding agent integration — or jump to Manual CLI Usage if you prefer direct control.

Coding Agent Integration

Skill (Recommended)

Install the ccc skill so your coding agent automatically uses semantic search when needed:

npx skills add cocoindex-io/cocoindex-code

That's it — no ccc init or ccc index needed. The skill teaches the agent to handle initialization, indexing, and searching on its own. It will automatically keep the index up to date as you work.

The agent uses semantic search automatically when it would be helpful. You can also nudge it explicitly — just ask it to search the codebase, e.g. "find how user sessions are managed", or type /ccc to invoke the skill directly.

Works with Claude Code and other skill-compatible agents.

Claude Code plugin marketplace

For Claude Code users, this repository is also a plugin marketplace. Install the skill from inside Claude Code with:

/plugin marketplace add Roxabi/cocoindex-code
/plugin install cocoindex-code@cocoindex-code

This bundles the same ccc skill, with version pinning and /plugin marketplace update for updates.

MCP Server

Alternatively, use ccc mcp to run as an MCP server:

Claude Code

claude mcp add cocoindex-code -- ccc mcp

Codex

codex mcp add cocoindex-code -- ccc mcp

OpenCode

opencode mcp add

Enter MCP server name: cocoindex-code Select MCP server type: local Enter command to run: ccc mcp

Or use opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cocoindex-code": {
      "type": "local",
      "command": [
        "ccc", "mcp"
      ]
    }
  }
}

Once configured, the agent automatically decides when semantic code search is helpful — finding code by description, exploring unfamiliar codebases, fuzzy/conceptual matches, or locating implementations without knowing exact names.

Note: The cocoindex-code command (without subcommand) still works as an MCP server for backward compatibility. It auto-creates settings from environment variables on first run.

MCP Tool Reference

When running as an MCP server (ccc mcp), the following tool is exposed:

search — Search the codebase using semantic similarity.

search(
    query: str,                          # Natural language query or code snippet
    limit: int = 5,                      # Maximum results (1-100)
    offset: int = 0,                     # Pagination offset
    refresh_index: bool = True,          # Refresh index before querying
    languages: list[str] | None = None,  # Filter by language (e.g. ["python", "typescript"])
    paths: list[str] | None = None,      # Filter by path glob (e.g. ["src/utils/*"])
)

Returns matching code chunks with file path, language, code content, line numbers, and similarity score.

Manual CLI Usage

You can also use the CLI directly — useful for manual control, running indexing after changing settings, checking status, or searching outside an agent.

ccc init                                # initialize project (creates settings)
ccc index                               # build the index
ccc search "authentication logic"       # search!

The background daemon starts automatically on first use.

Tip: ccc index auto-initializes if you haven't run ccc init yet, so you can skip straight to indexing.

CLI Reference

Command Description
ccc init Initialize a project — creates settings files, adds .cocoindex_code/ to .gitignore
ccc index Build or update the index (auto-inits if needed). Shows streaming progress.
ccc search <query> Semantic search across the codebase
ccc grep <pattern> [path] Structural code search by example (no index needed)
ccc status Show index stats (chunk count, file count, language breakdown)
ccc mcp Run as MCP server in stdio mode
ccc doctor Run diagnostics — checks settings, daemon, model, file matching, and index health
ccc reset Delete index databases. --all also removes settings. -f skips confirmation.
ccc daemon status Show daemon version, uptime, and loaded projects
ccc daemon restart Restart the background daemon
ccc daemon stop Stop the daemon

Search Options

ccc search database schema                           # basic search
ccc search --lang python --lang markdown schema      # filter by language
ccc search --path 'src/utils/*' query handler        # filter by path
ccc search --offset 10 --limit 5 database schema     # pagination
ccc search --refresh database schema                 # update index first, then search

By default, ccc search scopes results to your current working directory (relative to the project root). Use --path to override.

Structural Search (ccc grep)

ccc grep finds code by structure, not text — you write a by-example pattern and it matches the syntax tree (via cocoindex's code_match), so formatting, whitespace, and intervening tokens don't matter. It runs entirely locally: no index, daemon, or embeddings required.

ccc grep 'def \NAME(\(ARGS*\)):'                      # every Python function def under the cwd
ccc grep 'foo(\(ARGS*\))' src/                        # calls to foo(...) anywhere under src/
ccc grep 'fn \NAME(\(A*\))' --lang rust               # restrict to one language
ccc grep 'class \NAME:' --path 'tests/**'            # restrict to a path glob
ccc grep 'TODO(\(A*\))' path/to/file.py               # a single file

Metavariables use the \ sigil: \NAME captures one node, \(NAME*\) a run of siblings, \_/\* match anonymously. The pattern is matched per language, so a single invocation scans every supported source file (others are skipped). Inside an initialized project, ccc grep honors the project's include/exclude patterns and .gitignore; otherwise it scans all supported source files under the path.

Results stream to the terminal file-by-file as each match is found (in completion order, since files are matched in parallel) rather than all at once at the end. Each matching file shows its matched line range; under a TTY the path is colored, line numbers are dimmed, and the unmatched context around a match is dimmed so the match stands out.

Note: ccc grep relies on cocoindex's structural code_match feature. Until it ships in a released cocoindex, run against a local cocoindex build.

Docker

A Docker image is available for teams who want a reproducible, dependency-free setup — no Python, uv, or system dependencies required on the host.

The recommended approach is a persistent container: start it once, and use docker exec to run CLI commands or connect MCP sessions to it. The daemon inside stays warm across sessions, so the embedding model is loaded only once.

Choosing an image

Two variants are published from each release:

Tag Size Embedding backends When to pick
cocoindex/cocoindex-code:latest (slim, default) ~450 MB LiteLLM (cloud: OpenAI, Voyage, Gemini, Ollama, …) Most users. Cloud-backed embeddings, smaller image, fast pulls.
cocoindex/cocoindex-code:full ~5 GB sentence-transformers (local) + LiteLLM When you want local embeddings without an API key, or an offline-ready container. Heavier because of torch + transformers.

The rest of this section uses :latest — substitute :full in the image: / docker run commands if you want the full variant.

Mac users running the :full variant: local embedding inference is CPU-only inside Docker, because Docker on macOS can't access Apple's Metal (MPS) GPU. If you want local embeddings and fast inference, install natively instead: pipx install 'cocoindex-code[full]'. The :latest (slim) variant is unaffected — LiteLLM runs the model on the provider's side, so Docker vs. native makes no difference.

Quick start — docker compose up -d

Bring it up in one line — no clone needed (bash / zsh):

# macOS / Windows
docker compose -f <(curl -L https://raw.githubusercontent.com/cocoindex-io/cocoindex-code/refs/heads/main/docker/docker-compose.yml) up -d

# Linux (aligns file ownership on bind-mounted paths with your host user)
PUID=$(id -u) PGID=$(id -g) docker compose -f <(curl -L https://raw.githubusercontent.com/cocoindex-io/cocoindex-code/refs/heads/main/docker/docker-compose.yml) up -d

Or grab docker/docker-compose.yml and run docker compose up -d next to it (works on any shell, including Windows cmd / PowerShell).

By default your home directory is mounted into the container (set COCOINDEX_HOST_WORKSPACE to narrow this to a specific code folder). Index data and the embedding model cache persist in a Docker volume across restarts. Your global settings file at $HOME/.cocoindex_code/global_settings.yml is visible and editable on the host; edits take effect on your next ccc command.

Pick a different image: set COCOINDEX_CODE_IMAGE to override the default. For example, the :full variant or GHCR: bash COCOINDEX_CODE_IMAGE=cocoindex/cocoindex-code:full docker compose up -d COCOINDEX_CODE_IMAGE=ghcr.io/cocoindex-io/cocoindex-code:latest docker compose up -d

Or: docker run

Docker Desktop (macOS / Windows)

docker run -d --name cocoindex-code \
  --volume "$HOME:/workspace" \
  --volume cocoindex-data:/var/cocoindex \
  -e COCOINDEX_CODE_HOST_PATH_MAPPING="/workspace=$HOME" \
  cocoindex/cocoindex-code:latest

Linux (with PUID/PGID)

docker run -d --name cocoindex-code \
  -e PUID=$(id -u) -e PGID=$(id -g) \
  --volume "$HOME:/workspace" \
  --volume cocoindex-data:/var/cocoindex \
  -e COCOINDEX_CODE_HOST_PATH_MAPPING="/workspace=$HOME" \
  cocoindex/cocoindex-code:latest

Shell wrapper for ccc

Core symbols most depended-on inside this repo

close
called by 37
src/cocoindex_code/project.py
encode_request
called by 32
src/cocoindex_code/protocol.py
decode_response
called by 30
src/cocoindex_code/protocol.py
user_settings_path
called by 23
src/cocoindex_code/settings.py
run
called by 22
src/cocoindex_code/grep.py
format_path_for_display
called by 20
src/cocoindex_code/settings.py
load_user_settings
called by 19
src/cocoindex_code/settings.py
encode_response
called by 16
src/cocoindex_code/protocol.py

Shape

Function 418
Method 78
Class 63
Route 16

Languages

Python100%
TypeScript1%

Modules by API surface

tests/test_settings.py72 symbols
tests/test_e2e.py42 symbols
src/cocoindex_code/cli.py40 symbols
src/cocoindex_code/settings.py37 symbols
tests/test_grep.py35 symbols
src/cocoindex_code/protocol.py30 symbols
src/cocoindex_code/client.py28 symbols
src/cocoindex_code/grep.py27 symbols
tests/test_cli_helpers.py25 symbols
src/cocoindex_code/daemon.py20 symbols
tests/test_protocol.py19 symbols
tests/test_shared.py15 symbols

For agents

$ claude mcp add cocoindex-code \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact