An agentic RAG (Retrieval-Augmented Generation) system built with FastAPI and FastMCP that provides semantic search over Pinecone vector database, document upload processing, and agent-powered question answering with LangGraph conversation memory.
This MCP server has critical definition quality gaps that make it unsuitable for production use. Of 3 tools, all have serious issues: naming violations (non-verb prefixes, unclear intent), minimal descriptions (10-15 chars, far below the 194-char baseline), and complete absence of output schemas. Tool parameters lack descriptions entirely. The server implements HTTP transport via FastMCP but does not address parameter validation, error guidance, or LLM-friendly output design. The code shows raw exception handling that returns stack traces rather than actionable recovery guidance. Averaging per-tool scores (28, 32, 36) yields 32/100.
Retvives all namespaces from index
Search semantic data about addresses from the vector database
Search semantic data about cars from the vector database
No tool descriptions meet the 10 - 1024 character guideline. 'Retvives all namespaces...' (34 chars) and search descriptions (~95 chars) are below the 194-char baseline. All three descriptions are generic and do not answer WHAT the tool does, WHEN to use it, or WHAT it returns.
Output schemas are completely undocumented. Tools return structured objects (id, score, fields from Pinecone hits) but no JSON Schema or description tells the LLM what these fields contain, their types, or what to do with them. This forces LLMs to infer structure and risks misuse.
Tool naming violates action-verb convention. 'retrive_all_name_spaces' contains a typo and lacks clear action; 'search_cars_vectors' and 'search_addresses_vectors' are domain-specific jargon ('vectors') that do not clarify intent to LLMs. Should be 'list_namespaces', 'search_cars', 'search_addresses' or similar.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 30 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 41 | - | v1 |
Error handling returns raw HTTPException and PineconeException details (line mcp_server.py: 'detail=f\'An error occurred: {str(e)}\''). These stack traces are not actionable for LLMs and leak implementation details. Error responses must guide recovery: 'Namespace not found. Call retrive_all_name_spaces() to see available options.'
No tool explicitly documents what 'namespace' parameter means or how to obtain valid values. The retrive_all_name_spaces tool could help, but search tools should document this dependency: 'namespace: The namespace to search within. Call retrive_all_name_spaces() first to enumerate available namespaces.'
Duplicate tool definitions. search_cars_vectors and search_addresses_vectors have identical input schemas and nearly identical implementations (both call idx.search() with identical parameters). This violates single responsibility, they should be merged into a single parameterized search_vectors(resource_type: Enum[cars|addresses], question, namespace) tool.
No pagination or result limiting. search_cars_vectors and search_addresses_vectors hardcode top_k=3 but do not expose this as a parameter or document the limit in the description. LLMs cannot control result volume, risking context window exhaustion if 'fields' contains large nested objects.
Typo in tool name and description: 'retrive_all_name_spaces' should be 'retrieve' (double 'e'). This is a spelling error that will confuse users and LLMs. Similarly, 'Retvives' in the description should be 'Retrieves'.