Semlith

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-text

Then 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.15

The 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.

get_indexing_status at 92.4 s
✅ Codebase '…/flask' is fully indexed and ready for search.
📊 Statistics: 100 files, 100 chunks
📅 Status: completed

It 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.

Server log
[LOG] [BACKGROUND-INDEX] ✅ Indexing completed successfully! Files: 86, Chunks: 1837

That 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 .
Output
indexed 211 files (2778 chunks, 5 images) in 84.3s — 0 already indexed, 4 skipped (4 empty), 0 removed

Semlith 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.

claude-context
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-159
semlith search -k 5
1. 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-123

Both 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.

claude-context
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-101
semlith search -k 5
1. 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-148

Neither 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.

claude-context
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-1023
semlith search -k 5
1. 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-418

Both 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.