A comprehensive MCP server for code indexing, semantic search, knowledge base management, and AI-powered code analysis with embedded SurrealDB and GGUF model support
This MCP server exhibits critical quality gaps across naming, descriptions, and schema documentation. All 10 tools share a pervasive pattern of indirect/delegated documentation ('Use how_to_use() for details') rather than explicit, self-contained descriptions. No input parameter descriptions are visible in the provided source. Schemas are present in the assessment but lack evidence of full JSON Schema compliance with type definitions for all parameters. The server operates at STDIO only, which further limits production suitability. While tool names follow verb_noun convention (code_index_project, code_list_projects, etc.), the reliance on external how_to_use() references instead of inline documentation violates the principle that LLMs must infer tool purpose from the definition alone.
Activate file watch on a project. Use how_to_use("code_activate_project_watch") for details.
Deactivate file watch on a project. Use how_to_use("code_deactivate_project_watch") for details.
Delete an indexed project. Use how_to_use("code_delete_project") for details.
Get all symbols from a file. Use how_to_use("code_get_file_symbols") for details.
Get project statistics. Use how_to_use("code_get_project_stats") for details.
Get watch status for projects. Use how_to_use("code_get_watch_status") for details.
ALL tools delegate documentation to how_to_use() instead of providing inline, self-contained descriptions. Descriptions are uniformly 50-60 chars and repeat the exact same pattern: 'Check/Start/List/Activate indexing job status. Use how_to_use("<tool_name>") for details.' This violates the principle that LLMs must determine when to select a tool based on the definition alone, without requiring dynamic runtime calls to how_to_use().
Parameter descriptions are completely absent. The schema for code_index_project includes 'project_path', 'project_name', and 'languages' parameters with type info, but no descriptions. LLMs cannot infer whether 'languages' is a list of language names, file extensions, or MIME types without explicit text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
Start indexing a code project for semantic search. Use how_to_use("code_index_project") for details.
Check indexing job status. Use how_to_use("code_index_status") for details.
List all indexed code projects. Use how_to_use("code_list_projects") for details.
Re-index a single file. Use how_to_use("code_reindex_file") for details.
No output schemas documented. The provided tool definitions show input schemas but do not indicate what fields or structure each tool returns. LLMs cannot plan downstream tool calls or extract required IDs (e.g., job_id returned by code_index_project) without knowing the response schema.
Destructive tools (code_delete_project) lack confirmation or dry-run mechanisms. The tool accepts only a project_id parameter with no 'confirm' or 'dry_run' flag. Agents can accidentally delete projects without a safety gate.
No error handling or recovery guidance documented. Tools do not describe what errors might occur (e.g., 'project not found', 'indexing in progress', 'permission denied') or what the LLM should do in response. Per pattern, error responses must tell the LLM what to do next.
Parameters lack constraints and validation rules. 'project_path' has no guidance on format (absolute vs relative, URL encoding, symlink handling). 'languages' array has no enum or constraint on valid values.
Missing tool annotations for destructive operations. code_delete_project and code_reindex_file have WRITE/DESTRUCTIVE risk labels but do not include MCP tool annotations (destructiveHint, readOnlyHint, idempotentHint) to signal intent to the protocol layer.
Naming ambiguity: 'code_index_status' could refer to the status of a specific job or the overall indexing service status. The parameter 'job_id' clarifies this somewhat, but only because it's optional. If omitted, the tool behavior is unclear, does it return the current job, all jobs, or an error?