Semantic code search and navigation across repositories indexed by a cix server, via the cix_* MCP tools. Use when finding code by meaning rather than exact strings — "find the authentication middleware", "where is X defined?", "what calls this function?", "how does Y work in this codebase?", "search the codebase for ...", or "explore this repo". The cix connection talks to a server that may hold many repos and has no current project, so always discover projects first and pass an explicit pro...
Installs into .claude/skills of the current project.
Are you the author of Cix?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/dvcdsys-cix-code-index)
---
name: cix
description: Semantic code search and navigation across repositories indexed by a cix server, via the cix_* MCP tools. Use when finding code by meaning rather than exact strings — "find the authentication middleware", "where is X defined?", "what calls this function?", "how does Y work in this codebase?", "search the codebase for ...", or "explore this repo". The cix connection talks to a server that may hold many repos and has no current project, so always discover projects first and pass an explicit project (a host_path) to per-repo tools.
metadata:
version: "0.1.0"
surface: cowork
---
# Code Index (`cix`) — Semantic Code Search & Navigation
cix is a semantic code index that understands code via embeddings + AST
parsing. You reach it through the `cix_*` MCP tools (no shell, no CLI). The
right reflex is **"cix when you don't have a pointer; read/grep when you do."**
**This connection talks to a cix SERVER, not a single project.** One server may
hold many indexed repositories, and nothing is inferred from a working directory
— there is **no "current project."** Every per-repo tool needs an explicit
`project` (a repository's `host_path`). So the first move is always to discover
what's indexed.
## First, orient
Before any per-repo call:
1. Call `cix_list_projects` to see the indexed repositories. Each row has a
`host_path` (e.g. `/Users/me/acme-api` or `github.com/acme/api@main`).
2. Pick the `host_path` of the repo the user means, and pass it as the
`project` argument to every per-repo tool below.
If the repo the user is asking about is **not** in `cix_list_projects`, this
skill cannot index it — indexing is server-side. Tell the user to index it (via
the cix dashboard, or `cix init` on the machine running the cix server), then
retry.
You don't have to memorize host_paths: if you call a per-repo tool with a
missing or unknown `project`, the server replies with an error that **lists the
valid projects**, so you can self-correct in one step.
(Multi-server: `cix_list_servers` lists configured servers; every tool takes an
optional `server` argument. Omit it for the default — most setups have one
server. Only pass `server` when the user names a specific backend; never guess a
name — call `cix_list_servers`.)
## When to use which
**Reach for cix first when:**
- The starting point is open-ended ("how does indexing work?", "find the
authentication middleware", "where is the main entry point?")
- You need cross-file navigation (definitions / references / callers)
- You're searching by *meaning*, not an exact string (`"JWT validation"` should
find `verifyToken` even without that phrase)
- You're exploring an unfamiliar package or repo
**Skip cix when:**
- A failing test or stack trace already names the file and function, and that
file is available locally — just Read it
- You're chasing an exact literal (a specific error message, a config key, an
import path) in a repo you have on disk — a literal Grep is more precise
- You're inside dependencies (`node_modules`, `vendor`, `.venv`) — not indexed
Note: for **remote-only** indexed repos (host_path like
`github.com/owner/repo@branch`, not on disk), the `cix_*` tools are your *only*
way in — there's no local tree to Read or Grep. Use cix for everything there.
If cix returns nothing relevant after one well-formed query, fall back to
read/grep on a local repo — don't loop on cix.
## Pick the cheapest tool that answers the question
When you already know a symbol's **name**, reach for `cix_definitions` /
`cix_references` before `cix_search`. They return **metadata only** (file, line,
signature, call sites) — no source bodies — so they cost far fewer tokens.
| Tool | Returns | Relative size |
|---|---|---|
| `cix_definitions` | definition location + signature | ~1× |
| `cix_references` | every call site (file:line) | ~4× |
| `cix_search` | matching code **with full source bodies** | ~28× |
Rule of thumb:
- Know the name, want "where is it defined / who calls it" → `cix_definitions` /
`cix_references`. Cheap, precise, no source noise.
- Don't know the name, searching by *meaning* → `cix_search`.
- Escalate to `cix_search` for a *known* symbol only when you actually need to
read the surrounding implementation, not merely locate it.
## Tools reference
Every tool below takes `project` (a host_path from `cix_list_projects`) and an
optional `server`.
### `cix_search` — find code by meaning
Args: `project` (required), `query` (required), and optional `limit`, `lang`,
`in`, `exclude`, `min_score`.
- `in` — restrict to these paths (relative paths resolve against the repo root).
- `exclude` — drop these paths from results.
- `lang` — filter by language (e.g. `go`, `python`, `typescript`).
- `limit` — max **files** returned (default 5; output groups all matches per
file, so 5 files ≈ many snippets). Bump up only for broad exploration.
- `min_score` — minimum relevance 0.0–1.0 (default 0.4).
Examples (as tool calls): `cix_search(project, "authentication middleware")`;
`cix_search(project, "config parsing", in=["internal/config"])`;
`cix_search(project, "API routes", lang=["go"])`.
### `cix_definitions` — where a symbol is defined
Args: `project`, `symbol` (required); optional `kind`
(function/class/method/type), `file`, `limit`.
### `cix_references` — where a symbol is used
Args: `project`, `symbol` (required); optional `file`, `limit`.
### `cix_symbols` — find symbols by name
Args: `project`, `query` (required); optional `kinds`, `limit`.
### `cix_files` — find files by path pattern
Args: `project`, `pattern` (required); optional `limit`.
### `cix_summary` — project overview
Args: `project`. Returns languages, file/chunk/symbol totals, top directories,
key symbols. A good first call when drilling into an unfamiliar repo.
### `cix_file` — read an actual file (whole or a line range)
Args: `project`, `file` (required); optional `start`, `end` (1-based inclusive).
Returns the file's real contents from the server's checkout. **This is your
primary way to read source here** — Cowork has no local filesystem, so instead
of stitching code together from `cix_search` snippets, pull the whole file (or a
range) directly. **External (GitHub-backed) projects only**: for a local project
the server holds no files and returns an error.
### `cix_tree` — list a directory (one level)
Args: `project`; optional `dir` (omit for repo root). ls-like, no recursion —
use it to navigate the file tree before reading a file. External projects only.
(There is no init / reindex / status / watch tool — indexing is server-side.
If results seem stale or a repo is missing, ask the user to (re)index on the
server host.)
## Search quality — what scores mean
Default `min_score` 0.4 is calibrated for the production embedding model
(path-aware preamble). Rough landscape:
| Score | Meaning |
|---|---|
| 0.65+ | Exact / very strong match — almost certainly relevant |
| 0.50–0.65 | Strong match — usually relevant |
| 0.40–0.50 | Weaker match — sometimes useful |
| <0.40 | Noise — filtered out by default |
If a query returns nothing, lower the floor explicitly: `min_score: 0.2` for
very specific or long-tail queries. Don't go below 0.2 — that's noise.
## Writing better queries — leverage path-aware embedding
Each chunk is embedded with its file path, language, and symbol name in the
preamble, so **mentioning a file/dir/symbol you already know boosts ranking**:
- Generic: `cix_search(project, "validation")`
- Better — pins to the auth area: `cix_search(project, "validation in auth middleware")`
- Even better when you know the symbol: `cix_search(project, "ValidateToken")`
Queries that name the *kind of thing* and *where it lives* outperform
single-word queries. Write what you'd ask a colleague — natural language, not
regex.
## Usage patterns
**Exploring an unfamiliar repo (cix's strongest case):**
`cix_summary(project)` → `cix_search(project, "main entry point server")` →
`cix_search(project, "database connection setup")` →
`cix_search(project, "request handler", in=["api"])`.
**Tracing a symbol end-to-end:**
`cix_definitions(project, "HandleRequest")` (where defined?) →
`cix_references(project, "HandleRequest")` (who calls it?) →
`cix_search(project, "HandleRequest error handling")` (how are errors handled?).
**Narrowing scope:** use `in` / `exclude` to focus, e.g.
`cix_search(project, "config", in=["cmd"], exclude=["legacy"])`.
## Tips
- Output groups by file: each result is a file with its matches inside, ordered
by line number. The `[best 0.NN]` is the top hit's score in that file.
- `cix_definitions` is a faster path than `cix_symbols` when you already know
the exact name.
- `exclude` complements `in` — drop noisy dirs (`bench/`, `legacy/`, vendored
code) inline.
- Don't loop. If a query returns nothing useful after one well-phrased attempt
plus one `min_score: 0.2` retry, fall back to read/grep on a local repo.