claude-context vs Semlith
claude-context run fully local with Ollama and Milvus, no API key, beside Semlith on the same repository and questions. Setup, index time and results.
Checked on 29 October 2026 with claude-context 0.1.15 (Milvus 3.0.3, Ollama 0.40.13 with nomic-embed-text) and semlith 0.50.0, on Flask 3.1.3 on an M1 MacBook Air with 8 GB.
What claude-context is
claude-context is Zilliz’s MCP server for code search (claude-context on GitHub). It splits your code into chunks, embeds them with a model you pick and keeps the vectors in Milvus. Its agent tools are index_codebase, search_code, get_indexing_status and clear_index, and search is hybrid, by meaning and by keywords.
Its default setup is in the cloud. The embedding provider defaults to OpenAI, and the README says “Claude Context needs a vector database” and points you to a Zilliz Cloud key. A local setup is supported too. Its FAQ answers “Yes, you can deploy Claude Context entirely on your local infrastructure”, with Milvus in Docker and Ollama for embeddings (FAQ). That is what we ran, with no API key and no account.
Running it with no API key
The local recipe needs Docker, four containers and a model.
curl -sSL https://github.com/milvus-io/milvus/releases/download/v3.0.3/milvus-standalone-docker-compose.yaml -o docker-compose.yaml
docker compose up -d
docker run -d --name cc-ollama --cpus=4 -p 127.0.0.1:11434:11434 ollama/ollama:0.40.13
docker exec cc-ollama ollama pull nomic-embed-textThen the MCP server starts from npm with four settings.
EMBEDDING_PROVIDER=Ollama EMBEDDING_MODEL=nomic-embed-text \
OLLAMA_HOST=http://127.0.0.1:11434 MILVUS_ADDRESS=localhost:19530 \
npx -y @zilliz/claude-context-mcp@0.1.15The images came to 6.14 GB, most of it the Ollama image, and the first npx start installed 418 MB of packages. While it indexed, Ollama peaked at 375 MiB of memory and Milvus at 220 MiB. We watched the server’s connections while it indexed, and it only talked to Milvus and Ollama on this machine. We found no telemetry in its own code.
Two things went wrong on the way, and we are saying so because you may hit them too. On the first try Milvus exited mid-index while Ollama had every CPU, so the second run capped Ollama at four. And get_indexing_status said the codebase was fully indexed after 92 seconds, with 100 files and 100 chunks.
✅ Codebase '…/flask' is fully indexed and ready for search.
📊 Statistics: 100 files, 100 chunks
📅 Status: completedIt wasn’t. The server’s own log said it finished at 1,266.9 seconds, about 21 minutes, with 86 files and 1,837 chunks.
[LOG] [BACKGROUND-INDEX] ✅ Indexing completed successfully! Files: 86, Chunks: 1837That time isn’t a fair speed test. Docker on a Mac has no GPU, so Ollama embedded on the CPU, and a native Ollama install would be quicker. We didn’t measure that. Semlith indexed the same checkout in 84.3 seconds on the Mac’s Neural Engine, with the docs included.
semlith index .indexed 211 files (2778 chunks, 5 images) in 84.3s — 0 already indexed, 4 skipped (4 empty), 0 removedSemlith is one 124 MB binary with no containers. It downloads its models on first use, and Models lists each one.
The same three questions
Here are the first five results from each, by file and lines. The claude-context lines are the Location of each result from search_code at its default limit.
Limit how big an uploaded request body can be. The answer is the max_content_length property in src/flask/wrappers.py, from line 59.
1. src/flask/wrappers.py:90-113
2. src/flask/wrappers.py:66-131
3. tests/test_request.py:46-70
4. tests/test_request.py:9-22
5. src/flask/wrappers.py:144-1591. 0.087 vf src/flask/wrappers.py:59-71
2. 0.083 vf src/flask/wrappers.py:91-106
3. 0.077 v docs/web-security.rst:26-38
4. 0.076 vf docs/patterns/fileuploads.rst:135-153
5. 0.072 vf src/flask/wrappers.py:105-123Both land in the right file. claude-context’s first hit is the form-memory limit just below it, and its second covers the property’s body and setter.
Where does Flask decide which error handler runs for an exception. The code that decides is _find_error_handler in src/flask/sansio/app.py.
1. tests/test_appctx.py:101-105
2. src/flask/sansio/scaffold.py:589-639
3. tests/test_blueprints.py:1027-1031
4. tests/test_subclassing.py:5-9
5. tests/test_signals.py:90-1011. 0.090 vf docs/errorhandling.rst:157-169
2. 0.087 vf docs/errorhandling.rst:223-244
3. 0.079 vf docs/errorhandling.rst:243-263
4. 0.067 vf docs/lifecycle.rst:143-153
5. 0.062 v docs/errorhandling.rst:132-148Neither found the function in its top five. claude-context had it at rank 8. Semlith went to the docs that explain the order Flask uses, which claude-context doesn’t index (see below). This is the question where plain grep did best, on the grep page.
How are blueprint URL prefixes joined with route rules. The join is line 100 of src/flask/sansio/blueprints.py.
1. src/flask/sansio/blueprints.py:324-377
2. tests/test_blueprints.py:920-950
3. tests/test_blueprints.py:114-125
4. src/flask/wrappers.py:167-195
5. src/flask/app.py:958-10231. 0.077 v src/flask/sansio/blueprints.py:417-434
2. 0.071 v src/flask/sansio/blueprints.py:73-93
3. 0.067 v src/flask/sansio/blueprints.py:92-111
4. 0.062 v docs/blueprints.rst:204-222
5. 0.059 v src/flask/sansio/blueprints.py:398-418Both start in the right file. Semlith’s third result holds line 100, and claude-context reached it at rank 6. Searches took 41 to 210 ms with claude-context and about 300 ms with Semlith.
These are three questions on one repository, not a benchmark. The published scorecard doesn’t include claude-context yet, so we give no percentage for it here.
What it indexes
claude-context indexes 25 kinds of code file plus Markdown and notebooks by default (the list in its source). It reads every file as text, so there is no PDF, Word or Excel, and no .rst, which is why Flask’s 79 docs pages were left out. You can add extensions, but not formats it can’t parse.
Semlith reads code and documents into the same index, including PDF, Word, PowerPoint and Excel. Search code and documents together shows a run.
Which to pick
If you already run Milvus or Zilliz Cloud, or you want to choose the embedding provider, claude-context fits in well and its hybrid search does find the right files. If you want nothing to sign up for, no Docker and documents in the same index, that is what we built Semlith for. Set up your agent client shows how to add it.
Serena
Serena gives agents IDE-style symbol tools over language servers. Semlith finds code from a question. What each does, run on Flask and SWE-bench Lite.
Portal
The local web portal inside the Semlith binary. Stores, search, the code graph, agents, the ledger, reports and settings, with screenshots.