Local-first RAG MCP server for developers. Provides semantic code search, graph-native relationship queries, and context pack assembly for AI-assisted code understanding.
AmanMCP has 6 tools with comprehensive but uneven documentation. Tool descriptions are detailed and context-rich (ranging 100-400 chars), which exceeds baseline (194 chars avg). However, schema completeness varies significantly: search, search_code, search_docs, and graph.query have detailed input schemas with parameter descriptions and constraints. index_status has an empty input schema ({}). expand_context's seed parameters lack explicit type definitions in visible documentation. Naming is strong and action-oriented (search_*, index_status, graph.query, expand_context), following verb-noun patterns. Parameter descriptions are detailed and include constraints (e.g., 'limit' with defaults, 'scope' with OR logic, 'profile' with enum-like options). However, output schemas are NOT documented in any tool definition, LLMs cannot see what fields to expect in responses, violating pattern:tool requirement. Error handling descriptions are absent; tools do not describe recovery paths, retryability, or how to handle 'disambiguation_required' or 'subject_not_found' states (mentioned in descriptions but not documented as error outcomes). The server is STDIO-only, capping protocol readiness at 50 and limiting broader usefulness.
Graph-native context pack assembly. Resolves a seed (search result id, symbol, or path), expands its multi-hop graph neighborhood by node-id traversal, and returns a role-labeled context pack with an explicit GraphPath on every item tracing back to the seed. Seed resolution reuses graph.query subject handling: auto (default), path, symbol, or result_id. On success `pack` holds bounded items with roles (implementation, test, doc_or_adr, config, entrypoint, caller, related_pm_memory, related_doc_memory), source paths, confidence labels, heuristic flags, and hydrated chunk content when available. Role notes: `caller` uses inbound import-proxy until precise `symbol_calls` edges land; `entrypoint`, `related_pm_memory`, and `related_doc_memory` use layout heuristics (cmd/, .aman-pm/, archive/) and may be empty on repos that do not match. On `disambiguation_required` or `subject_not_found`, `pack` is empty and `candidates` carries competing subjects or near-miss hints — the tool never guesses. Degraded or empty graphs return structured warnings. Examples: {"seed_type":"symbol","seed":"NewQueryService"}; {"seed_type":"path","seed":"internal/graph/query.go"}; {"seed_type":"result_id","seed":"node:chunk:project-1:internal/graph/query.go#chunk:1"}.
Graph-native relationship query with find_references, explain_symbol, and impact_analysis modes. Resolves the subject before traversing and reports the outcome in `resolution`: `resolved` (one unambiguous subject — `results` holds bounded role-labeled evidence with graph path hints, source paths, confidence labels, and heuristic flags), `disambiguation_required` (the subject matched several distinct nodes — `results` is empty and `candidates` lists up to a bounded number of them, each with its qualified name, kind, source path, and line so you can re-query a specific subject; a `graph_candidates_truncated` warning signals when more matched than were returned), or `subject_not_found` (no match — `candidates` carries near-miss hints). Optional `subject_type` selects the resolver: auto (default), path, symbol, package, or result_id. Optional traversal budget overrides within policy: `max_nodes`, `max_per_edge_kind`, `max_tokens`, and `max_depth` (multi-hop only). Budget exhaustion returns partial `results` plus `traversal_budget_exhausted` warnings with structured `budget_reason` and `budget_limit`. Package resolution tries exact key/name, exact directory, then case-folded key/name/directory; ambiguous matches return candidates. Examples: {"subject_type":"auto","query":"QueryService"}; {"subject_type":"path","query":"internal/graph/query.go"}; {"subject_type":"symbol","query":"QueryService"}; {"subject_type":"package","query":"internal/graph#graph"}; {"subject_type":"result_id","query":"node:symbol:project-1:internal/graph/query.go#Query:1"}. result_id v1 accepts stable graph node IDs only, not public search-result hashes. Also returns status and warnings.
Output schemas not documented for any tool. LLMs cannot see response field names, types, or structure. Violates pattern:tool requirement that output must be documented so agents can plan downstream calls and extract data.
index_status has an empty input schema ({}). While the tool itself may be read-only with no parameters, the schema is incomplete. A description should state 'No parameters required' explicitly.
Error handling and recovery guidance absent. graph.query and expand_context mention 'disambiguation_required', 'subject_not_found', 'traversal_budget_exhausted' outcomes in descriptions but do not document them as discrete error responses or guide LLMs on recovery actions. Violates pattern:recovery-guide.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Check if the codebase index is ready and which embedder is active. Use before searching to verify the index is complete.
Primary search tool. Instantly finds code and documentation using a full-codebase index. Use this for 95% of your search tasks - faster and smarter than grep. Understands code semantics, not just keywords.
Code-specialized search. Finds functions, classes, and implementations by meaning, not just text matching. Use when you need to understand HOW something is implemented. Supports language and symbol type filtering.
Documentation search with context. Finds architecture decisions, design rationale, and guides. Preserves section hierarchy so you understand WHERE in the doc structure a match appears.
expand_context seed_type and seed parameters lack explicit type declarations in visible schema. The description implies 'seed_type' is a string enum (auto|path|symbol|result_id) and 'seed' is a string, but no formal JSON Schema type/enum constraint is shown.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible in tool definitions. All 6 tools are READ_ONLY per metadata comment, but this is not encoded in the schema or via toolAnnotations capability.
No pagination or result limiting guidance for search tools. search, search_code, search_docs have a 'limit' parameter (default 10), but no documentation of what happens when results exceed the limit, whether there is a next_cursor or offset, or what the maximum limit is.