reflex-search 1.6.1

A local-first, structure-aware code search engine for AI agents
Documentation
# Claude Code + Reflex MCP Quickstart

Get Reflex working as an MCP tool server inside Claude Code in under 5 minutes.

---

## Prerequisites

- [Claude Code]https://claude.ai/code installed and working
- A project directory you want to search

---

## Step 1 — Install Reflex

**Via npm (recommended):**

```bash
npm install -g reflex-search
```

**Via cargo:**

```bash
cargo install reflex-search
```

Verify the install:

```bash
rfx --version
```

> **Cargo users:** If `rfx` is not found after install, add `~/.cargo/bin` to your `PATH`:
> ```bash
> export PATH="$HOME/.cargo/bin:$PATH"
> ```

---

## Step 2 — Add Reflex to Claude Code

Open your Claude Code MCP settings file. The right scope depends on your use case:

| Scope | File |
|-------|------|
| All projects (global) | `~/.claude/claude_code_config.json` |
| This project only | `.claude/claude_code_config.json` |

Add the `reflex` entry under `mcpServers`:

```json
{
  "mcpServers": {
    "reflex": {
      "command": "rfx",
      "args": ["mcp"],
      "env": {},
      "disabled": false
    }
  }
}
```

> **Note:** `rfx mcp` runs as a stdio MCP server. Claude Code starts and manages it
> automatically — you should not run this command manually in your terminal.

After saving, restart Claude Code (or use **Reload Window** in VS Code) to pick up the
new server.

---

## Step 3 — Index your project

Navigate to your project root and build the search index:

```bash
cd /path/to/your/project
rfx index
```

Indexing is incremental: subsequent runs only process changed files. The first index on a
typical project (10–50k files) takes a few seconds.

> **Tip:** Add `.reflex/` to your `.gitignore` to keep the cache local.
> ```
> echo ".reflex/" >> .gitignore
> ```

---

## Step 4 — Your first search

In a Claude Code conversation, ask a question that requires code search. Claude invokes
Reflex automatically via MCP:

> *"Where is the `parse_config` function defined in this project?"*

Behind the scenes, Claude calls the `search_code` tool:

```json
{
  "tool": "search_code",
  "arguments": {
    "pattern": "parse_config",
    "symbols": true
  }
}
```

The response includes exact file paths, line numbers, and code previews — no shell
scripting or manual `grep` required.

---

## Key Tools for AI Agents

The five tools Claude uses most often in a Reflex-indexed codebase:

### `search_code` — find anything

Full-text or symbol-only search with line numbers and code previews.

```json
// All usages of a function
{ "pattern": "process_request" }

// Definitions only (not usages)
{ "pattern": "process_request", "symbols": true }

// Filter to a specific language
{ "pattern": "process_request", "lang": "rust", "symbols": true }

// Scope to a subdirectory
{ "pattern": "process_request", "glob": ["src/api/**/*.rs"] }
```

### `list_locations` — where, without the noise

Returns `[{path, line}]` only — no code previews. Use this to quickly enumerate all
locations before deciding which files to read.

```json
{ "pattern": "TODO" }
// → [{"path": "src/auth.rs", "line": 42}, {"path": "src/cache.rs", "line": 7}, ...]
```

### `gather_context` — orient to a new project

Returns directory structure, detected frameworks, entry points, and file-type
distribution. Run this at the start of a session when you are unfamiliar with a codebase.

```json
{ "structure": true, "framework": true, "entry_points": true }
```

### `get_dependencies` — what does this file import?

Returns all static imports for a file with their classification
(internal / external / stdlib).

```json
{ "path": "src/auth/middleware.rs" }
```

### `index_project` — keep the index fresh

Trigger a reindex after code changes (git pull, file creation, refactor).

```json
{}

// Force a full rebuild if results seem wrong:
{ "force": true }
```

> **Planned:** `find_references` for cross-file symbol usage tracking is coming in a
> future release.

---

## Tips

### Re-indexing after code changes

Reflex does not watch for changes by default. Re-index manually after significant edits:

```bash
rfx index          # Fast incremental update (changed files only)
rfx index --force  # Full rebuild from scratch
```

Or run the watcher to keep the index live during active development:

```bash
rfx watch
```

### Glob filters in monorepos

Scope searches to a specific package or service to reduce noise:

```json
{
  "pattern": "useAuth",
  "glob": ["packages/web/**/*.ts"]
}
```

### Excluding noisy directories

```json
{
  "pattern": "TODO",
  "exclude": ["**/node_modules/**", "**/vendor/**", "**/target/**"]
}
```

### Index staleness detection

When Claude gets results that look stale, it can call `index_project` to refresh and then
retry — all within the same conversation. You do not need to leave the chat.

---

## Troubleshooting

### "Index not found" error

The `.reflex/` cache has not been built yet for this directory. Run `rfx index` from the
**project root** — the same directory you opened in Claude Code.

```bash
rfx index
```

### Missing new files or stale results

After pulling changes or creating files, the index may lag behind. Re-index:

```bash
rfx index
```

If errors persist after an incremental index, force a full rebuild:

```bash
rfx index --force
```

### MCP server not connecting

1. Confirm `rfx` is on your `PATH`:
   ```bash
   which rfx
   ```
2. Check the settings JSON for syntax errors — trailing commas and unquoted keys break
   JSON parsing.
3. Restart Claude Code after editing the config file.
4. Check Claude Code's MCP server logs for error output from `rfx mcp`.

### MCP server exits unexpectedly

`rfx mcp` runs as a long-lived process over stdio. If it exits unexpectedly, Claude Code
will surface an error in the tool result. Run `rfx mcp` manually in a terminal to see any
startup errors, then report a bug with the output.

---

## Legacy: CLI / JSON Mode

If you are integrating Reflex into a shell script or non-MCP agent, you can use the
`--json` flag directly on the CLI:

```bash
rfx query "pattern" --json
```

### JSON Output Format

The `--json` response includes a `metadata` block for staleness detection:

```json
{
  "metadata": {
    "status": "fresh",
    "current_branch": "main",
    "indexed_branch": "main",
    "current_commit": "74eb454...",
    "indexed_commit": "74eb454..."
  },
  "results": [
    {
      "path": "./src/cache.rs",
      "lang": "rust",
      "kind": "Struct",
      "symbol": "CacheManager",
      "span": { "start_line": 42, "start_col": 0, "end_line": 45, "end_col": 1 },
      "preview": "pub struct CacheManager {"
    }
  ]
}
```

**`metadata.status` values:**

| Value | Meaning |
|-------|---------|
| `fresh` | Index is up to date |
| `branch_not_indexed` | Current git branch has not been indexed |
| `commit_changed` | HEAD has moved since last index |
| `files_modified` | Files modified since last index (detected via sampling) |

When `status !== "fresh"`, the response also includes `reason` (human-readable
explanation) and `action_required` (command to fix, typically `"rfx index"`).

### Bash example

```bash
#!/bin/bash
response=$(rfx query "pattern" --json)
status=$(echo "$response" | jq -r '.metadata.status')

if [ "$status" != "fresh" ]; then
    echo "Index stale, re-indexing..." >&2
    rfx index
    response=$(rfx query "pattern" --json)
fi

echo "$response" | jq '.results'
```

### Python example

```python
import subprocess, json

def query_with_auto_reindex(pattern: str):
    response = json.loads(
        subprocess.check_output(["rfx", "query", pattern, "--json"])
    )
    if response["metadata"]["status"] != "fresh":
        print(f"Index stale: {response['metadata']['reason']}")
        subprocess.run(["rfx", "index"], check=True)
        response = json.loads(
            subprocess.check_output(["rfx", "query", pattern, "--json"])
        )
    return response["results"]
```

### Exit codes

| Code | Meaning |
|------|---------|
| `0` | Success (results found, index fresh) |
| `1` | No results found or error |