MCP server for Scratch project compilation, editing, and execution via a live Scratch VM editor
scratch-mcp defines 10 tools with complete input schemas and descriptions. Naming follows verb_noun convention (new_project, open_project, list_projects, compile, reload, run, stop, snapshot, read_state, import_sb3). Descriptions are present and contextual (avg ~120 chars), explaining WHAT each tool does and WHEN to use it. However, parameter descriptions are minimal (often single phrases like 'Project name', 'Optional project path'), lacking guidance on format, constraints, or dependencies. Output schemas are not documented, callers must infer structure from code. Error handling returns text messages but lacks recovery guidance or error classification. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk profiles (WRITE vs READ_ONLY marked in metadata). Tools are well-composed (each does one thing) and idempotent where appropriate (reload, compile are safe to retry). Baseline: avg tool description 194 chars (this server ~120), avg params 4 (this server 1-2), 100% of A+ tools have documented return types (this server has none visible).
Compile project source to a .sb3 (no editor); returns diagnostics.
Load an existing .sb3 into the editor (runnable, not editable source).
List projects under the projects root or a given dir.
Scaffold a new Scratch project folder that compiles clean.
Set the active project (validates project.yaml).
Read namespaced variables/lists/sprite state from the live editor.
Compile then load the project into the live editor (fail-loud).
Output schemas not documented. Tools return ToolResult (text, image, or error) but callers cannot see field structure. LLMs cannot plan downstream calls or extract data reliably.
Parameter descriptions are minimal (single phrases like 'Project name', 'Optional project path'). Missing format guidance, constraints, and dependencies. E.g., 'path' parameter lacks clarity on absolute vs relative, required directory structure, or validation rules.
No tool annotations despite clear risk profiles. Tools marked WRITE (new_project, reload, run, stop, import_sb3) should have destructiveHint=true; READ_ONLY tools should have readOnlyHint=true. Idempotent tools (compile, reload) should be marked idempotentHint=true.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Green-flag the loaded project, let it settle briefly (~2000ms), then report whether it finished (idle) or is still running — games with forever loops never go idle, so use snapshot/read_state to observe them. Pass waitForCompletion:true to wait for a terminating project to finish (up to timeoutMs, default 10000). timeoutMs overrides the settle/wait budget.
Screenshot the stage as a PNG image.
Stop all running scripts.
Error messages lack recovery guidance. E.g., 'no project loaded' should suggest 'Call reload() or import_sb3() first.' Errors are not classified as retryable, user-fixable, or fatal.
run() tool description is verbose (>300 chars) and mixes multiple concerns (settle time, forever loops, waitForCompletion flag). Simplify and clarify parameter semantics.