An SVG that renders is not the same as a chart that drew your data. Getting mark counts, resolved axis domains and an empty flag back with the image means an agent can tell an empty chart from a working one without a human looking at it. The recommendation tools work the other way round — hand over sample rows and get ranked chart types with reasons, caveats and ready-to-use props.
The MCP server that ships with Semiotic, a React data-visualisation library. It exists so an AI assistant writes chart code that works the first time: schemas are machine-readable, rendering happens server-side, and bad configurations come back with diagnostics rather than a blank canvas.
- A chart rendered to static SVG, answered with a render-evidence block — mark counts by scene type, resolved axis domains, an empty flag, annotation count and accessible name — so the agent can confirm data marks actually drew — `renderChart`
- The prop schema for one component, or the whole schema-backed catalogue, with renderable components marked — `getSchema`
- Chart recommendations from sample rows or from capabilities, plus stream-oriented, dashboard and audience-literacy variants — `suggestChart`, `suggestCharts`, `suggestStreamCharts`, `suggestDashboard`, `suggestStretchCharts`
- Configuration checked for empty data, bad dimensions, missing accessors and wrong data shape, returning a readable report with fixes — `diagnoseConfig`
- A requested chart checked against the dataset with ranked alternatives when it does not fit — `repairChartConfig`
- A statistical summary and chart-aware context for answering questions about a chart — `interrogateChart`
- Theme presets applied, and a pre-filled GitHub issue URL generated — `applyTheme`, `reportIssue`
- A ChatGPT Apps widget with fit, zoom, hover and render-evidence controls — `renderInteractiveChart`
- Resources to read directly, including `semiotic://schema`, `semiotic://schema/{component}`, `semiotic://behavior-contracts`, `semiotic://system-prompt` and `semiotic://examples`, plus the `build-semiotic-chart` and `debug-semiotic-chart` prompts
No API keys and no authentication. The README runs it under the name `semiotic-mcp`, which npm does not have; the published package is `semiotic` 3.9.1. It runs locally over stdio, and HTTP mode is `--http --port 3001`, bound to 127.0.0.1 unless you deliberately change the host; since 3.7.2 it is stateless, so it autoscales without sticky sessions. A Cloud Run deployment wrapper is included, with `MCP_ALLOWED_HOSTS` for host-header allowlisting.
