A multi-provider embedding MCP server with local Milvus for semantic code search. Works with Claude Code, Cursor, Windsurf, and other MCP-compatible IDEs.
- Multi-provider embeddings: Local Qwen (free), OpenAI, or DeepSeek
- Dimension mismatch detection: Warns before indexing if dimensions don't match
- Zero cloud dependency: Use local Qwen for completely offline operation
- Dual deployment: Docker or local with pnpm
┌─────────────────┐ ┌────────────────────┐ ┌─────────────────┐
│ Your Codebase │────▶│ Embedding Provider │────▶│ Local Milvus │
│ │ │ (Qwen/OpenAI/etc) │ │ (Vector Store) │
└─────────────────┘ └────────────────────┘ └─────────────────┘
│ │
│ ┌────────────────────────────┐ │
└────────▶│ code-context-mcp │◀─────────┘
│ (MCP Server) │
└────────────────────────────┘
│
┌─────────────┴─────────────┐
▼ ▼ ▼
Claude Code Cursor Windsurf
# 1. Configure
cp .env.example .env
# Edit .env with your settings
# 2. Start all services
docker-compose up -d
# 3. Verify (~60 seconds to initialize)
curl http://localhost:9091/healthz # Milvus
curl http://localhost:3100/health # MCP ServerIDE Configuration (Docker):
{
"mcpServers": {
"code-context": {
"url": "http://localhost:3100/sse"
}
}
}# 1. Start only Milvus in Docker
docker-compose up -d milvus
# 2. Install and build
pnpm install
pnpm build
# 3. Configure IDE (see below)IDE Configuration (Local):
{
"mcpServers": {
"code-context": {
"command": "node",
"args": ["/path/to/code-context-mcp/dist/index.js"],
"env": {
"EMBEDDING_PROVIDER": "qwen-local",
"QWEN_LOCAL_BASE_URL": "http://172.18.35.123:8001/v1",
"QWEN_LOCAL_MODEL": "Qwen3-Embedding-4B",
"MILVUS_ADDRESS": "127.0.0.1:19530"
}
}
}
}| Tool | Description |
|---|---|
index_codebase |
Index a directory into Milvus |
search_code |
Semantic search across indexed code |
check_dimensions |
Check provider/collection dimension compatibility |
drop_collection |
Delete a collection (for re-indexing) |
get_provider_info |
Show current provider configuration |
Usage:
index_codebase /path/to/your/project
search_code "authentication logic"
check_dimensions
| Provider | Model | Dimensions | Cost |
|---|---|---|---|
qwen-local |
Qwen3-Embedding-4B | 2560 | Free |
openai |
text-embedding-3-small | 1536 | $0.02/1M tokens |
openai |
text-embedding-3-large | 3072 | $0.13/1M tokens |
deepseek |
deepseek-embedding-v2 | 768 | Paid |
| Variable | Description | Default |
|---|---|---|
EMBEDDING_PROVIDER |
openai, qwen-local, deepseek |
openai |
MILVUS_ADDRESS |
Milvus server address | 127.0.0.1:19530 |
DIMENSION_CHECK_ENABLED |
Check dimensions before indexing | true |
MCP_TRANSPORT |
stdio or http |
stdio |
MCP_PORT |
HTTP port (http mode) | 3100 |
Provider-specific:
| Provider | Variables |
|---|---|
| Local Qwen | QWEN_LOCAL_BASE_URL, QWEN_LOCAL_MODEL |
| OpenAI | OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_EMBEDDING_MODEL |
| DeepSeek | DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, DEEPSEEK_EMBEDDING_MODEL |
Different providers produce different dimensions. Switching providers requires re-indexing:
drop_collection code_context confirm=true
index_codebase /path/to/project
docker-compose up -d # Start all
docker-compose up -d milvus # Start only Milvus
docker-compose logs -f # View logs
docker-compose down # Stop all
docker-compose down -v # Reset (delete data)
docker-compose build --no-cache # Rebuildpnpm install # Install dependencies
pnpm build # Build TypeScript
pnpm dev # Run in dev mode
pnpm start # Run production buildcode-context-mcp/
├── docker-compose.yml # Milvus + MCP server
├── Dockerfile
├── package.json
├── tsconfig.json
├── .env.example
└── src/
├── index.ts # Entry point (stdio + HTTP)
├── config.ts # Configuration
├── providers/ # Embedding providers
│ ├── base.ts
│ ├── openai.ts
│ ├── qwen-local.ts
│ └── deepseek.ts
├── milvus/ # Milvus integration
│ ├── client.ts
│ └── dimension-checker.ts
└── tools/ # MCP tools
├── index-codebase.ts
├── search-code.ts
└── check-dimensions.ts
MIT