scratch-mcp
scratch-mcp
Ein Model Context Protocol-Server zum Bearbeiten von Scratch-.sb3-Projekten, aufgebaut auf scratch4js. Er hält ein Projekt im Speicher geöffnet, stellt die Bearbeitungsoberfläche der Bibliothek als MCP-Tools bereit und speichert zurück auf die Festplatte.
Darüber hinaus hostet sie eine Live-Reload-Bridge auf http://localhost:9060. Mit dem installierten TurboWarp-Desktop-Userscript lädt jeder save_project das Projekt live im Editor neu — die Änderungen eines Agents erscheinen also sofort.
Installation
npx scratch-mcp # serves MCP over stdioRelated MCP server: scratch-mcp
Entwickeln
Der MCP-Server liegt im Repository-Wurzelverzeichnis; die Bibliotheken, auf denen er aufbaut, sind Workspace-Pakete unter packages/.
pnpm install
pnpm run build # builds scratch4js, s-api4js and the userscript
pnpm start # serves MCP over stdioEinen MCP-Client konfigurieren
{
"mcpServers": {
"scratch": {
"command": "node",
"args": ["/abs/path/to/ScratchMCP/src/index.js"]
}
}
}Setzen Sie SCRATCH_MCP_BRIDGE_PORT, um den Bridge-Port zu ändern (Standardwert 9060). Wenn der Port belegt ist, startet der Server trotzdem; nur das Live-Reload wird deaktiviert.
Als MCP-Bundle installieren (.mcpb)
Für die Ein-Klick-Installation in Claude Desktop und anderen MCPB-fähigen Clients packaged sich dieser Server als MCP Bundle — eine einzelne .mcpb-Datei, die den Server plus ein eigenständiges node_modules enthält.
pnpm run mcpb # → dist/scratch-mcp-<version>.mcpbÖffnen Sie die .mcpb dann in Ihrem Client (in Claude Desktop ziehen Sie sie auf Einstellungen → Erweiterungen). Das Bundle bietet eine Einstellung — den Live-Reload-Bridge-Port — und benötigt keine weitere Konfiguration. Der Build (scripts/build-mcpb.mjs) bindet die scratch4js- und s-api4js-Workspace-Pakete als Tarballs ein und installiert die Git-Version von scratch-vm und deren Peers in ein flaches node_modules, wie von MCPB verlangt. Die manifest.json ist die maßgebliche Quelle des Bundles (ihre Version wird zur Build-Zeit aus package.json übernommen).
Werkzeuge
Projekt
open_project { path }— lädt eine.sb3in den Speicher.save_project { path?, compressionLevel? }— schreibt sie zurück (und startet Live-Reload).project_info— Targets, Erweiterungen, Monitore, Metadaten.
Scratch-Website (Online-Projekte, über s-api4js)
scratch_login { username?, password? }— bei scratch.mit.edu anmelden (Standard:$SCRATCH_USER/$SCRATCH_PASS). Die Sitzung lebt nur im Speicher des Serverprozesses.open_scratch_project { projectId }— ein Projekt anhand der ID herunterladen und zur Bearbeitung öffnen (geteilte Projekte benötigen keine Anmeldung; eigene, nicht geteilte schon).push_to_scratch { projectId?, confirm? }— das geöffnete Projekt zurück auf scratch.mit.edu speichern und online überschreiben (lädt zuerst die Assets hoch, dannproject.json).share_project { projectId?, confirm? }— ein Projekt veröffentlichen, damit es öffentlich ist.
push_to_scratchundshare_projectverändern das live Projekt. Sie fragen deshalb immer zuerst nach Ihrer Bestätigung — per MCP-Elicitation-Aufforderung, wenn Ihr Client das unterstützt, andernfalls durch die Anforderung vonconfirm: true(das der Agent nur setzen sollte, nachdem Sie zugestimmt haben).
Lesen
list_sprites— alle Figuren mit Position, Größe, Medien.get_target { name }— vollständige Details zu einer Figur oder"Stage".get_target_json { name, pointer? }— den rohenproject.json-Eintrag des Ziels (Blöcke, Kostüme, Klänge, …) oder einen Teilbaum an einem JSON Pointer. Vor der Erstellung einespatch_targetlesen.
Block-Referenz (damit der Agent weiß, welche Blöcke es gibt und wie er sie füllt)
list_blocks { category? }— Katalog der Standard-Opcodes, jeweils mit Kategorie, Form (Einstecker / Block / C-Block / Abdeckung / Reporter / Boolean) und den Namen seiner Eingaben und Felder. Wird beim Start aus dem installiertenscratch-vmgeneriert und bleibt so synchron.get_block_schema { opcode, target? }— vollständiges Schema für einem Opcode: jede Eingabe mit ihrer sb3-Schattenkodierung (z. B. ist eine Texteingabe[1, [10, "hi"]]), jedes Feld mit aufgezählten Dropdown-options, und ein direkte anpassbares Beispiel JSON. Dynamische Menüoptionen (Figuren, Klänge, Kostüme, Broadcasts, …) werden aus dem geöffneten Projekt gefüllt; sietargetübergeben, um die eigenen Kostüme und Klänge dieser Figur aufzuzählen. Auch eingebaute Extensions-Blöcke sind abgedeckt (pen_*,music_*,microbit_*, …), generiert aus demgetInfo()jeder Erweiterung.
Erweiterungen
enable_extension { id, url? }— eine Erweiterung registrieren, sodass ihre Blöcke lernen und in der Palette erscheinen (erforderlich, bevor ein<id>_…-Block verwendet wird). Für eine eingebaute Erweiterung nuridübergeben (pen, music, videoSensing, text2speech, translate, makeymakey, microbit, ev3, boost, wedo2, gdxfor); für eine benutzerdefinierte bzw. Drittanbieter-(TurboWarp-)Erweiterungurlhinzufügen.list_blocks { category: "<id>" }undget_block_schemabeschreiben eingebaute Erweiterungsblöcke;patch_targetwarnt, wenn ein Block eine nicht aktivierte Erweiterung verwendet. Benutzerdefinierte Erweiterungen sind stumm — einen bestehenden Block überget_target_jsonspiegeln.
Rohe JSON bearbeiten (diff/patch)
patch_target { name, patch }— einen RFC 6902-JSON-Patch auf das rohe JSON eines Ziels anwenden. So bearbeiten Sie die Skripte (blocks) einer Figur oder jedes andere Feld, das die höherwertigen Werkzeuge nicht abdecken — bei einer neu erstellten oder einer bestehenden Figur. Die Pfade sind JSON Pointer inget_target_json; der Patch wird atomar (alles oder nichts) angewendet, und das Ergebnis meldetwarningsfür unbekannte Opcodes oder Eingaben. Das Patchen dercostumes-/sounds-Arrays verschiebt keine Asset-Daten — dafüradd_costume/remove_costumeverwenden.
Sprites & Bühne
set_sprite { name, x?, y?, size?, direction?, visible?, draggable?, rotationStyle?, layerOrder?, volume? }add_sprite { name, ...props }/remove_sprite { name }/rename_target { name, newName }wie auf Set_stage { tempo?, videoState?, videoTransparency?, volume? }
Variablen, Listen, Broadcasts (target ist eine Figurenname oder "Stage")
set_variable { target, name, value }/delete_variable { target, name }set_list { target, name, items }/delete_list { target, name }add_broadcast { name }
Kostüme & Sounds
add_costume { target, name, path, dataFormat?, rotationCenterX?, rotationCenterY? }remove_costume { target, name }add_sound { target, name, path, dataFormat? }/remove_sound { target, name }
Run & Test (headless TurboWarp-VM, prozessintern)
vm_load— das geöffnete Projekt in eine headless VM (mit In-Memory-Bearbeitungen) laden.vm_green_flag— die grüne Flagge drücken (Sprechblasen, Frage, Fehler löschen).vm_run { seconds?, frames?, untilIdle?, paced? }— die VM vorwärtslaufen lassen und Zustand plusevents-Zeitweise (sagen/denken, Broadcasts, Frage/Antwort, Fehler) seit dem letzten Lauf zurückgeben.vm_state— Zustands-Abbild: Position/Seite/Richtung/Kostüm/Sichtbarkeit jedes Ziels, Variablen, Listen, Monitore, Sprech- und Denkblasen, ausstehende Fragen, laufende Threads, Fehler.vm_input { keys?, mouseX?, mouseY?, mouseDown?, answer? }— Tastatur-/Mauseingabe und Antwort aufask and wait.vm_stop— alle Skripte stoppen.
Live-Reload & Screenshots (erfordert Bridge + Userskript)
reload { path? }— eine.sb3von der Festplatte im Editor laden.run_project/stop_project— grüne Flagge / Stopp.screenshot— die Live-Bühne als verlustfreies PNG erfassen, falls exakte Pixel wichtig sind. Ohne Parameter.screenshot_jpeg { quality? }— dieselbe Aufnahme als komprimiertes JPEG (kleiner, günstiger zu lesen;quality1–100, Standardstandard 80).
Ein Projekt ausführen und testen
Die vm_*-Werkzeuge betten TurboWarp's scratch-vm (den JIT-Fork) in denselben Prozess ein — kein Browser, kein WebGL. Der Ablauf ist: Bearbeiten → vm_load → vm_green_flag → vm_run → vm_state lesen → prüfen. Es liefert strukturierten Zustand (Variablenwerte, Figurenpositionen, Sprechblasen), den ein Agent direkt prüfen kann — viel besser als über Pixeln zu raten, und deterministisch genug für CI.
Die headless VM hat keinen Renderer und kein Audio: Kostüm-Metadaten laden weiterhin (damit die Logik „Kostüm nach Name/Nummer” funktioniert), aber renderer-abhängige Blöcke (berühren Farbe/Figur/edge, Stift) und Ton-Wiedergabe sind inaktiv. um die echte gerenderte Bühne zu sehen, das Projekt in TurboWarp Desktop ausführen und screenshot aufrufen.
Ereignisse
Relevante Ereignisse — say/think, broadcast, greenflag, stop, question/answer sowie Laufzeit-/Compiler-errors, jedes { name, type, message, …fields } — werden auf zwei Wegen angezeigt:
Im Ergebnis von
vm_run(events): die chronologische Abfolge seit dem letztenvm_run. Dies ist der agentenfähige Kanal — das Modell liest es direkt im Tool-Ergebnis und kann so die Reihenfolge prüfen, nicht nur den Endzustand. Immer aktiv.Als MCP-Log-Benachrichtigungen (
notifications/message,logger: "scratch-vm"): der client-/nutzerorientierte Kanal für die Log-Ansicht eines Hosts. Bis der Client sie vialogging/setLevelaktiviert, bleibt er stumm —"info"für Aktivität,"debug"auch für Läufe und Block-Grenzen,"warning"+ nur Fehler. (Die meisten Clients geben Benachrichtigungen nicht ans Modell weiter, deshalb gibt es sie auch alsvm_run.)
Wiederholte identische say/think-Sprechblasen werden dedupliziert, sodass ein say in einer Loop keinen der beiden Kanäle überflutet.
Wie das Live-Reload funktioniert
Die Bridge ist ein schlichte WebSocket- plus HTTP-Server. Das Userscript verbindet sich über WebSocket und beantwortet JSON-Anfragen (loadSB3 / loadSVG? Nein, loadSB3/start/start/stop/screenshot). Bei loadSB3 ruft es bytes von GET /get.sb3?path=… ab und lädt sie in den TurboWarp-VM; save_project schreibt die Datei und sendet es das loadSB3, damit der Editor stets den letzten Stand zeigt. Ein Screenshot-Schnappschuss kommt als PNG zurück, das der Server unverändert weiterreicht (screenshot) oder als komprimiertes JPEG re-encodiert (screenshot_jpeg).
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables the generation, management, and validation of Apple Shortcuts (.shortcut files) by providing tools to search actions and build control flow blocks. It allows users to programmatically create and analyze shortcut structures for deployment on iOS and macOS devices.
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to programmatically edit Scratch .sb3 projects and preview changes live in TurboWarp Desktop via MCP tools and a live-reload bridge.1Mozilla Public 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to create, compile, and run Scratch projects by editing plain text and using a live editor loop.18Mozilla Public 2.0
- AlicenseAqualityAmaintenanceEnables AI agents to inspect, create, edit, debug, and playtest projects inside the Roblox editor via 29 lean tools, with push-based SSE transport, editor-safe script edits, and batched undoable writes.292MIT
Related MCP Connectors
Control Unreal Engine to browse assets, import content, and manage levels and sequences. Automate…
Browse, create, edit, and export SVGator animated SVG projects via your SVGator account.
Drive a live Cinevva game session: edit game files, import CC0 assets, preview changes.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AstroBlocksMod/ScratchMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server