An MCP server that provides retrieval-augmented generation (RAG) capabilities using a vector database for Python FAQ queries and web search functionality.
This MCP server has 2 tools with minimal quality standards met. Both tools have descriptions and basic input schemas, but lack rigor in several critical dimensions. Tool names are action-oriented (retrieval, search), which is good. However, parameter descriptions are extremely sparse (single short lines), output schemas are undocumented, and error handling is minimal. The server initializes a stateful FAQ engine at startup (faq_engine global), which violates stateless request principles. No per-tool quality gate or validation guidance. This is a typical community project with working basic functionality but insufficient production hardening.
Search for information on a given topic using Firecrawl. Use this tool when the user asks a specific question not related to the Python FAQ.
Retrieve the most relevant documents from the Python FAQ collection. Use this tool when the user asks about general Python programming concepts.
Output schemas are completely undocumented. python_faq_retrieval_tool returns `str`, firecrawl_web_search_tool returns `List[str]`, but neither schema defines what fields or structure the LLM should expect to parse from the response. This forces LLMs to infer structure and wastes tokens.
Parameter descriptions are minimal. The 'query' parameter in both tools has only 8 - 13 word descriptions ('The user query to retrieve...' / 'The user query to search...'). This is below the 10 - 1024 character guideline. No constraint on length, format, minimum complexity, or behavior guidance. LLMs cannot reliably infer what makes a good query.
No pagination or result limiting documented. firecrawl_web_search_tool returns a list of results but does not describe how many, whether results are paginated, or what the practical limit is. Large result sets can exhaust context windows.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 32 | - | v1 |
Tool descriptions do not specify when to choose one over the other with sufficient clarity. 'Use this tool when the user asks about general Python programming concepts' (FAQ) vs 'Use this tool when the user asks a specific question not related to the Python FAQ' (web search) relies on fuzzy intent classification. No guidance on overlapping queries or fallback behavior.
Error handling is minimal and non-actionable. python_faq_retrieval_tool returns 'Error: FAQ engine is not initialized.' with no recovery guidance. firecrawl_web_search_tool returns bare API error messages without classification (retryable vs fatal) or suggestions. LLMs cannot act on these errors.
Firecrawl API key is exposed as a server-side environment variable, which is correct. However, no documentation of permission scope (read-only web search vs write) or rate limits. Tool description does not warn if API key is missing until runtime.
Tool naming is adequate but lacks specificity. 'python_faq_retrieval_tool' and 'firecrawl_web_search_tool' are clear that they retrieve and search respectively. However, 'retrieval_tool' is generic, 'query_python_faq' would be more action-focused (pattern: verb_noun). Baseline tooling uses shorter, punchier names (avg 18 chars; these are 29 and 27 chars).