qdrant-mcp
qdrant-mcp
MCP server for document ingestion and semantic search on Qdrant.
Overview
qdrant-mcp provides tools to:
ingest local documents into a Qdrant collection
generate embeddings with OpenAI
run vector search with optional metadata filters
Features
ingest_documentsconverts files such as
docx,pptx, andpdfto Markdown via MarkItDownsplits content into chunks using
chunk_sizeandoverlap_ratioembeds chunks with OpenAI Embeddings (
text-embedding-3-smallby default)upserts chunk text and metadata into Qdrant
search_documentsembeds query text with the same embeddings API
retrieves top
kmatches from Qdrantsupports filtering by
categoryandpath
Requirements
Python 3.11+
uvQdrant (for example,
http://localhost:6333)OPENAI_API_KEY
Setup
uv syncRun inside the Codex CLI
[mcp_servers.qdrant-mcp]
command = "uv"
args = ["run", "qdrant-mcp"]
cwd = "/sandbox/qdrant-mcp"
env = {
OPENAI_API_KEY = "sk-...",
QDRANT_URL = "http://127.0.0.1:6333",
QDRANT_API_KEY = "QDRANT_API_KEY",
QDRANT_COLLECTION = "codex_collection",
CHUNK_HEADER_MODEL = "gpt-5.4-mini"
}Testing
Set OPENAI_API_KEY, QDRANT_URL, and QDRANT_API_KEY in .env, then run:
uv run python -m unittest tests/integration/test_qdrant_integration.pyMCP Tools
ingest_documents
Parameters:
paths: list[str]category: strchunk_size: int = 1200overlap_ratio: float = 0.15embedding_model: str = "text-embedding-3-small"chunk_header_mode: Literal["enabled", "disabled"] = "enabled"
Returns:
collectionembedding_modelingested_filesingested_pointsfailed_files
search_documents
Parameters:
query: strtop_k: int = 5category: str | None = Nonepath: str | None = Noneembedding_model: str = "text-embedding-3-small"
Returns:
collectionembedding_modelquerycountresults(score,path,category,chunk_index,text)
delete_documents_by_path
Parameters:
path: strcategory: str | None = None
Returns:
collectionpathcategorystatusoperation_id
list_category
Parameters:
limit: int = 100
Returns:
collectioncountcategories
list_path
Parameters:
category: strlimit: int = 1000
Returns:
collectioncategorycountpaths
Notes
If the target collection does not exist, it is created automatically on first ingestion.
If payload indexes for
categoryandpathdo not exist, they are created during ingestion.By default, ingestion prepends a generated
Chunk-Header(max 64 chars), derived from the first 4096 bytes, to every chunk.The Chunk-Header model is read from
CHUNK_HEADER_MODELwhenchunk_header_modeisenabled(default:gpt-5.4-mini).The collection name is configured only through
QDRANT_COLLECTION(not via MCP tool parameters).With
text-embedding-3-small, the vector size is1536.
License
See LICENSE.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/msstnk/qdrant-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server