ollqd
Provides local embedding and chat model inference for code and document indexing and RAG.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ollqd search for how authentication is implemented"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ollqd — MCP Client-Server RAG System
Local-first RAG system that indexes codebases and documents into Qdrant using Ollama embeddings. Exposes everything through MCP (Model Context Protocol) so AI assistants can search your code via tool-calling.
Architecture
┌──────────────────────────────────────────────────────────────────┐
│ User Interface │
│ ┌─────────────┐ ┌─────────────────────────────────────────┐ │
│ │ ollqd-chat │ │ Claude Desktop / any MCP host │ │
│ │ (CLI / REPL) │ │ (connects to ollqd-server directly) │ │
│ └──────┬───────┘ └────────────────┬────────────────────────┘ │
└─────────┼──────────────────────────┼────────────────────────────┘
│ stdio JSON-RPC │ stdio JSON-RPC
┌─────────▼──────────────────────────▼────────────────────────────┐
│ Ollqd MCP Server (FastMCP) │
│ ┌───────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │
│ │index_codebase │ │index_documents │ │semantic_search │ │
│ │index docs │ │markdown/text/rst│ │embed query → Qdrant │ │
│ └───────┬───────┘ └────────┬────────┘ └──────────┬──────────┘ │
│ ┌───────┴──────┐ ┌───────┴────────┐ │ │
│ │list_collections│ │delete_collection│ │ │
│ └──────────────┘ └────────────────┘ │ │
└─────────┬──────────────────────────────────────────┼────────────┘
│ /api/embed │
┌─────────▼──────────┐ ┌──────────▼─────────┐
│ Ollama │ │ Qdrant │
│ nomic-embed-text │ │ cosine similarity │
│ + chat models │ │ payload indexes │
└────────────────────┘ └────────────────────┘How it works
Discovery — Walks the codebase, filters by language (40+ extensions), skips lock files / build artifacts / vendor dirs.
Code-aware chunking — Splits files at natural code boundaries (function defs, class declarations, impl blocks) rather than blindly cutting at token limits. Overlapping windows preserve context.
Embedding — Sends chunks to Ollama's
/api/embedin batches. Each chunk is prefixed with file path + language + line range for better semantic grounding.Storage — Upserts into Qdrant with full metadata payload. Payload indexes on
file_path,language, andcontent_hashenable filtered search and incremental re-indexing.RAG loop — The client sends user queries to Ollama with MCP tools attached. Ollama decides when to call
semantic_search, gets results from the server, and synthesizes a final answer with code citations.
Related MCP server: RagDocs MCP Server
Setup
Prerequisites
Ollama running locally with an embedding model pulled
Qdrant running (Docker recommended)
Python 3.10+
# Pull the embedding model
ollama pull nomic-embed-text
# Pull a chat model (any that supports tool-calling)
ollama pull qwen2.5:14b
# Start Qdrant (and optionally Ollama via Docker)
docker compose up -dInstall
# With uv (recommended)
uv venv && source .venv/bin/activate
uv pip install -e ".[client,dev]"
# Or with pip
pip install -e ".[client,dev]"Usage
Start the MCP server (standalone)
ollqd-serverThe server communicates over stdio using JSON-RPC (MCP protocol). It's meant to be launched by MCP clients, not used directly.
Interactive RAG chat
# Interactive REPL — ask questions about your codebase
ollqd-chat --interactive
# Single query
ollqd-chat "how does the auth middleware work?"
# Use a different chat model
ollqd-chat --interactive --model llama3.1
# Debug mode
ollqd-chat -v "find the database connection setup"REPL commands:
:quit/:q— exit:model <name>— switch chat model on the fly
Use with Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"ollqd": {
"command": "ollqd-server",
"args": []
}
}
}Then in Claude Desktop, ask things like:
"Index my project at /path/to/codebase"
"Search for how authentication is implemented"
"What error handling patterns are used?"
"List all indexed collections"
MCP Tools
Tool | Description |
| Walk + chunk + embed + upsert code files from a directory |
| Chunk + embed + upsert document files (markdown, text, rst) |
| Embed a natural language query and search Qdrant |
| List all Qdrant collections with point counts |
| Drop a collection (requires |
Configuration
Environment variables
Variable | Default | Description |
|
| Ollama base URL |
|
| Qdrant REST URL |
|
| Chat model for RAG |
|
| Embedding model |
|
| Request timeout (seconds) |
|
| Approximate tokens per chunk |
|
| Overlap tokens between chunks |
|
| Max tool-calling rounds per query |
ollqd.toml
[ollama]
host = "http://localhost:11434"
chat_model = "qwen2.5:14b"
embed_model = "nomic-embed-text"
timeout = 120
[qdrant]
host = "http://localhost:6333"
default_collection = "codebase"
[indexing]
chunk_size = 512
chunk_overlap = 64
max_file_size_kb = 512
[server]
name = "ollqd-rag-server"
transport = "stdio"
[client]
max_tool_rounds = 6Project structure
src/ollqd/
├── __init__.py
├── config.py # AppConfig dataclass + env var overrides
├── errors.py # Exception hierarchy
├── models.py # FileInfo, Chunk, SearchResult, IndexingStats
├── chunking.py # Code-aware + document chunking
├── discovery.py # File discovery (40+ languages)
├── embedder.py # OllamaEmbedder wrapping /api/embed
├── vectorstore.py # QdrantManager (upsert, search, incremental)
├── server/
│ └── main.py # FastMCP server with 5 tools
└── client/
├── mcp_bridge.py # MCP session over stdio
├── ollama_agent.py # Ollama chat with tool-calling
├── rag_loop.py # RAG loop runner
└── main.py # CLI entry pointSupported languages
Python, Go, JavaScript, TypeScript, Rust, Java, Kotlin, Scala, C, C++, C#, Ruby, PHP, Swift, Lua, Shell, SQL, R, HTML, CSS, SCSS, YAML, TOML, JSON, Markdown, reStructuredText, Terraform, HCL, Dockerfile, Protobuf, GraphQL.
Embedding models
Any Ollama model that supports /api/embed works. Recommended:
Model | Dimensions | Notes |
| 768 | Good balance of quality and speed (default) |
| 1024 | Higher quality, slower |
| 384 | Fast, smaller footprint |
| 1024 | Strong code understanding |
Design decisions
Why MCP? — The Model Context Protocol lets any compatible AI assistant (Claude Desktop, custom clients, IDE extensions) use ollqd's indexing and search tools without custom integration code.
Why not tree-sitter for chunking? — Tree-sitter gives perfect AST-based splits but adds a heavy dependency per language. The heuristic boundary detection covers ~90% of cases with zero extra setup.
Why deterministic point IDs? — md5(file_path::chunk_N) means re-indexing the same file overwrites existing points instead of creating duplicates. This makes incremental mode reliable.
Why prefix chunks with metadata? — Embedding models produce better vectors when given context. "File: auth/middleware.go | Language: go | Lines 45-82" followed by the code produces more semantically meaningful vectors.
Legacy scripts
The standalone scripts from v0.1 are still available:
# Bulk index (standalone, no MCP)
python codebase_indexer.py /path/to/project --collection myproject
# Search (standalone, no MCP)
python codebase_search.py "auth middleware" --interactiveSee DESIGN.md for the full architecture document with diagrams, security analysis (STRIDE), and detailed API reference.
Available Tools
5 toolsdelete_collectionC
Delete a Qdrant collection. Set confirm=true to proceed.
Inputs: collection (required), confirm.
index_codebaseB
Index a codebase directory into Qdrant. Walks files, chunks at code boundaries, embeds via Ollama, upserts to Qdrant.
Inputs: root_path (required), chunk_size, collection, incremental, +2 more.
index_documentsC
Index document files (markdown, text, etc.) into Qdrant.
Inputs: paths (required), chunk_size, collection, source_tag, +1 more.
list_collectionsA
List all Qdrant collections with point counts.
Inputs: no named parameters.
semantic_searchC
Semantic search over indexed content. Returns ranked results with file paths and code snippets.
Inputs: query (required), top_k, language, file_path, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct operation: deleting collections, indexing codebases, indexing documents, listing collections, and searching. No overlap in functionality; descriptions clearly differentiate them.
All tool names follow a consistent snake_case verb_noun pattern (e.g., delete_collection, index_codebase, list_collections). Even 'semantic_search' fits as an adjective-noun pair, maintaining uniformity.
With 5 tools, the server is well-scoped for its purpose of managing Qdrant collections and indexing/searching content. Each tool serves a clear, necessary role without bloat.
The tool surface covers key operations: listing, deleting, indexing (two types), and searching. However, it lacks a dedicated create_collection tool (indexing might auto-create, but not explicit) and no tool to remove individual indexed points, which is a minor gap.
Maintenance
Related MCP Connectors
Self-hosted AI workspace: semantic RAG document search, long-term memory, and AI chat via MCP.
Turn a GitHub repo or docs site into agent-ready context: pack it or search it, over MCP.
Cloud or self-hosted knowledge for AI agents: hybrid search, reranking, GraphRAG, scoped MCP tools.
An MCP server for search and retrieval over a local LanceDB database
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables semantic search and retrieval-augmented generation (RAG) using Qdrant vector database. Supports indexing documents from URLs and local directories, with flexible embedding options using Ollama or OpenAI.2-
- AlicenseNot gradedqualityDmaintenanceEnables semantic search and management of documentation through vector similarity using Qdrant and Ollama/OpenAI embeddings.16 npmApache 2.0
- FlicenseNot gradedqualityDmaintenanceA semantic codebase indexer MCP server that chunks source code, generates embeddings via Ollama, and stores them in Qdrant for natural-language code search.15 npm1-
- FlicenseNot gradedqualityDmaintenanceEnables semantic code search over a local codebase using Qdrant vector embeddings and OpenAI embeddings, allowing natural language queries from MCP-compatible clients like Claude Desktop.-