
I've just published goindexer — a local-first semantic code search tool that plugs into any coding tool that supports MCP. It uses tree-sitter chunking, Ollama embeddings, and SQLite vector search. No cloud, no API keys.
What is goindexer?
Finding the right code in a large codebase is hard. Grep finds exact strings. IDE search finds symbols. But what about concepts? "Where do we handle authentication errors?" or "Show me the OTP validation logic" — those questions need semantic understanding. I built goindexer to solve exactly that: semantic code search that runs entirely on your machine and plugs into your favorite AI tools via MCP (Model Context Protocol).
goindexer is an MCP server that indexes your codebase and exposes semantic search, grep, file reading, structure listing, and symbol reference finding. It's designed to work with Cursor, Claude Desktop, Gemini CLI, or any MCP client. Everything runs locally: tree-sitter for parsing, Ollama for embeddings, SQLite for vector storage. No cloud APIs, no API keys.
The motivation was to save on some tokens and speed up the search process for cli tools like claude/codex/gemini and vscode. They usually 'grep search' for patterns and then read the context around the match. goindexer can do that in one go which saves on tokens and time.
The stack
- Tree-sitter — Language-aware chunking so functions, classes, and methods stay intact instead of arbitrary line splits
- Ollama — Local embeddings with
qwen3-embedding:4b - SQLite + sqlite-vec — Vector similarity search in a single file, no separate vector DB
- File watcher — Re-indexes in the background when files change
Why local?
I wanted a codebase indexer that:
- Respects privacy — Your code never leaves your machine
- Works offline — No dependency on external APIs
- Integrates everywhere — MCP means Codex, Claude, Gemini, VSCode, Cursor and future clients all get the same tools
- Stays in sync — File watching keeps the index updated as you edit
Ollama makes local embeddings practical. Tree-sitter gives structure-aware chunking. SQLite + sqlite-vec keeps the stack simple. The result is a single binary that does one job well.
If you use any of the cli tools like claude/codex/gemini, add goindexer as an MCP server and point it at your project. Index once, then ask your the model to search / modify your codebase, it'll use the tools to do so. It's a different way to navigate code. (you'll need to ask it to index the codebase first + tell it to use the goindexer MCP server for better results)
See you next time! 🔍👨💻