The Canvas MCP server defines 7 tools with explicit schemas and descriptions visible in src/canvas_mcp/server.py. Tool names follow verb_noun convention (canvas_create, canvas_update, canvas_list, etc.), which is correct. However, there are significant quality gaps: (1) Parameter descriptions are minimal or missing, canvas_update's 'components' array items lack detailed field documentation beyond brief property names; canvas_data's 'value' parameter has no description at all (only 'description: "Value to set at the path"' is generic). (2) Output schemas are entirely undocumented, tools do not declare what they return, forcing LLMs to guess at response structure. (3) Error handling descriptions are absent, no recovery guidance for common failures (e.g., 'surface_id not found'). (4) Some descriptions are instructional but lack clarity on return structure (e.g., canvas_show says 'Returns surface info, then you MUST call atv_cast_url' but atv_cast_url is not a registered tool in this server, creating a broken chain). (5) Tool descriptions are reasonable length (50 - 200 chars) and explain WHEN to use tools (good), but lack WHAT fields are returned and HOW the LLM should proceed. Per-tool analysis below shows most tools score 50 - 65 due to schema and error-handling gaps.
Close and delete a canvas surface
Create a NEW canvas surface with NEW content. Only use this when you need to render NEW visualizations (charts, dashboards, etc). Do NOT use this to show existing surfaces - use canvas_show instead.
Update data model on a canvas without re-rendering components
Get the full state of a canvas (components and data model)
List all canvas surfaces, optionally filtered by device
Show an existing canvas surface on a TV. Use this when user asks to 'show latest', 'show previous', 'go back', or display an existing surface. Returns surface info, then you MUST call atv_cast_url to actually cast it to the TV.
Output schemas completely undocumented. No tool declares what fields it returns (e.g., canvas_create returns surface_id but this is not documented in the schema). LLMs cannot plan downstream tool calls or extract data without knowing response structure.
Parameter descriptions severely lacking. canvas_data 'value' parameter has no description. canvas_update 'components' items ('id', 'component', 'children', 'text', 'style') are not described, LLMs must guess what each field does and what format is required.
No error handling guidance. Tools do not document what errors can occur or what LLMs should do when they fail. E.g., canvas_show references 'atv_cast_url' as a follow-up step, but this tool is not registered in the server, creating a broken dependency.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
Update components on a canvas surface using A2UI format
Destructive operations (canvas_close) lack confirmation or dry-run support. No mention of how to protect against accidental deletion or recovery options.
canvas_show returns 'surface info' but the structure and fields are not documented. It also mentions 'you MUST call atv_cast_url' but that tool is not exposed in this MCP server.