An MCP server implementation for QuickChart.io, allowing you to generate and download charts directly through Claude Desktop and other MCP clients.
Server has 2 tools with identical names (generate_chart), creating ambiguity. Both have reasonable descriptions (180-250 chars, within baseline 194 avg), but schemas differ significantly. Tool 1 uses structured chart_input object with detailed dataset properties; Tool 2 accepts raw config dict with minimal schema. Neither tool has error handling guidance, recovery paths, or actionable error messages. Parameter descriptions exist but lack constraints (e.g., no min/max for numeric data, no format specs). No output schema documented. Tool naming violates single-responsibility principle, both do chart generation but expect different input shapes, forcing LLM to guess which to use.
Generate a chart using QuickChart. Args: chart_input: Chart configuration including type, datasets, labels, title, and options download: If True, download the chart image and return the saved file path; otherwise return the URL output_path: Path where the chart image should be saved if download=True. If not provided, the chart will be saved to the script directory. Returns: The URL of the generated chart if download=False, otherwise the path where the chart was saved
Generate a chart using QuickChart. Args: config: A complete chart.js configuration object compatible with QuickChart. See https://quickchart.io/documentation/ for examples and format details. The config MUST have a 'type' field (one of: bar, line, pie, doughnut, radar, polarArea, scatter, bubble, radialGauge, speedometer) and a 'data' field with at least one 'datasets' subfield. Choose chart type based on your data. download: Whether to download the chart image (default: False) output_path: Path where the chart image should be saved if downloading. If not provided but download=True, the image will be saved to the current directory. Important: Note that the data fields in each dataset is a list of values like: "data": [-33, 26, 29, 89, -41, 70, -84] Returns: URL to the generated chart if download=False, otherwise path where the chart was saved
Duplicate tool names (both 'generate_chart') create ambiguity. LLM cannot distinguish which variant to call. Violates single-responsibility principle, one expects structured chart_input, the other raw config dict.
No output schema documented. Tool returns string (URL or file path) but LLM has no structured expectation of response format, field names, or downstream chaining requirements.
Error handling lacks recovery guidance. Code raises ValueError and Exception with minimal context. No actionable error messages (e.g., 'Invalid chart type: got X, must be one of: bar, line, pie...'). LLM cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 42 | 2026-07-28+ | v2 |
Parameter constraints missing. 'data' array has no min/max length. Chart type enum is documented in description but not enforced in Tool 2's schema (accepts raw dict). No validation that datasets contain required 'data' field.
Tool 2 schema is under-specified. 'config' parameter is type 'object' with only description, no properties defined. LLM cannot infer valid structure without reading docstring examples.