Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
Strong codebase analysis tool with well-structured 16-tool suite. All tools have clear action-verb names (get_, find_, search_) and meaningful descriptions (90-250 chars, within baseline). Tool schemas are explicitly visible with typed parameters and descriptions. However, several critical gaps prevent a higher score: (1) Output schemas are NOT documented, no per-tool return type specification visible in the definitions, (2) Error handling guidance is minimal, tools return generic text responses without recovery hints or actionable error classification, (3) No pagination support despite 3+ tools returning potentially large result sets (find_symbol, find_references, search_code), (4) Tool annotations (readOnlyHint, destructiveHint, idempotentHint) absent despite clear risk classifications. The server demonstrates solid fundamentals but lacks production-grade finishing touches around output documentation and error guidance.
Tools (16)
find_referencesread onlysource verified80/100
Find where a symbol is referenced across the codebase.
find_symbolread onlysource verified85/100
Find symbol definitions by name (supports wildcards). AST-aware — returns definitions, not text matches.
find_unused_coderead onlysource verified78/100
Find unused symbols (defined but never called or imported).
find_unused_exportsread onlysource verified78/100
Find exported symbols that are never imported or used.
get_call_graphread onlysource verified82/100
Get the call graph for a function or method (what it calls, what calls it).
Output schemas not documented. No per-tool return type specification visible. LLMs cannot plan downstream operations or extract required fields for chaining (e.g., what fields does find_symbol return? Does get_smart_context return file paths for follow-up reads?)
No pagination support (limit/offset/cursor) despite tools returning potentially large result sets. find_symbol with wildcard '*', search_code, and find_references could return hundreds of results, exceeding context windows.
Document output schema for every tool. Create a TypeScript interface or JSON Schema for each return type. Example: 'find_symbol returns [{symbol: string, kind: string, file: string, line: number, column: number}]'. Include this in the tool description or as a separate schema block in the MCP registration.
Add pagination to all result-returning tools. For find_symbol, search_code, find_references, add optional 'limit' (default: 20, max: 100) and 'offset' (default: 0) parameters. Return {results: [...], total: N, hasMore: boolean}. Update descriptions to clarify limits.
Add tool annotations to server.tool() calls. Use readOnlyHint=true for read-only tools (find_symbol, get_smart_context, etc.) and destructiveHint=true for write tools (set_project, reindex). Clients will display warnings to users and enforce safer retry policies.
Enhance error handling with structured error responses. Instead of returning generic text, return objects like {error: string, type: 'retryable' | 'user_input' | 'not_found' | 'permission_denied', suggestion: string}. Example: {error: 'Project root not found', type: 'user_input', suggestion: 'Ensure the provided path exists and is a valid project directory.'}
Clarify path parameter behavior. Add a shared note: 'If omitted, uses the current project (set via set_project). If provided as absolute path, auto-detects the nearest project root. Returns error if no project is set and no path is provided.'
Document query limits and patterns for find_symbol, search_by_pattern, and search_code. State: 'Wildcards use glob syntax (* = any characters). Searches are case-sensitive. Results capped at 100; use limit parameter to control. Symbol kind filter is optional; omit to search all kinds.'
Spec posture evidence
Inferred effective spec: <=2025-11-25.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Score history
Overall score trend
↑ 15 points across a rubric change (v1 → v2)
70/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
B
70
<=2025-11-25
v2
2026-03-09
D
55
-
v1
get_file_summaryread onlysource verified78/100
Get a brief summary of a file: imports, exports, and top-level symbols.
get_project_mapread onlysource verified77/100
Get a high-level map of the project structure (files, directories, symbol counts).
get_smart_contextread onlysource verified80/100
Get contextual code snippets around a symbol or file position for AI reading.
get_statusread onlysource verified73/100
Get index health, stats, and current project info.
get_symbol_sourceread onlysource verified78/100
Get the source code for a symbol definition.
reindexwritesource verified75/100
Force re-index of the codebase or a single file.
search_by_patternread onlysource verified82/100
Search code by regex pattern (file and symbol name match).
search_coderead onlysource verified80/100
Full-text search across code using TF-IDF. Returns files ranked by relevance.
set_projectwritesource verified85/100
Set the project directory to index and analyze. Accepts any absolute path (file or directory) — auto-detects the nearest project root. In monorepos, automatically scopes to the specific package.
Tool annotations absent. No readOnlyHint, destructiveHint, or idempotentHint on tool definitions despite clear risk classifications in metadata (set_project, reindex = WRITE; others = READ_ONLY). This prevents clients from warning users or rate-limiting accordingly.
Parameter descriptions are sometimes generic. 'path' parameter appears on 10+ tools with identical description. Descriptions could explicitly state when 'path' is auto-detected vs. required, and what happens if not provided.
Tool descriptions do not specify common query patterns or limitations. For example, find_symbol states 'Supports * wildcards' but does not clarify: does '*Service' match 'UserService'? Are searches case-sensitive? What is the max result count returned?
No explicit error classification (retryable, user-fixable, fatal). safeTool() logs errors but returns a generic 'Internal error' text response. LLMs cannot determine: Should I retry? Did the user provide bad input? Is the server broken?
Add explicit error cases to tool descriptions. Example for reindex: 'Returns error if the file path does not exist or is outside the project root. Returns error if the project root cannot be determined (call set_project first with a valid path).'
Create a 'get_project_status_or_setup' tool that combines get_status and set_project logic. This simplifies the common pattern where an LLM must first ensure a project is set before querying. Single tool call replaces two-call sequence.
Add 'confidence' or 'match_score' fields to search results. For search_code's TF-IDF results and find_symbol's wildcard matches, returning relevance scores helps LLMs decide which results matter most, especially when truncating due to context limits.
Implement dry-run support for reindex. Add optional parameter 'dry_run=true' to preview what would be indexed without committing changes. Prevents accidental re-indexing that could slow down large codebases.