Bridge between Claude (or any MCP client) and Krita painting application. Uses FastMCP to expose Krita painting tools over the Model Context Protocol, communicating with a Krita plugin via HTTP.
Static source inference · medium confidence · evidence: Streamable HTTP
Current-spec patterns detected
Summary
This Krita MCP server has 15 tools with reasonably clear naming and mostly complete schemas. Strengths: consistent verb-noun naming (krita_*), all tools have descriptions (10-150 chars typical), and all input parameters are typed with descriptions. Weaknesses: descriptions are often too brief (under 50 chars) and lack context about when to use each tool; output schemas are undocumented (tools return plain strings, not structured objects); no explicit error handling guidance for LLMs; missing parameter constraints (enums, ranges); no documentation of state dependencies or tool composition; parameter names like 'shape' accept free-form strings instead of enums. Results are returned as plain text rather than structured JSON, forcing LLMs to parse unstructured responses. The server operates over HTTP to a Krita plugin, not directly, this introduces a dependency on an external service that could fail or be unavailable. Overall, definitions are functional but lack production-grade polish.
Tools (15)
krita_cleardestructivesource verified72/100
Clear the canvas to a solid color.
krita_draw_shapewritesource verified58/100
Draw a shape on the canvas.
krita_fillwritesource verified70/100
Fill an area with current color (paints a filled circle at the point).
krita_get_canvasread onlysource verified72/100
Export current canvas to a PNG file and return the path. Use this to see your painting progress.
krita_get_color_atread onlysource verified73/100
Sample the color at a specific pixel (eyedropper).
krita_healthread onlysource verified85/100
Check if Krita is running and the MCP plugin is active.
Output schemas are undocumented. All tools return plain text strings rather than structured JSON objects. LLMs cannot parse results predictably or extract typed fields for downstream operations.
Parameter 'shape' in krita_draw_shape accepts free-form strings ('rectangle', 'ellipse', 'line') with no enum constraint. LLMs may hallucinate invalid shape names.
Descriptions are often too brief (under 50 chars). Many tools lack context about when to call them or dependencies on prior calls (e.g., krita_undo, krita_redo only say 'Undo the last action'). Descriptions should explain when to use each tool versus others.
Recommendations
Return structured JSON objects instead of plain strings. For example, krita_new_canvas should return {"status": "created", "document_id": "...", "width": 800, "height": 600, "background": "#1a1a2e"} so LLMs can extract and chain these fields.
Add enum constraints to 'shape' parameter in krita_draw_shape. Change description to: 'Type of shape ("rectangle", "ellipse", or "line")'.
Expand descriptions to 50-150 characters with context. Example: 'Undo the last action. Call this after an unwanted stroke, fill, or shape. Use krita_redo() to revert the undo.' This explains when and why to use it.
Add parameter ranges and constraints to numeric inputs. Example for krita_new_canvas: width (100-4000 pixels, default 800), height (100-4000 pixels, default 600). For krita_stroke: pressure (0.0 to 1.0, where 1.0 is full opacity).
Document output schema for each tool. Add a 'Returns' section to docstrings. Example: 'Returns {"status": "success", "x": int, "y": int, "color": hex_string, "r": int, "g": int, "b": int}' for krita_get_color_at.
Add error guidance. Instead of returning plain error strings, return structured errors with actionable next steps: {"error": "Cannot connect to Krita", "retryable": true, "next_step": "Ensure Krita is running and the MCP plugin is enabled"}.
Add confirmation before destructive operations. Implement krita_clear_confirm and krita_save_confirm tools that return a confirmation_id, which the agent must then pass to a confirmed_krita_clear(confirmation_id) to execute. Or add a 'dry_run' parameter to preview the outcome.
Score history
Overall score trend
↑ 35 points across a rubric change (v1 → v2)
73/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
B
73
2026-07-28+
v2
2026-03-09
F
38
-
v1
write
source verified
75/100
Create a new canvas in Krita.
krita_open_filewritesource verified72/100
Open an existing file in Krita (.kra, .png, .jpg, etc).
No error handling guidance. Error responses return strings like 'Error: Cannot connect to Krita...', but do not tell LLMs whether to retry, ask the user, or give up. Missing recovery paths.
Tool composition gaps: krita_get_canvas exports PNG but does not document what format LLMs should expect or how to use the returned path. No clear chaining between tools (e.g., after krita_new_canvas, what's the next call?).
Destructive operations (krita_clear, krita_save) have no confirmation or dry-run step. An agent could accidentally overwrite or clear a painting.
krita_clearkrita_save
Document tool composition order. Add a README or docstring explaining: 'Start with krita_health to verify Krita is running. Then krita_new_canvas or krita_open_file to load a document. Paint with krita_stroke, krita_fill, krita_draw_shape, etc. Call krita_get_canvas to preview. Finally krita_save to export.'
Add parameter descriptions for optional parameters. Example in krita_set_brush: 'If preset is not provided, the current brush is retained. If size or opacity is not provided, defaults are not changed.'
Document the hex color format more explicitly. Example: 'Hex color code (6-digit format, e.g., "#ff6b6b" for red, "#000000" for black). Format: #RRGGBB where RR, GG, BB are hexadecimal 00-FF).'
Add a tool to query current state: krita_get_state() returning {"document_id": "...", "canvas_width": 800, "canvas_height": 600, "foreground_color": "#...", "brush_preset": "...", "brush_size": 50, "brush_opacity": 1.0}. This helps agents plan multi-step operations without trial-and-error.
Consider adding krita_batch_stroke and krita_batch_fill for agents to paint multiple strokes/fills in one call, reducing latency and token overhead.