High-performance MCP server for semantic code analysis via Ollama embeddings
contextplus-rs presents 15 tools with generally good naming conventions (all start with action verbs: get_, search_, run_, attach_, upsert_, create_, prune_, add_). Descriptions are present and substantive (ranging 80-400+ chars, above the 10-char minimum and within the 1024-char ceiling). However, critical gaps exist: (1) Output schemas are not documented, the source code shows tool registration with input parameters but no visible return type declarations; (2) Parameter descriptions vary in completeness, some like 'max_tokens' in get_context_tree are well-explained, but others like the empty input object for attach_worktree lack context; (3) Several tools combine multiple concerns (e.g., add_interlinked_context couples node creation with automatic linking), violating single-responsibility; (4) Error handling descriptions are sparse, no recovery guidance is visible in tool descriptions. Per-tool analysis reveals that 5 tools (semantic_code_search, semantic_identifier_search, semantic_navigate, get_feature_hub, search_memory_graph) expose weight/score parameters with numeric ranges but lack explicit min/max constraints in descriptions. get_context_tree and semantic_navigate reference undocumented defaults ('default 20000', 'default 3'). The schema field in Cargo.toml dependencies shows modern choices (rmcp 1.1.0 with #[tool] macros), suggesting struct-based tool registration, but the actual tool definitions in src/server.rs are not visible in the provided source excerpt, only memory_tools.rs options structs are shown. This forces scoring based on inferred structure rather than direct observation, capping confidence.
Add multiple memory nodes with automatic linking based on semantic similarity.
Register a worktree directory as a ref that inherits the primary ref's embedding cache via CoW (CAS parent pointer + memory-graph overlay), then spawns per-ref warmup.
Create a relation between two memory graph nodes. Supports both direct ID lookup and label+type fallback.
Find every file that imports or references a symbol. Maps the full impact of changing it. Scans one worktree's indexed tree, so a zero-usage result only means "unused in the scanned worktree" — not globally unused.
Build a token-aware context tree showing file structure and symbols. Prunes detail levels based on max_tokens budget.
Navigate Obsidian-style wikilinks to discover feature hubs and their connections.
Output schemas not documented. Tool descriptions specify inputs but provide no formal return type declarations or field documentation. LLMs cannot plan downstream tool usage without knowing what fields will be available.
attach_worktree has empty input schema (no parameters, no description of what fields it expects). The description mentions 'Register a worktree directory' but does not explain how to provide the directory path or what fields the tool accepts.
Numeric parameters (semantic_weight, keyword_weight, threshold) lack explicit min/max bounds in descriptions. LLMs may pass out-of-range values (e.g., semantic_weight > 1.0 when the scale is 0-1). Parameter descriptions should state 'must be 0 - 1' or '0 - 100'.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Get function signatures, class definitions, and line ranges for a file without reading full content.
Remove stale or low-confidence edges from the memory graph.
Retrieve a memory node and traverse its connected graph with configurable depth and edge filters.
Run available linters (tsc, eslint, cargo check, ruff) on the project or a specific file.
Search memory graph semantically using embeddings and BFS traversal.
Search code files semantically using natural language queries. Combines embedding similarity with keyword matching for hybrid ranking.
Search for functions, classes, and variables by semantic meaning. Returns identifiers with call-site rankings.
Cluster files by semantic similarity using spectral clustering. Returns labeled groups for codebase navigation. Pass rootDir to scope to a subdirectory.
Upsert a memory node. Creates or updates by (label, type).
add_interlinked_context combines two distinct operations: bulk node creation and automatic semantic linking. This violates single-responsibility. Should split into create_memory_nodes (batch creation) and auto_link_nodes (separate operation) to allow agents to compose them conditionally.
No error recovery guidance visible in tool descriptions. Tools like semantic_code_search and semantic_navigate do not specify what happens on failure, whether results are retryable, or what the LLM should do if a query returns no matches.
get_feature_hub has ambiguous optional parameters: both 'hub_path' and 'feature_name' are optional with unclear precedence. If both are omitted, the tool description does not specify behavior. Description should clarify: 'Either hub_path or feature_name must be provided; if both are given, hub_path takes precedence.'
Defaults mentioned in descriptions are not formally declared in parameter definitions. get_context_tree says 'default 20000' for max_tokens and semantic_navigate says 'default 3' for max_depth, but these are not in the schema shown. Defaults should be explicit in both description AND schema.
Tool definitions inferred from src/server.rs excerpt; actual registration code not visible. Dependency on rmcp v1 with #[tool] macros suggests struct-based registration, but without seeing the handler implementations and return types, schema completeness cannot be verified. Scoring is conservative.