search_local_contextLABSCO SUMMARY
Nothing leaves the machine, and that is the entire point.
Paired with a local model, indexing, embeddings, retrieval and generation all run offline — which is what makes it viable for NDA-bound or air-gapped work where a cloud index is simply not allowed. Two limits stated plainly by the author: this is v0.1 and headless, and scanned image-only PDFs are not handled because there is no OCR yet. Citation line numbers refer to the extracted text, not PDF page numbers.
What it is
A single Rust binary that indexes folders on your machine and exposes them as one tool. Retrieval is hybrid — BM25 full-text and vector search merged by reciprocal-rank fusion — with tree-sitter chunking for code, heading-aware chunking for Markdown, and citations back to the source lines.
What you get
- One tool,
search_local_context, which any MCP client can call — Claude Desktop, Cursor, LM Studio and others - A
folder_filterthat scopes a search to one indexed folder, which is how one index serves several clients without them bleeding into each other - Conversation memory: ingest a Claude conversations.json export and search every past chat from any future session
- Indexing by extension — md, markdown, txt, rs, py, ts, tsx, js, jsx, mjs, go and pdf — skipping .git, node_modules, target, .venv, dist, build and the other usual directories
- A filesystem watcher that re-indexes an edited file in about 500ms, and a content-hash embedding cache so re-indexing unchanged content makes zero embedding calls
- PII masking on by default, covering email addresses, OpenAI keys, AWS keys, GitHub tokens and JWTs
- Terminal commands for indexing, watching, clearing, searching without a model, and asking a question answered by a local chat model with citations
Requirements
The crate ucp-local, version 0.1.0, installed with cargo — the binary on your PATH is ucp-local and MCP clients launch it as ucp-local serve. Ollama is required for embeddings, with the nomic-embed-text model pulled; a chat model is optional and only needed for the ask command. Poppler's pdftotext is recommended for PDFs — without it, body text goes missing from files whose fonts lack a ToUnicode map. Configuration lives at ~/.config/ucp/config.toml.
Setup effort
Follow the published steps — brew install ollama poppler
USE CASES
Searching every past AI conversation you have had
Ingest the export once and every future session can query it, instead of scrolling through old threads.
Grounding an agent in code its own indexer cannot reach
Index sibling repositories and private notes and surface them alongside the editor's own context.
Asking questions of a document corpus offline
Index the PDFs and notes, and answer against them with a local model and line-level citations.
Keeping one client's context away from another's
Scope the search to a single folder so consulting work for different clients stays separated.
1 tool
Listed in project docs. Your client may show a different list.
BEFORE YOU INSTALL
What to know first
Tools you get
1 tool named in the project's documentation. Indexing, watching and ingesting run through the ucp-local CLI; the MCP server only offers search_local_context.
Requires
- Rust
- Ollama, with the nomic-embed-text model pulled
- Poppler (pdftotext), recommended for PDFs
INSTALLATION
Connect your client
Server setup
Install Ollama and Poppler with the commands for your OS. On macOS:
brew install ollama popplerOr, on Debian/Ubuntu:
sudo apt install poppler-utils
curl -fsSL https://ollama.com/install.sh | shOr, on Windows:
choco install poppler ollamaStart Ollama if it is not already running (or use the menu-bar app):
ollama serve &Pull the embedding model:
ollama pull nomic-embed-textInstall UCP from crates.io (needs Rust):
cargo install ucp-localIndex something:
ucp-local index ~/Documents/notesAdd the block from the client tabs on this page to your client config (Claude Desktop, ~/.cursor/mcp.json, or LM Studio's MCP servers section), using the full path to ucp-local, and restart the client
MCP Clients
Claude Desktop, Cursor, LM Studio
{
"mcpServers": {
"ucp-local": {
"command": "<YOUR_PATH_TO_UCP_LOCAL>",
"args": [
"serve"
]
}
}
}Other MCP Clients
Any client following the MCP spec (Zed, Continue.dev, Goose, custom Agent SDK apps, etc.) takes the same command + args shape as the other tabs
If your client expects a JSON-RPC stdio server, have it launch:
ucp-local serve