Content
# mcplens
> Semantic codebase search for AI coding assistants — 70-85% token reduction, 100% local, zero cloud dependency.
AI coding assistants like Claude Code, Cursor, and Codex are powerful — but they have a fundamental problem: when you ask a question, they read files by guessing which ones are
relevant based on path and filename heuristics. On a medium-sized project, a single query can consume 10,000–20,000 tokens of context just loading files that may not even be
relevant.
`claude-context-optimizer` solves this by giving your AI assistant **semantic search** over your codebase. Instead of reading files blindly, it calls
`search_code("how does payment work?")` and gets back only the 5 most relevant code chunks — indexed locally using embeddings, stored in SQLite, zero data leaving your machine.
---
## How it works
When you open your AI assistant in a project:
1. The MCP server starts automatically (spawned via stdio by the assistant)
2. It compares file hashes against the last index and **re-indexes only what changed** (delta indexing)
3. A file watcher keeps the index in sync as you code
4. Your assistant now has access to 3 semantic search tools instead of reading raw files
```
You ask: "how does the Asaas webhook work?"
Without cco: With cco:
Read AsaasWebhookController.php search_code("asaas webhook")
Read AsaasWebhookService.php → returns 5 relevant chunks
Read PaymentService.php → ~800 tokens total
Read BillingModule.php
Read ...8 more files
→ ~15,000 tokens total
```
### Under the hood
* **Embeddings:**[Ollama](https://ollama.ai/) with `nomic-embed-text` (768-dim) — 100% local, free, no API key
* **Vector store:** SQLite with cosine similarity computed in-process — no extra infrastructure
* **Chunking:** AST-aware via `tree-sitter` (splits by function/class) with sliding window fallback
* **Transport:** MCP stdio — the assistant spawns the process and communicates via pipe
* **Persistence:** Index lives in `.claude-context/index.db` and survives between sessions
---
## Compatibility
`claude-context-optimizer` works with **any MCP-compatible AI coding assistant**. MCP (Model Context Protocol) is an open standard — the same server works across all clients
without modification.
| Assistant | Status | Config location |
|----------------|--------|---------------------------------------|
| Claude Code | ✅ | `~/.claude.json` |
| Cursor | ✅ | `.cursor/mcp.json` |
| Windsurf | ✅ | `~/.codeium/windsurf/mcp_config.json` |
| Trae | ✅ | `.vscode/settings.json` |
| Codex | ✅ | MCP config (preview) |
| Any MCP client | ✅ | Follows MCP stdio spec |
The `init` command detects which assistants you use and registers the server automatically in the right place.
---
## Token savings
The index lives locally. The assistant fetches only what's relevant. The numbers speak for themselves:
| Project size | Without cco | With cco | Savings |
|--------------|---------------------|---------------------|-----------|
| \~200 files | \~5k tokens/query | \~1.2k tokens/query | **\~75%** |
| \~1000 files | \~10k tokens/query | \~1.5k tokens/query | **\~85%** |
| \~5000 files | \~20k+ tokens/query | \~2k tokens/query | **\~90%** |
These are context tokens — the portion you control. Savings scale with project size because larger projects trigger more heuristic file reads by default.
---
## Tools exposed
| Tool | When to use |
|----------------------|----------------------------------------------------------------------------------|
| `search_code(query)` | Conceptual queries:*"how does billing work"*,*"where is authentication handled"* |
| `get_symbol(name)` | Exact lookups:*"find PaymentService"*,*"where is handleWebhook defined"* |
| `index_status` | Debug: how many files and chunks are currently indexed |
Add this to your project's `CLAUDE.md` (or equivalent) to guide the assistant:
```markdown
## Context Search
Always use MCP tools before reading files:
- search_code() — for conceptual or natural language queries
- get_symbol() — for exact class/function/method lookups
Only read full files if both tools return insufficient context.
```
---
## Installation options
### Option A — npm (requires Ollama)
Zero overhead. Best for developers who already have Ollama installed.
```bash
npm install -g @vmsfigueredo/mcplens
ollama pull nomic-embed-text:latest
cd your-project && mcplens init
```
See [INSTALL.md](INSTALL.md) for full setup instructions.
### Option B — Docker
> **Not available yet.** Docker distribution (bundling Node + Ollama + model) is planned but not implemented. Track progress in the [Roadmap](#roadmap).
---
## Configuration
`.claude-context/config.json` is created automatically by `init`. Edit it to customize behavior:
```json
{
"embeddings": {
"provider": "ollama",
"ollamaUrl": "http://localhost:11434",
"ollamaModel": "nomic-embed-text:latest"
},
"search": {
"topK": 5,
"minScore": 0.3
},
"ignore": [
"**/tests/fixtures/**"
]
}
```
To use OpenAI embeddings instead:
```json
{
"embeddings": {
"provider": "openai",
"openaiApiKey": "sk-...",
"openaiModel": "text-embedding-3-small"
}
}
```
---
## What gets indexed
**Included by default:**`.ts .tsx .js .jsx .mjs .php .svelte .vue .py .rb .go .rs .css .scss .json .yaml .yml .md .sql`
**Ignored by default:**`node_modules`, `.git`, `vendor`, `dist`, `build`, `.next`, `.claude-context`
The `.claude-context/` directory is automatically added to `.gitignore`.
### Index size reference
| Project | Files | Approx size |
|---------|--------------|-------------|
| Small | \~200 files | \~15 MB |
| Medium | \~1000 files | \~70 MB |
| Large | \~5000 files | \~350 MB |
---
## Dashboard
A lightweight web dashboard is available at `http://localhost:3000` while the server is running:
* **Overview** — files indexed, chunks, index size, Ollama status
* **Activity** — live feed of re-indexing events
* **Search** — test queries manually and see scores (useful for calibrating `minScore`)
* **Files** — full list of indexed files with chunk counts
The dashboard runs on port `3333` by default. If that port is already taken (e.g. two projects open simultaneously), the port is automatically calculated from the project name. To
open:
```bash
mcplens dashboard
```
To disable: add `--no-dashboard` to the server args in your MCP config.
---
## Privacy
Everything runs on your machine:
* Embeddings are generated locally via Ollama — your code never leaves
* The index is stored in `.claude-context/index.db` in your project
* No telemetry, no analytics, no accounts
> ⚠️ If you use the OpenAI embeddings option, chunks are sent to OpenAI's API.
---
## Why not just use existing tools?
| Tool | Language | Fully local? | Install friction |
|------------------------------|-------------|----------------------------------|--------------------------------------|
| `claude-context`(Zilliz) | TypeScript | ❌ requires Zilliz Cloud + OpenAI | Medium |
| `claude-context-local` | Python | ✅ | High (torch, FAISS, pipx) |
| `cocoindex-code` | Python | ✅ | Medium (pipx, sentence-transformers) |
| `codegraph` | Rust | ✅ | High (must compile Rust) |
| **@vmsfigueredo/mcplens** | **Node.js** | **✅** | **Low (`npm install -g`)** |
The goal is to be the **most accessible option for JS/TS developers** — not the most feature-complete. If you already have Node.js, you're one command away.
---
## Roadmap
* [X] AST-based chunking via tree-sitter
* [X] Delta indexing by file hash
* [X] Real-time file watcher
* [X] Dashboard
* [X] Multi-client init (Claude Code, Cursor, Windsurf, Trae)
* [X] Hybrid search (BM25 + semantic)
* [ ] Docker option with bundled Ollama
* [ ] Contextual retrieval (LLM-generated chunk summaries)
* [ ] Token usage analytics via Claude Code hooks
---
## Contributing
PRs welcome. See [INSTALL.md](INSTALL.md) for local development setup.
## Built with
This project was built using Claude Code — which is exactly why it exists.
## License
MIT
Connection Info
You Might Also Like
everything-claude-code
Complete Claude Code configuration collection - agents, skills, hooks,...
markitdown
MarkItDown-MCP is a lightweight server for converting URIs to Markdown.
cc-switch
All-in-One Assistant for Claude Code, Codex & Gemini CLI across platforms.
servers
Model Context Protocol Servers
servers
Model Context Protocol Servers
Time
A Model Context Protocol server for time and timezone conversions.