MCP client-server RAG system — index codebases & documents into Qdrant using Ollama embeddings
Ollqd provides 5 tools with visible input schemas and descriptions. All tools have descriptions (10-100+ chars) and typed JSON Schema parameters. However, multiple quality issues prevent a higher score: (1) Output schemas are undocumented, the rubric requires documented return types for A+ tools, and none are specified in the tool definitions. (2) Error handling lacks guidance, tools do not document recovery paths, error classification, or actionable messages. (3) Parameter descriptions lack detail on constraints, ranges, and format requirements. (4) Some tool names are compound actions (e.g., 'index_codebase' + 'index_documents' show near-duplication of concerns without clear differentiation). (5) Critical security concerns: 'delete_collection' is a destructive operation without adequate safeguards, the 'confirm' boolean is a weak protection pattern vs. proper confirmation flow. (6) Semantic search lacks pagination parameters (top_k=5 default suggests results are capped, but no mention of offset/cursor for traversing beyond top 5). These are typical C-grade issues: schemas present but incomplete, descriptions generic, limited error guidance.
Delete a Qdrant collection. Set confirm=true to proceed.
Index a codebase directory into Qdrant. Walks files, chunks at code boundaries, embeds via Ollama, upserts to Qdrant.
Index document files (markdown, text, etc.) into Qdrant.
List all Qdrant collections with point counts.
Semantic search over indexed content. Returns ranked results with file paths and code snippets.
Output schemas are completely undocumented. The tool definitions show input schemas but provide no specification of what fields, types, or structure are returned. This violates the baseline requirement that '100% of A+ tools have documented return types' and prevents LLMs from planning downstream actions, field extraction, or error handling.
Error handling provides no recovery guidance. Tools do not document error conditions, categorization (retryable vs. fatal), or actionable next steps. For example, 'index_codebase' does not specify what happens if the root_path is invalid, if Ollama is unavailable, or if Qdrant connection fails. Pattern:recovery-guide requires errors to tell the LLM what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Destructive operation ('delete_collection') lacks proper confirmation workflow. A simple boolean 'confirm' parameter is weak protection, agents could accidentally set confirm=true. Pattern:confirmation-request requires irreversible operations to support a dry-run or multi-step confirmation, not a boolean flag. Current approach risks data loss from agent mistakes.
Parameter descriptions lack constraint details. E.g., 'chunk_size' in index_codebase has no documented minimum, maximum, or rationale ('512 tokens approximate via char count / 4' is an implementation detail, not a user-facing constraint). Pattern:constrained-input requires descriptions to specify ranges, enums, and format. Current descriptions are vague, LLMs cannot validate inputs against unstated constraints.
Pagination is missing from semantic_search. Results are capped at 'top_k' (default 5) but there is no offset, cursor, or 'has_more' indicator. Pattern:paginated-result requires paginated tools to accept limit/offset and return a total count or next_cursor. Without pagination, agents cannot discover results beyond the first 5 and may miss relevant code snippets.
index_codebase and index_documents are near-duplicate tools with overlapping responsibility. Both index content into Qdrant using similar parameters (collection, chunk_size, chunk_overlap). The distinction is unclear to LLMs: when should an agent pick index_codebase vs. index_documents? Pattern:tool requires each tool to do exactly one thing with a clear, unambiguous purpose.
Optional parameters with null defaults (e.g., 'language' in semantic_search, 'extra_skip_dirs' in index_codebase) lack documentation on how null/omission is handled. Does null mean 'no filter' or 'error out'? Pattern:tool-description requires descriptions to clarify expected values and behavior when omitted.