MCP server: automatic semantic code index (Ollama embeddings + Qdrant) with incremental staleness-checked indexing
Code-indexer has 10 well-named tools with clear, detailed descriptions (avg 180 chars, well above 34-char baseline). All tools have input schemas with typed parameters and descriptions. However, output schemas are entirely undocumented, tools return plain strings with no structured field contract. Error handling is minimal (mostly 'error: ...' strings). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk profiles. Parameter descriptions are strong but lack explicit constraints (enums, ranges). Missing pagination guidance for list_projects and find_symbols despite potentially large result sets.
Register an absolute project directory for semantic indexing (idempotent; optional sanitized custom name -> idx_<name>) and start the initial indexing pass in the background.
Look up symbols by name in the manifest symbol index (no semantic search). Exact AST-first, capped substring fallback; symbol_type filters function|method|class|struct|enum|namespace.
Browse-mode symbol listing (design §2.3 — replaces list-symbols): optional symbol_type / file filters over the manifest symbol index, capped at limit (max 500). format: 'text' or 'json'. Signatures included when stored (schema v3).
Check indexing state for a project: idle | indexing | stale | error, plus last-pass progress. Also triggers the staleness check.
List registered projects with per-project index summary and staleness.
Check whether a project directory is registered, and report its collection name and index summary (path, slug, name, idx_<slug>, state, files, chunks, last_indexed). Does NOT register or index.
No output schemas documented. Tools return plain strings (e.g., 'registered: ... collection=idx_...'). LLMs cannot parse structured fields or chain results to downstream tools. semantic_search claims 'stable field contract' but contract is not machine-readable.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). remove_project is destructive, add_project is idempotent, but LLMs have no machine-readable signal. Agents cannot reason about retry safety or side effects.
Error handling returns bare strings ('error: ...') with no recovery guidance. E.g., 'error: not registered: /path' gives LLM no hint to call add_project or list_projects. No error categorization (retryable vs fatal).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Force a full rebuild of a project's index (chunker/model change, suspected corruption).
Deregister a project and DELETE its Qdrant collection + manifest + registry entry entirely.
Semantic code search across indexed projects. THE hot path. Automatically runs a staleness check first and incrementally re-indexes changed files. format: 'text' or 'json' (stable field contract: project, file, score, symbol, symbol_type, start_line, end_line, snippet).
Whole-project or per-subtree structural map from the manifest only (design §2.1): one file per group, one symbol per line with lines and signature. path_prefix restricts to files under a project-relative path. format: 'text' or 'json'.
list_projects and find_symbols lack pagination. find_symbols accepts limit (max 500) but no offset/cursor. list_projects has no limit parameter. Large result sets will blow context window.
Parameters lack explicit constraints. symbol_type accepts 'function|method|class|struct|enum|namespace' but no enum schema. format accepts 'text' or 'json' but no enum. LLMs will hallucinate invalid values.