Skip to main content
Glama

qmcp - QDrant MCP Server for OpenCode

Version Python License MCP

Semantic search server for code and documentation using Qdrant vector database.

Language: English | Русский

Features

  • Semantic Search: Find code and documentation using natural language queries

  • Multi-language Support: Python, Go, JavaScript, TypeScript, Java, C#, Markdown

  • Markdown Section Chunking: Markdown files are split into per-section chunks (##/### headers) with precise line ranges - search points at the exact section instead of the whole file, and file tails beyond 10 KB are indexed too

  • Compact Search Responses: Search returns pointer fields only (file_path, line_start, line_end, type, name) - enough for a targeted read, without bloating the context

  • Live Updates: File watcher for automatic reindexing

  • Incremental Indexing: Only index changed files

  • Gitignore Support: Respects .gitignore - excludes node_modules, __pycache__, .venv, build artifacts, etc.

  • Cleanup: Remove stale vectors for deleted/changed files

  • Diagnostics: Introspection tools to understand what's indexed

  • OpenCode Skill: Natural language interface for Qdrant management

Related MCP server: Tea Rags MCP

Installation

pip install qmcp-qdrant

Via uv

uv tool install qmcp-qdrant

From Source

git clone https://github.com/BigKAA/qmcp.git
cd qmcp
make install

Updating

uv tool upgrade qmcp-qdrant

Via pip

pip install --upgrade qmcp-qdrant

Quick Start

1. Ensure Qdrant is running

For Kubernetes deployment, see Qdrant on Kubernetes.

2. Add MCP Server to OpenCode

opencode mcp add qmcp-qdrant qmcp-qdrant

⚠️ Note: Environment variables must be set in ~/.config/opencode/opencode.json config file.

Configuration

Environment Variable

Default

Description

QDRANT_URL

http://localhost:6333

Qdrant server URL

QDRANT_API_KEY

(none)

Qdrant API key (optional)

EMBEDDING_MODEL

BAAI/bge-small-en-v1.5

Embedding model

EMBEDDING_CACHE_DIR

(system temp)

Custom directory for model cache

EMBEDDING_THREADS

min(4, CPU count)

ONNX inference threads per process

WATCH_PATHS

/data/repo

Baseline paths to watch automatically on server startup

BATCH_SIZE

50

Batch size for indexing

INDEX_LOCK_DIR

~/.cache/qmcp-locks

Directory for cross-process index locks

DEBOUNCE_SECONDS

5

Debounce delay

LOG_LEVEL

INFO

Logging level

LOG_FORMAT

text

Log format (text or json)

💡 Model Cache: Set EMBEDDING_CACHE_DIR to persist models across restarts. First launch downloads the model (~13MB), subsequent launches use cached version.

💡 Multiple clients, one machine: every MCP client spawns its own qmcp process, and each holds its own embedding model. qmcp deduplicates indexing across processes with file locks (INDEX_LOCK_DIR) and caps ONNX threads (EMBEDDING_THREADS, default 4) so N processes cannot saturate every core. Keep WATCH_PATHS scoped to trees you actively work in - a monorepo-scale path makes every process walk it on each poll.

💡 WATCH_PATHS examples:

  • Single path: WATCH_PATHS=/home/user/project

  • Multiple paths: WATCH_PATHS=/home/user/project,/home/user/docs

  • JSON array: WATCH_PATHS=["/home/user/project", "/home/user/docs"]

3. That's It!

OpenCode will automatically discover and use the semantic search tools.

Manual Configuration (Alternative)

If opencode mcp add doesn't work, edit ~/.config/opencode/opencode.json directly:

{
  "mcp": {
    "qmcp-qdrant": {
      "type": "local",
      "command": ["qmcp-qdrant"],
      "environment": {
        "QDRANT_URL": "http://192.168.218.190:6333",
        "WATCH_PATHS": "/home/user/shared-docs,/home/user/shared-snippets"
      }
    }
  }
}

For Python module:

{
  "mcp": {
    "qmcp-qdrant": {
      "type": "local",
      "command": ["python", "-m", "qmcp.server"],
      "environment": {
        "QDRANT_URL": "http://192.168.218.190:6333",
        "WATCH_PATHS": "/home/user/shared-docs,/home/user/shared-snippets"
      }
    }
  }
}

Indexing Notes

⚠️ Important: Full indexing and reindexing of large projects can take a significant amount of time (minutes to hours depending on project size).

For large codebases, prefer:

  • Incremental reindex (mode="incremental") - only updates changed files based on content hashes

  • File watcher - enables automatic live updates when files change

Markdown Chunking

Markdown files are chunked per section (headers ## and ### by default). Oversized sections (> 8 KB) are additionally split by paragraph boundaries, never inside code fences. Each chunk carries precise line_start/line_end, so qdrant_search results point to the exact section for a targeted read.

Files without headers fall back to a single document chunk (paragraph-split when oversized).

⚠️ BREAKING (existing collections): The chunk schema changed (per-section chunks instead of one chunk per markdown file). Existing markdown collections must be fully reindexed after upgrading:

qdrant_reindex(path="/path/to/project", collection="docs", mode="full")

Incremental reindex will not migrate unchanged files - they keep the old single-chunk layout until a full reindex runs.

Score Threshold Note

The default score_threshold=0.7 is calibrated for bge-* embedding models. For paraphrase-multilingual-* models the top score is typically ~0.64, so the default threshold filters out everything - lower the threshold explicitly for those models.

Automatic Indexing Strategy

qmcp supports automatic indexing on two levels:

  1. Server startup level — on MCP startup, the server automatically tries to start a watcher for WATCH_PATHS.

  2. Workspace session level — because one global MCP server can be shared across multiple repositories, agents should check the watcher state for the current workspace and call qdrant_watch_ensure(paths=[workspace_root]) when the workspace path is missing.

Recommended OpenCode flow for every new workspace:

status = qdrant_get_status()

# If watcher is not active or the current repo is not covered,
# safely extend the watcher without dropping other projects.
qdrant_watch_ensure(paths=["/absolute/path/to/current/workspace"])

qdrant_watch_ensure merges the current workspace with already watched paths and WATCH_PATHS, making it safe for a single global MCP shared by multiple projects.

MCP Tools

Search & Indexing

Tool

Description

qdrant_search

Semantic search in code/docs

qdrant_index_directory

Index a directory

qdrant_reindex

Reindex (full or incremental)

💡 Tip: Use qdrant_search with filters for precise results:

  • chunk_type — filter by code type (function_def, class_def, section, document)

  • symbol_name — find exact symbol by name (for markdown: section header text)

  • language — filter by programming language

Results are compact pointers (score, file_path, type, name, line_start, line_end) - use them for a targeted file read instead of loading whole files.

See docs/STRUCTURED_METADATA.md for detailed examples.

Collection Management

Tool

Description

qdrant_list_collections

List all collections

qdrant_get_collection_info

Get collection info

qdrant_delete_collection

Delete collection

Diagnostics & Introspection

Tool

Description

qdrant_diagnose_collection

Full collection diagnostics - vectors, files, types, issues

qdrant_list_indexed_files

Paginated list of indexed files with metadata

qdrant_diff_collection

Compare Qdrant state with filesystem (orphans, missing, modified)

Maintenance

Tool

Description

qdrant_cleanup

Clean stale vectors (dry-run supported)

qdrant_watch_start

Start file watcher

qdrant_watch_ensure

Ensure workspace path is watched without dropping other projects

qdrant_watch_stop

Stop file watcher

qdrant_get_status

Server status

Diagnostic Tools Usage Examples

# Diagnose a collection - see what's indexed, file types, issues
qdrant_diagnose_collection(collection="myproject")

# List indexed files with pagination
qdrant_list_indexed_files(collection="myproject", limit=50, offset=0)

# Filter by file type
qdrant_list_indexed_files(collection="myproject", file_type=".py")

# Compare Qdrant state with filesystem
qdrant_diff_collection(collection="myproject", repo_path="/path/to/repo")

OpenCode Skill

The project includes an OpenCode skill for natural language management of Qdrant.

Installation

# Copy skill to OpenCode skills directory
cp -r skills/qmcp-manager ~/.config/opencode/skills/

Usage

Once installed, OpenCode will automatically activate the skill when you ask questions like:

Query

What Happens

what's indexed in my Qdrant?

Diagnoses collection and shows stats

show collection stats

Lists all collections with vector counts

clean up orphans in my index

Finds and previews deletion of orphaned vectors

diagnose my index

Full diagnostics with issues and file list

compare index with /path/to/repo

Shows orphans, missing, and modified files

find missing files

Lists files on disk but not indexed

is my index up to date?

Compares hashes to detect changes

Workflows Provided by Skill

  1. Quick Status - Check collection state with qdrant_list_collections

  2. Full Diagnostics - Detailed analysis with qdrant_diagnose_collection

  3. Diff - Compare Qdrant with filesystem using qdrant_diff_collection

  4. Safe Cleanup - Preview with dry-run, then confirm deletion

  5. Smart Reindex - Incremental updates based on file hashes

Skill Location

skills/qmcp-manager/SKILL.md

Manage MCP Servers

opencode mcp list          # List all MCP servers
opencode mcp debug qmcp-qdrant     # Debug connection issues
opencode mcp logout qmcp-qdrant    # Remove MCP server

Development

make install      # Install dependencies
make test         # Run tests
make lint         # Lint code
make format       # Format code
make mcp-dev      # Run with MCP inspector

Troubleshooting

If you encounter issues, see the Troubleshooting Guide for:

License

Apache 2.0

Available Tools

14 tools
qdrant_cleanupB

Clean up stale vectors - remove vectors for deleted or changed files.

Inputs: repo_path (required), collection (required), dry_run. Returns: object

qdrant_delete_collectionC

Delete a collection from Qdrant.

Inputs: name (required). Returns: object

qdrant_diagnose_collectionB

Perform full diagnostics of a collection.

Analyzes the collection and returns:
- Total vectors and files count
- File type distribution
- Chunk type distribution
- Indexing timestamp range (oldest/newest)
- Issues found (missing hashes, empty chunks, etc.)
- List of all indexed files with details

Inputs: collection (required). Returns: object

qdrant_diff_collectionA

Compare Qdrant collection state with filesystem.

Detects three types of discrepancies:
- orphans: Vectors in Qdrant but file doesn't exist on disk
- missing: Files on disk but not indexed in Qdrant
- modified: Files that exist but content has changed (hash mismatch)

Inputs: repo_path (required), collection (required). Returns: object

qdrant_get_collection_infoC

Get information about a collection.

Inputs: name (required). Returns: object

qdrant_get_statusB

Get status of the Qdrant MCP server.

Inputs: no named parameters. Returns: object

qdrant_index_directoryB

Index a directory of code or documentation into Qdrant.

This tool parses source files and adds their content as vectors to the specified collection for semantic search.

Inputs: path (required), collection (required), patterns. Returns: object

qdrant_list_collectionsA

List all collections in Qdrant.

Inputs: no named parameters. Returns: result

qdrant_list_indexed_filesB

List all indexed files in a collection with pagination.

Returns file metadata including:
- File path
- Number of chunks
- Content hash
- Indexed timestamp
- Chunk types found in file

Inputs: collection (required), limit, offset, file_type. Returns: object

qdrant_reindexA

Reindex a directory - either full rebuild or incremental update.

Full mode deletes the collection and recreates it from scratch. Incremental mode only updates changed files.

Inputs: path (required), collection (required), mode. Returns: object

qdrant_watch_ensureA

Ensure watcher is active for the current workspace without dropping other projects.

This tool is designed for OpenCode sessions where one global MCP server is shared across multiple repositories. It merges workspace paths with the configured and/or currently watched paths and only restarts the watcher when the effective watch set changes.

Inputs: paths (required), include_existing, include_configured. Returns: object

qdrant_watch_startB

Start watching paths for file changes and auto-reindex.

This enables live updates - files are reindexed when modified.

Inputs: paths (required). Returns: object

qdrant_watch_stopB

Stop watching paths for file changes.

Inputs: no named parameters. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 14 tools

    Disambiguation4/5

    Most tools target a clearly distinct operation (search, index, delete, status, watch_stop). The main confusable pairs are qdrant_index_directory vs qdrant_reindex (both index the same directories) and qdrant_watch_start vs qdrant_watch_ensure, plus the observability trio diagnose/list_indexed_files/diff_collection which partially overlap in reporting collection state.

    Naming Consistency4/5

    All names share a qdrant_ prefix and snake_case, with a predictable verb_noun shape (list_collections, get_collection_info, delete_collection, list_indexed_files, diff_collection). Minor deviation: a few bare verbs with no object (search, reindex, cleanup), which is still readable but breaks the strict pattern.

    Tool Count4/5

    14 tools is within a sensible range for a vector-indexing/search server and each maps to a real workflow stage (search, index, watch, diagnose, cleanup). Slightly heavy on observability/utility variants: watch_ensure largely duplicates watch_start with path merging, and three tools report collection state.

    Completeness4/5

    Coverage of the domain is strong: search with filters, indexing/reindexing, live watching, collection lifecycle (list/info/delete), stale-vector cleanup, and diagnostics/diffing. Gaps are minor: no explicit create_collection (implicitly via index), and no point-level delete/upsert or collection config update beyond full reindex.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      A high-performance MCP server for semantic search and codebase indexing using the Qdrant vector database. It features optimized embedding pipelines, AST-aware chunking, and git metadata enrichment for fast, privacy-focused local or remote search.
      401 npm
      31
      MIT