MCP server for summarizing CSV and Parquet files
This server has only 2 simple read-only tools with minimal descriptions and basic parameter validation. Both tools follow a similar pattern (filename → summary string) with no error handling guidance, no output schema documentation, and no pagination or composition support. Tool names are adequately verb-prefixed (summarize_*), but descriptions are generic and lack context on when to use each tool or how they differ. Parameters lack constraints (no enum, no format hints, no validation rules). No security hardening, no error recovery guidance, and no structured output schema. The tools are functional but fall well short of production-grade quality.
Summarize a CSV file by reporting its number of rows and columns.
Summarize a Parquet file by reporting its number of rows and columns.
Descriptions are generic and lack LLM-optimized context. Both tools describe only WHAT they do ('Summarize a [file type] file'), not WHEN to use them or how they differ. Descriptions are ~90 chars, within length bounds, but offer no selection guidance, no dependency hints, and no explanation of use case.
No output schema documented. Tools return a plain string ('CSV file "x" has N rows and M columns.'), but there is no schema definition specifying field names, types, or structure. LLMs cannot plan downstream calls or extract specific fields without knowing the response structure.
Parameter 'filename' lacks validation constraints. No enum, no regex pattern, no min/max length, no format hint. The description says 'Name of the [file type] file in the /data directory (e.g., "sample.csv")', which includes an example value. LLMs may latch onto 'sample.csv' literally rather than adapting to actual filenames. No constraint tells the LLM what filenames are valid.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 43 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
No error handling or recovery guidance. The tools call pandas.read_csv() and read_parquet() directly with no try-catch. If a file is missing, malformed, or unreadable, the tool will crash with a raw exception. The LLM receives no actionable error message, no guidance to check filename, retry, or call a discovery tool.
No path traversal or input validation. The tools accept a bare filename and construct a path as DATA_DIR / filename. An LLM could pass '../../../etc/passwd' and read files outside /data. No sanitization of the filename parameter.
Duplicate tool functionality without clear distinction. Both tools do the same thing (read a file, count rows/columns) on different formats. Descriptions do not explain when to use CSV vs Parquet, the agent must infer this from context. A single 'summarize_file' tool accepting both formats would be clearer.