MCP server that processes QuantConnect PDF documentation, converts PDFs to markdown, and provides search capabilities with TF-IDF scoring and proximity-based ranking
This server has 3 tools with basic functionality but significant quality gaps. Tool names are action-verb correct (search_, get_, list_), but descriptions lack sufficient detail and parameter descriptions are minimal. Input schemas are present but incomplete, parameters lack formal type constraints and validation guidance. Output schemas are entirely undocumented. Error handling is absent from the visible code. The implementation shows a functional search index and PDF parsing, but the MCP tool interface falls below production standards.
Retrieve a specific document by ID with full markdown content and metadata
List all available documents with their metadata
Search QuantConnect documentation using TF-IDF ranking with proximity boosting for multi-word queries
Output schemas completely undocumented for all 3 tools. LLMs cannot know what fields are returned, required for downstream tool chaining or result extraction.
No result limits or pagination guidance. list_docs could return hundreds of documents; search_docs returns up to 5 results but doesn't document structure. Risk of context overflow and poor LLM reasoning.
Parameter descriptions are minimal. 'doc_id' lacks format guidance; 'query' lacks syntax guidance; 'max_results' lacks explanation of sorting/ranking. LLMs will guess at intent.
No error handling guidance. Tool descriptions do not explain failure modes (doc not found, invalid query syntax, PDF parse errors) or recovery steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Tool descriptions do not explicitly state these are read-only, safe to retry, and have no side effects. LLMs cannot reason about idempotency or retry safety.
No parameter constraints. 'query' accepts any string; 'doc_id' has no format validation; 'max_results' has no minimum/maximum bounds. Code shows max_results defaults to 5, but this is not surfaced to the LLM.
Tool composition unclear. After search_docs returns results with 'doc_id', can the LLM pass that directly to get_doc? Must the IDs match exactly? This dependency is undocumented.