Relace MCP Server
<p align="right">
<strong>English</strong> | <a href="README.zh-CN.md">简体中文</a>
</p>
# Unofficial Relace MCP Server
[](https://pypi.org/project/relace-mcp/)
[](https://www.python.org/downloads/)
[](LICENSE)

[](https://scorecard.dev/viewer/?uri=github.com/possible055/relace-mcp)
> **Unofficial** — Personal project, not affiliated with Relace.
>
> **Built with AI** — Developed entirely with AI assistance (Antigravity, Codex, Cursor, Github Copilot, Windsurf).
MCP server providing AI-powered code editing and intelligent codebase exploration tools.
| Without | With `agentic_search` + `fast_apply` |
|:--------|:-------------------------------------|
| Manual grep, misses related files | Ask naturally, get precise locations |
| Edits break imports elsewhere | Traces imports and call chains |
| Full rewrites burn tokens | Describe changes, no line numbers |
| Line number errors corrupt code | 10,000+ tokens/sec merging |
## Features
- **Fast Apply** — Apply code edits at 10,000+ tokens/sec via Relace API
- **Agentic Search** — Agentic codebase exploration with natural language queries
- **Agentic Retrieval** — Hybrid semantic hints + live code exploration, with stale-hint support and explicit cloud maintenance (enable with `MCP_SEARCH_RETRIEVAL=1`; choose the backend with `MCP_RETRIEVAL_BACKEND`)
- **Cloud Search** — Semantic code search over cloud-synced repositories
## Quick Start
**Prerequisites:** [uv](https://docs.astral.sh/uv/), [git](https://git-scm.com/), [ripgrep](https://github.com/BurntSushi/ripgrep) (recommended)
Using the `relace` backend (default): get your API key from [Relace Dashboard](https://app.relace.ai/settings/billing), then add to your MCP client:
<details>
<summary><strong>Cursor</strong></summary>
`~/.cursor/mcp.json`
```json
{
"mcpServers": {
"relace": {
"command": "uv",
"args": ["tool", "run", "relace-mcp"],
"env": {
"RELACE_API_KEY": "rlc-your-api-key",
"MCP_BASE_DIR": "/absolute/path/to/your/project"
}
}
}
}
```
</details>
<details>
<summary><strong>Claude Code</strong></summary>
```bash
claude mcp add relace \
--env RELACE_API_KEY=rlc-your-api-key \
--env MCP_BASE_DIR=/absolute/path/to/your/project \
-- uv tool run relace-mcp
```
</details>
<details>
<summary><strong>Windsurf</strong></summary>
`~/.codeium/windsurf/mcp_config.json`
```json
{
"mcpServers": {
"relace": {
"command": "uv",
"args": ["tool", "run", "relace-mcp"],
"env": {
"RELACE_API_KEY": "rlc-your-api-key",
"MCP_BASE_DIR": "/absolute/path/to/your/project"
}
}
}
}
```
</details>
<details>
<summary><strong>VS Code</strong></summary>
`.vscode/mcp.json`
```json
{
"mcp": {
"servers": {
"relace": {
"type": "stdio",
"command": "uv",
"args": ["tool", "run", "relace-mcp"],
"env": {
"RELACE_API_KEY": "rlc-your-api-key",
"MCP_BASE_DIR": "${workspaceFolder}"
}
}
}
}
}
```
</details>
<details>
<summary><strong>Codex CLI</strong></summary>
`~/.codex/config.toml`
```toml
[mcp_servers.relace]
command = "uv"
args = ["tool", "run", "relace-mcp"]
[mcp_servers.relace.env]
RELACE_API_KEY = "rlc-your-api-key"
MCP_BASE_DIR = "/absolute/path/to/your/project"
```
</details>
## Configuration
| Variable | Required | Description |
|----------|----------|-------------|
| `RELACE_API_KEY` | ✅* | API key from [Relace Dashboard](https://app.relace.ai/settings/billing); required for Relace providers and cloud tools |
| `MCP_SEARCH_RETRIEVAL` | ❌ | Set to `1` to register the `agentic_retrieval` tool |
| `MCP_RETRIEVAL_BACKEND` | ❌ | Semantic retrieval backend: `relace` (default), `codanna`, `chunkhound`, or `none` |
| `MCP_RETRIEVAL_HINT_POLICY` | ❌ | Retrieval hint policy: `prefer-stale` (default) or `strict` |
| `MCP_BACKGROUND_INDEX_MONITOR` | ❌ | Opt-in periodic refresh monitor for local indexes; requires a pinned `MCP_BASE_DIR` and a local backend |
| `MCP_BACKGROUND_INDEX_INTERVAL_SECONDS` | ❌ | Periodic local index monitor interval in seconds (default: `300`) |
| `MCP_BACKGROUND_INDEX_INITIAL_DELAY_SECONDS` | ❌ | Initial delay before the first periodic local index check in seconds (default: `30`) |
| `MCP_SEARCH_TURN_STATUS_MODE` | ❌ | Turn-status user message policy: `always` (default), `final-only`, or `off` |
| `SEARCH_BASH_TOOLS` | ❌ | Enable `bash` during search runs: `1` (on, default), `0` (off) |
| `SEARCH_LSP_TOOLS` | ❌ | Enable LSP-assisted search: `1` (on), `0` (off, default) |
| `MCP_BASE_DIR` | ❌ | Project root override (auto-detected via MCP Roots → Git → workspace storage → CWD) |
| `MCP_LOGGING` | ❌ | File logging: `off` (default), `safe`, `full` |
| `MCP_DOTENV_PATH` | ❌ | Path to `.env` file for centralized config |
`*` Optional if **both**: (1) `APPLY_PROVIDER` and `SEARCH_PROVIDER` are non-Relace providers, and (2) `MCP_RETRIEVAL_BACKEND` is `codanna`, `chunkhound`, or `none`.
For `.env` usage, encoding settings, custom LLM providers, and more, see [docs/advanced.md](docs/advanced.md).
## Tools
Always available: `fast_apply`, `agentic_search`. `agentic_retrieval` requires `MCP_SEARCH_RETRIEVAL=1`. Cloud tools are available only when `MCP_RETRIEVAL_BACKEND=relace`. `index_status` is available for `relace`, `codanna`, and `chunkhound`, and hidden when `MCP_RETRIEVAL_BACKEND=none`.
Use MCP-native discovery surfaces: `list_tools()` for tools and `list_resources()` for resources.
For detailed parameters, see [docs/tools.md](docs/tools.md).
## Language Support
LSP tools use external language servers installed on your system.
| Language | Language Server | Install Command |
|----------|-----------------|-----------------|
| Python | basedpyright | (bundled) |
| TypeScript/JS | typescript-language-server | `npm i -g typescript-language-server typescript` |
| Go | gopls | `go install golang.org/x/tools/gopls@latest` |
| Rust | rust-analyzer | `rustup component add rust-analyzer` |
## Dashboard
Real-time terminal UI for monitoring operations.
```bash
pip install relace-mcp[tools]
relogs
```
For detailed usage, see [docs/dashboard.md](docs/dashboard.md).
## Benchmark
Evaluate `agentic_search` performance using the [Loc-Bench](https://huggingface.co/datasets/IvanaXu/LocAgent) code localization dataset.
```bash
git clone https://github.com/possible055/relace-mcp.git
cd relace-mcp
uv sync --extra benchmark
# Build dataset from Hugging Face
uv run --extra benchmark python -m benchmark.cli.build_locbench --output artifacts/data/raw/locbench_v1.jsonl
# Run evaluation
uv run --extra benchmark python -m benchmark.cli.run --dataset artifacts/data/raw/locbench_v1.jsonl --limit 20
```
All benchmark artifacts are written under `benchmark/.data/`.
For grid search, analysis tools, and metrics interpretation, see [docs/benchmark.md](docs/benchmark.md).
## Platform Support
| Platform | Status | Notes |
|----------|--------|-------|
| Linux | ✅ Fully supported | Primary development platform |
| macOS | ✅ Fully supported | All features available |
| Windows | ⚠️ Partial | `bash` tool unavailable; use WSL for full functionality |
## Troubleshooting
| Error or message | Solution |
|------------------|----------|
| `RELACE_API_KEY is required ...` | Set `RELACE_API_KEY` when using Relace providers or cloud tools |
| `NEEDS_MORE_CONTEXT` | Include 1-3 unique anchor lines near the target block |
| `INVALID_PATH` | Verify the path exists and is inside `MCP_BASE_DIR` or an allowed extra path |
| `FILE_TOO_LARGE` | File exceeds 10MB; split the change into smaller files or edits |
| `ENCODING_ERROR` | Set `RELACE_DEFAULT_ENCODING` explicitly for non-UTF-8 projects |
| `AUTH_ERROR` | Verify the API key and provider configuration |
| `RATE_LIMIT` | Retry later or reduce request volume |
| `NETWORK_ERROR` / `TIMEOUT_ERROR` | Check network access and retry |
| `APPLY_NOOP` | Add more specific anchors or concrete new lines so the merge can produce a diff |
| `MARKER_LEAKAGE` | Ensure placeholder markers are used only as placeholders, not expected literal output |
| `TRUNCATION_DETECTED` | Split large deletion-heavy edits or use explicit remove directives |
| `BLAST_RADIUS_EXCEEDED` | Break the change into smaller, more local edits |
## Development
```bash
git clone https://github.com/possible055/relace-mcp.git
cd relace-mcp
uv sync --extra dev --extra benchmark
uv run pytest
uv run --extra dev --extra benchmark pytest benchmark/tests -q
```
## License
MIT
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose with descriptions that explicitly differentiate similar tools (e.g., agentic_search vs cloud_search based on query type). There is no functional overlap.
Cloud operations use a consistent 'cloud_' prefix, but 'agentic_search', 'fast_apply', and 'index_status' break the pattern. Mix of verb_noun and adjective_noun styles reduces predictability.
Seven tools is well-scoped for a code search and editing server. Each tool addresses a specific need without redundancy or excessive complexity.
Covers search (local and cloud) and file editing, but lacks tools for reading full file content, deleting files, or managing local files beyond edits. Users may need to rely on external tools for basic operations.