ScratchJr Desktop MCP Server
This server lets an AI assistant create, edit, run, inspect, and save real ScratchJr Desktop projects through MCP, including custom artwork, screenshots, and backups.
Connect and inspect:
scratchjr_connect/scratchjr_statusattach to a running ScratchJr or launch it, and report build/status.Discover assets and blocks:
scratchjr_list_assetsandscratchjr_block_referenceshow available characters, backgrounds, sounds, and supported programming blocks.List and read projects:
scratchjr_list_projectsandscratchjr_get_projectfind saved projects and return their pages, objects, scripts, and revision IDs.Create projects:
scratchjr_create_projectbuilds complete native projects with up to four pages, characters, text, backgrounds, and block scripts.Edit projects:
scratchjr_edit_projectapplies batch edits such as renaming, adding pages/characters/text, replacing characters, changing scripts, setting backgrounds, or removing objects, while preventing stale overwrites.Open/save/run:
scratchjr_open_project,scratchjr_save_project,scratchjr_run_project, andscratchjr_stop_projectcontrol the real editor and green-flag execution.Test interactions:
scratchjr_click_charactertriggers click events to exercise interactivity.Custom SVG artwork:
scratchjr_add_svg_assetregisters custom characters or backgrounds from SVG and returns an md5 asset name for project use.Visual verification:
scratchjr_screenshotcaptures the actual ScratchJr window and returns the image plus its saved path.Backup and export:
scratchjr_backupmakes full timestamped database snapshots, andscratchjr_export_projectexports project JSON with referenced custom media.Safe persistence: Creating/editing/artwork changes are backed up first, and database writes are flushed to disk.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ScratchJr Desktop MCP Servercreate a new project with a cat character and a "hello" speech bubble"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Title: ScratchJr Desktop MCP Server
Description:
Create, edit, run, and inspect real ScratchJr Desktop projects through an MCP client such as Claude, Codex, Cursor, or Google Antigravity. This server controls the installed application through a local Electron connection and saves through ScratchJr's own database interface.
Use natural-language requests to build interactive stories, animations, and simple games with characters, backgrounds, text, sounds, and programming blocks. The server also provides screenshots, custom SVG artwork, and automatic database backups.
Already set up on this PC: Scratch.JR [ AI-Assisted ] v1.0.2 is built and installed, and the server dependencies are in place. The scratchjr entry is registered with Claude Desktop, Claude Code, and Codex, all three pointing at C:\Users\SkieHackerYT\Documents\Gitlab\ScratchJR-MCP\src\server.js. Google Antigravity is registered too, in %USERPROFILE%\.gemini\config\mcp_config.json. Restart Claude, start a new Codex session, and refresh Antigravity's MCP server list to load the tools. Cursor is not installed on this PC; section 5 covers it when it is. The installation steps below are for setting up another PC or reinstalling this project.
Related MCP server: scratch-mcp
Requirements:
Requirement | Details |
Operating system | Windows with PowerShell; this integration was tested on Windows |
ScratchJr | Either the bundled build in |
Node.js and npm | Node.js 22 or newer; tested with Node 24. npm is used to install server dependencies |
AI client | Claude Desktop, Claude Code, Codex, Cursor, or Google Antigravity with local MCP support; run the client on the same Windows PC as ScratchJr |
CLI registration | Install the Claude Code or Codex CLI and make it available on PATH if you want the setup script to register that client automatically. Claude Desktop setup does not require these CLIs |
Project files | This repository, including |
Internet access | Needed to download software, install npm dependencies, and use your AI client |
Local storage | Write access to ScratchJr's Documents folder and this server's |
Disk space for the bundled build | Around 1 GB once built: 0.4 GB of dependencies under |
This integration controls ScratchJr Desktop. The tablet version and Scratch 3 use different integrations.
Bundled desktop app: Scratch.JR [ AI-Assisted ] v1.0.2
desktop/ holds a full copy of the ScratchJr Desktop community port with the MCP bridge built into it. The stock app only exposes the local connection this server needs when the server launches the app itself, so a window that a child already had open could not be driven, and the server had to ask for the app to be closed and reopened. The modified build opens that connection on 127.0.0.1:9223 as it starts, so the server attaches to whichever window is already running.
The build also reports its identity through scratchjr_status, which returns build and buildVersion alongside the ScratchJr data version.
It installs to %LOCALAPPDATA%\ScratchJR-AI-Assisted\app-1.0.2\ScratchJr.exe. Projects still live in Documents\ScratchJR\scratchjr.sqllite, the same file the stock app uses, so existing projects carry over untouched.
See Installation Setup below for how to build and install it. desktop/UPSTREAM.md records the upstream commit this copy came from and every modification made to it, so the changes can be re-applied to a newer upstream release.
Using the stock app instead
The server still works with an unmodified ScratchJr Desktop installation. It looks for the modified build first and falls back to %LOCALAPPDATA%\ScratchJr\app-*\ScratchJr.exe, so nothing needs to be uninstalled. With the stock app, the server must launch ScratchJr itself; if the app is already open, it will ask you to save and close it first.
Renaming the build
Product name, version, installer name, and debug port live in desktop/src/branding.js, and nothing else hardcodes them. Note that MIT's trademark policy, in desktop/TRADEMARKS, expects a build with added features to drop the ScratchJr marks and use its own name; that matters if you publish the installer rather than build it for yourself.
Built-in assistant
The app has its own chat panel beside the editor, so a child can ask for a story without Claude Desktop, Codex or any other editor installed. You supply the model - a hosted one with your own API key, or LM Studio or Ollama running on the same computer; the app supplies the tools.
+---------------------------+---------------+
| Scratch.JR editor | Assistant | <- AI-Assist tab
| | chat | on the edge
+---------------------------+---------------+The panel is a side bar on the right, like the chat panel in a code editor. The AI-Assist tab on the right-hand edge folds it away and brings it back, and the editor takes the whole window whenever it is shut. The border between the two can be dragged to set the width.
Opening the panel widens the window by the panel's width and closing it gives that width back, so the editor is never the one that pays for the chat. ScratchJr's own layout stops working below 766px wide, so the window will not let itself be made small enough to reach that; a maximised window is left where it is. Which side the panel was left on, and how wide, is remembered between runs.
The panel drives the same MCP tools an external editor would. Internally it starts the server in src/server.js as a child process and that server drives the editor back through the debugging port, so one implementation of every tool serves both routes and they cannot drift apart.
Choosing a provider
Open File > Settings. Four providers are offered, all speaking the OpenAI chat completions shape. Two are hosted and need an account; two run on this computer and need neither key nor internet connection:
Provider | Endpoint | Needs | Where to get it |
DeepSeek |
| An API key, paid per message | |
OpenRouter |
| An API key, paid per message | |
LM Studio |
| The app running, with its local server started | |
Ollama |
| The app installed; it serves in the background |
A key, a model and a server address are remembered separately for each provider, so switching between them does not disturb the settings of the one left behind.
The hosted providers
Model is a drop-down of the models worth picking, with the id the provider actually accepts:
Provider | Choice | Model id |
DeepSeek | Flash - fast, everyday chat |
|
DeepSeek | V4 Pro - thinks before answering |
|
OpenRouter | DeepSeek Flash (latest) |
|
OpenRouter | DeepSeek Pro (latest) |
|
OpenRouter | V4.1 Flash / V4 Pro, pinned |
|
The OpenRouter latest slugs follow DeepSeek as new versions land, so they do not need changing here. The last entry in the drop-down, Something else, opens a box for any other id the provider accepts, such as openai/gpt-4o-mini on OpenRouter.
Picking a thinking model turns the thinking on in the request, and the panel shows that thinking in a folded block of its own while it arrives.
LM Studio and Ollama
Nothing leaves the computer and nothing is charged, but the model has to be running first:
LM Studio - open it, go to the Developer tab and start the local server.
Ollama - install it and pull a model, for example
ollama pull qwen3:8b. It then serves in the background.
Model is not a written list here, because it is whatever has been downloaded. Refresh asks the server what it has and fills the drop-down; Test says whether the server is answering at all. If neither reaches it, Server address takes another port, or the address of another machine on the same network.
The assistant builds projects by calling tools, so pick a model that supports tool use - Ollama tags those at ollama.com/search?c=tools. A model that cannot call tools will talk about the story without building it. Smaller models also run out of room in a long conversation sooner; New chat clears it.
A local thinking model, such as one of the qwen3 or r1 family, writes its thinking into the reply between <think> tags rather than sending it separately. The panel pulls that back out and shows it in the same folded block the hosted providers use, so the reply reads the same either way.
Settings are stored in ai-settings.json inside the app's userData folder, which survives updates. API keys are written there in plain text, so treat that file the way you would treat the keys themselves.
Logs
Everything the app does is written to a plain text file: startup, the window, every message sent, every tool call and how long it took, every error, and what was installed. One file per day, in a Logs folder beside the app itself:
%LOCALAPPDATA%\ScratchJR-AI-Assisted\Logs\9-23-2026_Log.txtLines read:
[ 9-23-2026 08:58:24 ] [ INFO ] - Starting the MCP tool server {"node":"node.exe","server":"...\mcp\src\server.js"}
[ 9-23-2026 08:58:28 ] [ INFO ] - Tool call finished {"tool":"scratchjr_status","ms":3225,"isError":false}
[ 9-23-2026 08:59:02 ] [ WARN ] - No usable Node.js found {"needs":22}Status is INFO, WARN or ERROR. The folder sits next to the app rather than inside the versioned folder, so an update does not take the logs with it; if that folder cannot be written - an install somewhere locked down - the app falls back to a Logs folder in its userData directory instead of failing. The API key is never written, in any line, including inside error text. Logs older than 30 days are deleted at startup.
When something is missing
The assistant needs Node.js 22 or newer for its tool server. If there is none, or the one installed is too old, the app asks before doing anything about it:
Something is missing - The assistant needs Node.js to run the ScratchJr tools, and it is not installed on this computer. Install a copy for this app only? [ Install now ] [ Not now ]
Not now installs nothing and says so in the panel; the question comes back next time a message is sent. Install now downloads about 36 MB into the app's own folder, which needs no administrator rights and leaves any other Node.js alone.
If the tool server itself cannot be found, the app says which setting points at it rather than failing halfway through a story.
Cost and the round limit
Every message is a paid request on your own account, and a single story usually costs several requests because the assistant calls tools and reads the results. Tool rounds per message under Advanced caps how many times it may do that before it has to stop and report back. Twelve suits most stories; lower it to spend less, raise it for longer builds.
Node.js installs itself
The assistant runs the tool server with Node 22 or newer. You do not have to install it: the first time you send a message, the app checks for a suitable Node and, finding none, downloads one.
It takes the portable zip rather than the official installer, and unpacks it into the app's own folder under userData. That means no administrator rights, no UAC prompt, no change to the machine's PATH, and no interference with any Node already installed for other work. Uninstalling the app removes it too. The download is about 36 MB and happens once.
A Node that is already installed and new enough is used as it is and never replaced. One that is too old is left alone as well; the app fetches its own copy alongside it.
Advanced > Node.js path shows which Node will be used and offers an Install now button to do the download before you need it. Leave the box blank to keep detecting automatically, or point it at a specific node.exe.
The editor itself works without Node; only the assistant needs it.
What the panel shows
Replies stream in as they are written, so there is something to watch from the first second rather than a blank panel until the whole answer lands. While a message is running, a strip under the heading says what is happening now - waiting for the model, thinking, writing the reply, or which tool is running - with the seconds counted and the round out of the tool budget.
A thinking model's working arrives in a folded Thinking block, which closes itself once the answer starts.
Each tool call appears as a collapsible row with how long it took: click it to see the arguments and the result the model received. Screenshots taken by scratchjr_screenshot are shown inline. A failed call opens itself and is marked in red, so a wrong turn is visible rather than buried.
New chat clears the conversation and starts the model fresh. Stop interrupts a run that is going nowhere; it takes effect after the tool call in flight finishes.
Attaching a document
The paperclip beside the message box takes a .md, .txt or .pdf file, and files can be dropped onto the panel instead. A PDF's text is pulled out on this machine; nothing is uploaded and nothing is sent anywhere until the message it is attached to is sent.
Each attached file shows as a chip with how much text it holds and an x to take it off again. A document longer than 20,000 characters is cut there, and both the panel and the model are told it was cut, so a long plan costs a bounded amount. Attachments go with one message: after that they are part of the conversation and do not need attaching again.
Only those three kinds are accepted. Anything else, including a scanned PDF with no text layer, is refused with a line saying why.
About
File > About lists the credits:
jfo8000 — ported version of ScratchJr
SkieAdminYT — MCP and AI integration
MIT Media Lab — original ScratchJr
Installation Setup:
There are two ways to install. Both finish with the same MCP registration, so the client sections further down apply either way.
Path | What you get | When to use it |
One-click | Builds and installs | The normal choice. The app opens the MCP connection by itself, so nothing has to be closed and reopened |
Manual | Uses a stock ScratchJr Desktop download and sets the server up step by step | You want the unmodified app, or the one-click build failed and you are working through it |
Paths in this document are for this PC, where the project lives at C:\Users\SkieHackerYT\Documents\Gitlab\ScratchJR-MCP. On another machine, replace that folder and the Windows account name throughout.
One-click install
Double-click install.cmd in the project folder, or run:
Set-Location 'C:\Users\SkieHackerYT\Documents\Gitlab\ScratchJR-MCP'
npm.cmd run one-clickIt runs these steps in order and stops at the first failure with a message naming the step:
Installs this server's dependencies.
Installs the desktop app's dependencies in
desktop\— around 900 packages, and the slowest step.Downloads the Electron 1.8.2 runtime. npm 11 defers that package's install script, so it is fetched explicitly.
Builds
desktop\out\make\squirrel.windows\x64\Scratch.JR [ AI-Assisted ]-1.0.2 Setup.exe.Runs that installer, which installs to
%LOCALAPPDATA%\ScratchJR-AI-Assisted\app-1.0.2\and starts the app.Registers the server with Claude Desktop, Claude Code, and Codex.
Expect fifteen to twenty minutes the first time, most of it in steps 2 and 4. Windows SmartScreen may warn about the installer: it is unsigned because it is built on your machine rather than downloaded from a signed release.
Afterwards, restart Claude and start a new Codex session. Cursor and Antigravity still need the manual configuration in sections 5 and 6.
To repeat a single stage instead of the whole run:
npm.cmd run app:install # desktop app dependencies only
npm.cmd run app:make # build the installer only
npm.cmd run app:start # run the app from source without installing it
npm.cmd run setup # client registration only1. Install and initialize ScratchJr Desktop
Skip this if you used the one-click install, which already put an app in place.
Open the ScratchJr Desktop download page and select the Windows installer. This is the community desktop port.
Run the installer, then launch ScratchJr Desktop.
Create a small project, return to the project library to save it, and close ScratchJr.
Confirm the database exists at
C:\Users\SkieHackerYT\Documents\ScratchJR\scratchjr.sqllite. On another PC, replaceSkieHackerYTwith that Windows account's name. The desktop port stores its projects in this Documents folder. See the desktop project's storage documentation.
The server looks for the modified build first, at %LOCALAPPDATA%\ScratchJR-AI-Assisted\app-*\ScratchJr.exe, and falls back to a stock install at %LOCALAPPDATA%\ScratchJr\app-*\ScratchJr.exe. Both can be installed at the same time. For a custom installation or a redirected Documents folder, set SCRATCHJR_EXE or SCRATCHJR_DATABASE as described below.
Both builds read and write the same scratchjr.sqllite. Run only one of them at a time: each holds the database in memory and writes its copy back when it closes, so whichever closes last overwrites the other's work.
2. Prepare the local assets folder
Use this folder to organize custom source artwork:
C:\Users\SkieHackerYT\Documents\ScratchJr\_AssetsCreate it if it does not already exist:
New-Item -ItemType Directory -Path 'C:\Users\SkieHackerYT\Documents\ScratchJr\_Assets' -ForceKeep custom SVG characters and backgrounds here. This is a source-artwork folder: the MCP server does not automatically scan or import its files. To use an SVG, read it using the AI client's file-access tools, or paste its contents into the chat, and ask the assistant to register it with scratchjr_add_svg_asset. That tool accepts SVG markup, a name, a kind (character or background), width, and height. Use static SVG geometry; backgrounds should be 480 by 360 pixels. Use the returned md5 filename when creating a character or choosing a background.
Registered artwork is saved inside ScratchJr's database and can be discovered with scratchjr_list_assets. Simply placing PNG, JPG, audio, or SVG files in _Assets does not make them available to ScratchJr.
3. Install the MCP server dependencies
Install Node.js 22 or newer with npm, then open PowerShell and verify both commands:
node --version
npm.cmd --versionOpen this project's folder and install the locked dependencies:
Set-Location 'C:\Users\SkieHackerYT\Documents\Gitlab\ScratchJR-MCP'
npm.cmd ci4. Register the server with Claude Desktop, Claude Code, and Codex
From the same project folder, run:
npm.cmd run setupSetup writes the scratchjr entry into Claude Desktop's configuration file and registers a user-level server with Claude Code and Codex through their CLIs. Every file it touches is backed up next to the original first. It is safe to run repeatedly: an entry that already points at this folder is left alone.
If a scratchjr entry exists but points somewhere else — most often because the project was moved, leaving the old path holding some other server — setup replaces it and prints the path it replaced. This is worth knowing, because a stale entry shows up as a connection error rather than as a missing server, which is easy to misread as the tools themselves being broken.
Client | Where the entry goes | How to verify |
Claude Desktop |
| Fully quit and reopen Claude Desktop, then look for |
Claude Code | User scope, in |
|
Codex |
|
|
Setup also writes ready-made snippets into config/:
config/claude-desktop.json — the
mcpServersentry, which suits Cursor and Antigravity as well.config/codex.toml — the
[mcp_servers.scratchjr]section, including the timeouts.
If the Codex CLI is not installed, setup cannot reach Codex and says so. Open %USERPROFILE%\.codex\config.toml, replace any existing [mcp_servers.scratchjr] section with the contents of config/codex.toml, and leave every other section as it is:
[mcp_servers.scratchjr]
command = "C:\\Program Files\\nodejs\\node.exe"
args = ["C:\\Users\\SkieHackerYT\\Documents\\Gitlab\\ScratchJR-MCP\\src\\server.js"]
startup_timeout_sec = 30
tool_timeout_sec = 120The timeouts matter. Building a project and taking a screenshot can take longer than Codex's default tool timeout allows.
The same applies to the Claude Code CLI. Without it, Claude Desktop is still configured, and Claude Code can be registered by hand:
claude.cmd mcp add --scope user scratchjr -- 'C:\Program Files\nodejs\node.exe' 'C:\Users\SkieHackerYT\Documents\Gitlab\ScratchJR-MCP\src\server.js'Keep the project folder where it is after registering. Moving it breaks every entry, and setup has to be run again from the new location.
5. Add the server to Cursor
Complete steps 1–3 first. npm.cmd run setup configures Claude and Codex; Cursor and Antigravity require the manual configuration below.
Open your project in Cursor.
Create or open one of these configuration files. Choose the global file to use ScratchJr across all projects, or the project file for this workspace only.
Scope | Configuration file on this PC |
Global |
|
Project |
|
Add the configuration below. If the file already contains servers, merge only the
scratchjrentry into its existingmcpServersobject.
{
"mcpServers": {
"scratchjr": {
"command": "C:\\Program Files\\nodejs\\node.exe",
"args": [
"C:\\Users\\SkieHackerYT\\Documents\\Gitlab\\ScratchJR-MCP\\src\\server.js"
]
}
}
}Save the file and restart Cursor. Open Customize > MCPs and enable
scratchjrif needed.Start an Agent chat and ask it to call
scratchjr_connect, thenscratchjr_list_projects.
Cursor supports both configuration locations; a project entry takes precedence over a global entry with the same name. See the official Cursor MCP instructions.
The JSON uses this PC's paths. On another machine, adjust the Node executable and the server path. Keep the doubled backslashes required by JSON. You can also copy this entry from config/claude-desktop.json, which setup regenerates with the current path on every run.
6. Add the server to Google Antigravity
Open Antigravity IDE and its Agent side panel.
Click … > MCP Servers > Manage MCP Servers > View raw config.
In the opened
mcp_config.json, merge the samescratchjrconfiguration shown above intomcpServers. Preserve any other server entries.Save the file, then refresh the MCP server list or restart Antigravity. Ensure
scratchjris enabled.Start a new Agent conversation and ask it to call
scratchjr_connect, thenscratchjr_list_projects.
Current Antigravity documentation lists these configuration locations:
Scope | Configuration file on this PC |
Global |
|
Workspace |
|
Prefer the file opened by View raw config for your installed IDE version. Antigravity 2.0 exposes server management under Settings > Customizations > Installed MCP Servers. See the official Antigravity MCP instructions.
Both editors launch src/server.js directly using Node and stdio. No MCP URL or separate npm start terminal is needed. Port 9223 is the app's internal debugging connection, not an HTTP MCP endpoint.
7. Verify the ScratchJr connection
Run the built-in check from the project folder:
npm.cmd run doctorIt reports the executable and database the server chose, along with the projects ScratchJr currently holds. With the modified build this works against a window that is already open. If nothing is running, use npm.cmd run doctor -- --launch to start the app first. With a stock install, save and close any ScratchJr window opened from its ordinary shortcut before using --launch.
A healthy result names the executable and lists your projects:
{
"config": {
"executable": "C:\\Users\\SkieHackerYT\\AppData\\Local\\ScratchJR-AI-Assisted\\app-1.0.2\\ScratchJr.exe",
"database": "C:\\Users\\SkieHackerYT\\Documents\\ScratchJR\\scratchjr.sqllite"
},
"app": { "ready": true, "projects": [ { "ID": 1, "NAME": "Project 1" } ] }
}Then, in any registered client, try:
Use the scratchjr tools to create a dancing dog in a park. Build the project, run it, inspect a screenshot, then stop, reset, and save it.
scratchjr_status reports which build answered, as build and buildVersion. That is the quickest way to tell the modified app from a stock one.
If the tools do not appear:
Check that
scratchjris enabled in the client and that its JSON or TOML is valid.Confirm both absolute paths in the entry exist, especially after moving the project folder. Rerun
npm.cmd run setupto repair them.Confirm
npm.cmd cicompleted in the server folder, then restart the client and start a new Agent chat.In Cursor, connection details are under Output > MCP Logs; in Antigravity, inspect the server entry in Manage MCP Servers.
Follow the client's tool-approval prompts when shown.
Procedure:
Open Claude Desktop, Claude Code, Codex, Cursor, or Antigravity and start a new Agent conversation after registration.
Ask the assistant to call
scratchjr_connectand checkscratchjr_status.Describe the story, animation, or game you want. Include characters, scenes, dialogue, and what should happen when a character is clicked.
Have the assistant inspect available assets and blocks, create the project, run it, and check a screenshot. For custom artwork, register the SVG from
_Assetsbefore using it in the project.Test the project in ScratchJr using the green flag and character clicks.
Ask for any changes, then stop/reset and save the project. It remains available in ScratchJr's project library.
Example request:
Use ScratchJr to create an interactive ocean adventure with three characters and two scenes. Make the characters talk and move when clicked. Build it, run it, check a screenshot, and save it.
Example custom-artwork request, after providing the SVG contents or granting the client access to the file:
Register my star SVG from C:\Users\SkieHackerYT\Documents\ScratchJr_Assets as a character. Create a space scene where clicking the star makes it spin. Test and save it.
On this PC, MCP Demo - Park Friends (Ready) is already in the ScratchJr library. Press the green flag to animate Tic and the dog. Click the dog to visit the stars; click the star to return. To edit it, try:
Open MCP Demo - Park Friends (Ready). Make the dog hop three times when I click it, then switch to the space scene. Test and save the changes.
Connection behavior
The configured MCP client starts src/server.js using MCP's standard stdio transport. No API keys or model subscriptions are embedded in the server; the connected assistant interprets your request and calls the tools.
The first application tool connects to ScratchJr on 127.0.0.1:9223, or automatically launches the installed app with that local debugging port. It does not modify the installed application.
If ScratchJr is already running from its ordinary shortcut without the connection enabled, save your work and close it once. Then ask the assistant to connect again. The server does not force-close an existing editor session. You can normally leave the connected app open while using either client. Avoid simultaneous manual edits while an assistant is changing a project.
With the build in desktop/, that close-and-reopen step is not needed: the app opens the connection itself as it starts, so the server attaches to a window that is already on screen.
A freshly started ScratchJr sits on the splash screen, which waits for a child to press Start and has none of the project code loaded yet. Connecting moves the app to its project library so the first tool call succeeds. If a child is looking at the splash screen when an assistant connects, that is why the screen changes.
Tool reference
Tool | Action |
| Connect, launch, or inspect connection status |
| Discover installed characters, backgrounds, and sounds |
| Read block names, allowed arguments, and units |
| Find projects and inspect their actual data |
| Build a complete project with pages, characters, text, and scripts |
| Batch edits while preserving unrelated objects |
| Open and persist projects |
| Start green-flag scripts, stop, or reset |
| Exercise click interactions |
| Create a custom character or background from static SVG geometry |
| Return an actual editor screenshot to the assistant |
| Back up the database or export project JSON and media |
Also includes the scratchjr://guide resource and create-scratchjr-project prompt.
ScratchJr supports up to four pages, motion, speech, sounds, repeat loops, click/collision events, colored messages, and page transitions. It does not support Scratch 3 features such as variables, keyboard controls, scores, or arithmetic. The assistant should implement your idea using those available blocks and explain any remaining limitations.
Development checks
npm.cmd test # Six automated model/protocol tests; does not launch the app
npm.cmd run doctor # Inspect connection and list projects
npm.cmd run doctor -- --launch
npm.cmd run test:live # Creates a new demo in the real ScratchJr library
npm.cmd run test:extended # Adds a custom star and second page to the latest test demonpm start runs the MCP protocol server and waits for client input; it is not a web page. Clients use the absolute Node executable and server path, so their current directory does not matter.
Optional environment settings
Variable | Default |
| Auto-detected versioned ScratchJr executable |
|
|
|
|
| This server's |
| This server's |
The modified desktop app in desktop/ reads two more, which only affect the app itself:
Variable | Effect |
| Port the app opens for the MCP connection. Set it to |
| Overrides the Documents root the app reads and writes. Useful for trying a build without touching real projects |
| Set to |
If you customize settings, use the same values in every client. In the Cursor and Antigravity JSON, place environment settings in an env object alongside command and args within the scratchjr entry. If Windows Documents is redirected, set SCRATCHJR_DATABASE to the app's actual database path.
Project input
examples/park-friends.json is a complete scratchjr_create_project argument. Character asset and page background values must be exact filenames returned by scratchjr_list_assets.
Coordinates use a 480×360 stage with the origin at the top left. One motion step is 24 pixels. wait: 10 means one second. right and left rotate; forward and back move horizontally. Each script is an array of {op, value?, body?} objects; a repeat block holds its enclosed blocks in body.
To change existing work, call get_project, then edit_project with its revision, page/object IDs, and a batch of operations. set_scripts changes only code. set_character replaces that entire character's configuration. The server rejects a stale revision so two assistants do not silently overwrite one another's changes.
Persistence and recovery
Project writes use the running application's in-memory database, then explicitly flush to disk. Creating, editing, and adding artwork make timestamped full database backups first. Cross-process locking serializes tool operations between Claude and Codex. There is no arbitrary JavaScript or SQL execution tool.
backups/ contains complete .sqllite snapshots. To restore manually, save and close ScratchJr, preserve a copy of the current database, replace Documents\ScratchJR\scratchjr.sqllite with the selected snapshot, and reopen ScratchJr. Restoring a full database restores all projects to that snapshot's state.
artifacts/ contains screenshots, JSON exports, and live-test-result.json. The JSON export includes referenced custom media and is intended for inspection/backup; it is not a tablet-importable .sjr archive. Automated import and recorded-audio creation are not implemented. Existing recorded sounds can be used in scripts.
Tested against ScratchJr Desktop 1.3.2 on Windows, Node 24, MCP SDK 1.30.0, the installed Codex CLI, and Claude Code. Claude Desktop's configuration is installed, but its UI was not used for testing. Cursor and Antigravity instructions follow their official MCP documentation; connections from those editors have not been tested here. Other desktop builds may need an adapter.
Verification completed on this PC: stdio handshake and tool/resource/prompt discovery; native project creation; visible rendering; measured movement after green-flag execution; edits and stale-revision rejection; custom SVG rendering; click-driven navigation between two pages; screenshots; disk persistence; and SQLite integrity. Original Project 1 was compared with the pre-test backup and was unchanged.
Implementation references: ScratchJr Desktop source, MCP TypeScript SDK, and Claude Desktop MCP configuration. Codex and Claude Code registration use their installed CLI commands. This is an independent integration, not an official ScratchJr release.
Created by: Kerneil Rommel S. Gocotano
Available Tools
17 toolsscratchjr_add_svg_assetA
Add a custom character or background using static SVG geometry. Use SVG with a matching viewBox; backgrounds should be 480×360. Returns an md5 asset name usable in projects.
| Name | Required | Description | Default |
|---|---|---|---|
| svg | Yes | ||
| kind | Yes | ||
| name | Yes | ||
| width | Yes | ||
| height | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say the operation is not read-only and not destructive, so the description carries the behavioral burden. It usefully discloses the return value ('md5 asset name usable in projects') and the SVG/dimension constraints, while avoiding any contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences that front-load the purpose and put the most important constraints and return behavior right after. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no parameter descriptions, yet the tool still communicates key requirements and the return shape. It is minimally viable, but gaps remain around the name parameter and how width/height should be determined for characters versus the 480×360 background convention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description helps with svg (matching viewBox), kind (character/background), and width/height (background 480×360). However, the required 'name' parameter is never explained and character width/height semantics are left implicit, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Add') and a concrete resource ('custom character or background') with a qualifier ('static SVG geometry'). This cleanly separates it from sibling project-management tools and list_assets, so an agent can tell what the tool does at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives direct usage context: it is the tool for adding SVG-based custom characters/backgrounds, and it imposes concrete format rules ('SVG with a matching viewBox; backgrounds should be 480×360'). It does not explicitly name alternatives or exclusions, but no sibling offers the same add-asset action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_backupA
Save current work and make a full timestamped database backup.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only, non-destructive behavior. The description adds useful context by stating that it saves current work and creates a full timestamped database backup, implying persistence and uniqueness. It does not detail backup location or completion behavior, but for a zero-parameter tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, compact sentence conveys the full action without filler. Both clauses—'save current work' and 'make a full timestamped database backup'—contribute meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter action with no output schema, the description fully covers what the tool does and the scope of its effect. No additional context is needed for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides full coverage by definition. The baseline of 4 applies because there are no parameter semantics to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses concrete verbs ('Save', 'make') and a specific resource ('full timestamped database backup'). It is clearly distinct from siblings like scratchjr_save_project or scratchjr_export_project by emphasizing a full database backup rather than a single project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool instead of alternatives such as scratchjr_save_project or scratchjr_export_project. It does not mention preconditions, recommended timing, or situations where a backup is necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_block_referenceBRead-only
Get supported blocks, values, units and ScratchJr project-building guidance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, and the description's 'Get' wording is consistent. The description adds that the tool returns a catalog of blocks, values, units, and guidance, but it does not disclose output format, structure, or any other behavioral traits. Given the annotations cover safety, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that lists the key resources without excessive wording. The phrase 'project-building guidance' is slightly vague but does not add bloat or hinder quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only reference tool, this description is largely complete: it identifies the kind of information returned and is consistent with annotations. The main gap is the vagueness of 'guidance,' but an AI agent can still understand the tool's purpose and safe invocation without additional detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, so there are no parameters requiring semantic explanation. The description does not need to compensate for schema gaps, and the baseline for a no-parameter tool is appropriately high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and names concrete resources: 'supported blocks, values, units and ScratchJr project-building guidance.' This distinguishes it from action-oriented siblings like create_project, run_project, or backup, though it does not explicitly call out a sibling comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as scratchjr_status, scratchjr_list_assets, or scratchjr_get_project. An agent must infer that this is a reference/lookup tool from the description, but no explicit context or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_click_characterA
Trigger a character click event to test an interactive project. Character must be on the current page.
| Name | Required | Description | Default |
|---|---|---|---|
| objectId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only and not destructive, and the description adds a useful precondition about the character being on the current page. It does not disclose potential side effects of the click event, such as triggering project scripts that modify state, but for a simple event trigger this is a reasonable level of transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences convey the action, purpose, and a critical prerequisite without any filler. The most important information appears first, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool, the description covers the core action and the main precondition. It omits expected return behavior, error handling when the character is not on the page, and how to identify the objectId, so it is adequate but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain what objectId refers to or how to obtain it. The parameter name and tool name make it inferable that objectId identifies the character, but the description adds no meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Trigger a character click event') and a concrete resource ('character'), making the tool's function immediately obvious. It also clarifies the intended use case ('to test an interactive project'), and the sibling list contains no other click/event tool, so it is effectively distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool ('to test an interactive project') and gives a key precondition ('Character must be on the current page'). However, it offers no explicit comparison to alternatives or exclusions, leaving the agent to infer the usage context from the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_connectA
Connect to ScratchJr Desktop or launch it with a localhost-only control port. Does not force-close existing sessions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only basic hints, so the description adds useful behavioral context: it does not force-close existing sessions and uses a localhost-only port. This is meaningful beyond the structured annotations and there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no redundancy. The core connection/launch behavior is front-loaded and the important safety clarification follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple setup tool with no parameters or output schema, the description covers the essential behavior and key caveat. It could explicitly mention whether this must be called before other ScratchJr tools, but the sibling set and the non-closing statement make that reasonably inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so there is nothing for the description to add. Baseline 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action ('Connect to ScratchJr Desktop or launch it') with a specific resource and a scope qualifier ('localhost-only control port'). It also clarifies what it does not do, distinguishing it from other tools like scratchjr_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool is useful (when a connection is needed, possibly launching Desktop) and includes a safety note about existing sessions, but it does not explicitly state when to prefer it over siblings or any prerequisites/ordering. Usage is implied rather than fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_create_projectA
Create, persist and open a complete native ScratchJr project with up to four pages. Characters, backgrounds, text and block scripts are built automatically. Returns the new ID and data.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnly=false/destructive=false annotations by disclosing that the project is persisted and opened, not just created in memory, and that construction of characters/backgrounds/text/scripts is automatic. It also states the return value (new ID and data), though it omits failure conditions or prerequisites like connectivity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the action, resource, constraint, and return value. Every clause adds information, and there is no filler, repetition of schema structure, or redundant restating of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with a deeply nested schema and no output schema, the description supplies the missing high-level context: single-call creation, persistence, opening, automatic assembly, the four-page cap, and the returned ID/data. It omits explicit prerequisites such as connecting first or ensuring asset IDs exist, though the schema's asset description already points to scratchjr_list_assets.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema_description_coverage, the description carries some burden, and it helps by framing `project` as high-level content that the tool assembles into a native project with up to four pages. It does not walk through required fields or nested block semantics, but the schema itself is unusually detailed with defaults, enums, and constraints, so most operational meaning is available there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (create/persist/open), a clear resource (a complete native ScratchJr project), and key constraints ('up to four pages', auto-built characters/backgrounds/text/scripts). This makes it distinguishable from siblings like scratchjr_edit_project or scratchjr_list_projects, though it never explicitly names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The verb 'Create' and 'Returns the new ID' imply this should be used when building a new project rather than editing or opening an existing one. However, the description gives no explicit when-not-to-use guidance or alternatives, leaving the agent to infer the boundary against scratchjr_edit_project, scratchjr_save_project, and scratchjr_open_project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_edit_projectA
Apply a batch of edits to an existing project and reopen it. Supply the revision from get_project. set_character replaces the whole character; use set_scripts to change only code.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID from list_projects or create_project | |
| operations | Yes | ||
| expectedRevision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description doesn't need to restate mutation. The description adds useful behavioral context: the tool reopens the project after editing, and set_character replaces the whole character. However, it doesn't disclose that edits are batched atomically, whether a failed operation rolls back, or that expectedRevision is an optimistic concurrency guard. With annotations covering the basic safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The key action ('Apply a batch of edits') is front-loaded, the revision requirement is stated early, and the set_character/set_scripts distinction is a valuable disambiguation. It could be slightly more structured by listing operation types, but it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with a large operations schema and no output schema, the description is adequate but not complete. It covers the core workflow (get revision, batch edit, reopen) and the most important sibling distinction, but it doesn't mention the available operation actions, the optimistic concurrency semantics of expectedRevision, or what happens on failure. An agent would need to dig into the schema to understand the full operation set, which is a gap for a tool this complex.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (projectId and asset have descriptions, but expectedRevision and operations do not). The description compensates partially by explaining expectedRevision ('Supply the revision from get_project') and by clarifying the set_character vs set_scripts distinction. However, it doesn't explain the structure of operations (the oneOf variants) or that operations is a batch array, leaving the agent to parse the large schema. Baseline 3 is fair because the description adds some meaning but doesn't fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Apply a batch of edits') and resource ('existing project'), and clarifies it reopens the project. It also distinguishes set_character from set_scripts. However, it doesn't enumerate the full set of operations (rename, add_page, set_background, add_character, add_text, set_text, remove_object) that the schema supports, so an agent might not realize the full scope of what 'batch of edits' includes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this to apply edits to an existing project, supply the revision from get_project, and use set_scripts instead of set_character when changing only code. It doesn't explicitly state when NOT to use this tool (e.g., for creating a new project, use create_project), but the sibling list and the 'existing project' phrasing imply that boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_export_projectARead-only
Export a JSON backup of a project and referenced custom media. This is not the tablet .sjr sharing format.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID from list_projects or create_project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value beyond annotations by disclosing the output format (JSON backup) and that referenced custom media is included, which is behaviorally relevant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The core action and output are front-loaded, and the format clarification earns its place by preventing confusion with the .sjr format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read-only export tool, the description is complete: it states the output format, scope, and key constraint. The schema documents the only required parameter, and annotations cover safety, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the projectId parameter is already well documented as coming from list_projects or create_project. The tool description itself adds no additional meaning about the parameter, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Export') and identifies the exact output: 'a JSON backup of a project and referenced custom media.' It also distinguishes itself from the tablet .sjr sharing format, which helps differentiate it from sibling backup/export tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear when this tool is appropriate: when a JSON backup including custom media is needed. The explicit 'not the tablet .sjr sharing format' provides a useful exclusion, though it does not name a specific alternative sibling to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_get_projectARead-only
Read project data, page/object IDs and revision. Includes unsaved editor state when open. Call before editing.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID from list_projects or create_project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false. The description adds genuine value beyond those annotations by disclosing that the read includes unsaved editor state when open — a behavioral trait the agent needs to know. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: purpose and scope first, then the unsaved-state nuance, then the usage trigger. No redundancy, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with safety annotations in place and no output schema, the description compensates by naming the returned content (project data, page/object IDs, revision). Minor ambiguity remains around what 'when open' means, but the tool is simple enough that this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; projectId is fully documented ('Project ID from list_projects or create_project'). The description adds no parameter-level detail, but with full schema coverage the baseline of 3 applies and nothing more is demanded.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('project data, page/object IDs and revision'), with the distinct behavioral note about unsaved editor state. It's clearly differentiable from siblings like list_projects or edit_project by content, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call before editing' provides a clear trigger condition for when this tool should be invoked. It gives solid context but stops short of explicit when-not-to-use guidance or naming alternatives such as edit_project/save_project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_list_assetsARead-only
List real installed character, background and sound assets. Use exact md5 filenames in projects.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | all | |
| search | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is safe. The description adds the qualifier 'real installed' to differentiate from hypothetical or virtual assets, but it does not disclose output structure, pagination, or any other behavioral nuance. With annotations covering safety, the bar is lower, yet the description adds only minimal extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences. The first states the core purpose; the second provides a key usage hint. No filler or repetition. The information is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two optional parameters and no output schema. The description tells what it lists and hints that md5 filenames are returned, but it does not explicitly describe the return format or explain the 'search' parameter. For a low-complexity tool this is adequate but not fully complete; the agent still has to infer some behavior from the parameter names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description does not explain either parameter. The schema itself provides enum values for 'kind' and a maxLength for 'search', but the description does not clarify what 'search' does or how 'kind' interacts with the listing. Since coverage is low, the description must compensate, and it fails to do so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists installed assets (characters, backgrounds, sounds). It distinguishes from siblings like scratchjr_add_svg_asset by focusing on listing rather than adding. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a practical usage hint: 'Use exact md5 filenames in projects.' This tells the agent why to call the tool (to get md5 filenames for project references). It does not explicitly contrast with alternatives, but for a listing tool the use case is straightforward and no conflicting sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_list_projectsARead-only
List saved ScratchJr projects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the annotations: readOnlyHint is true and destructiveHint is false, and 'List' is non-mutating. It adds no extra behavioral detail beyond the annotation, such as return shape or side-effect confirmation, which is acceptable for a no-arg read-only operation but not enriching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence states exactly what the tool does with no filler or redundancy. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The zero-parameter schema and read-only annotations cover invocation safety, and the description makes the purpose unambiguous. It does not describe the shape of the returned project list, which would improve completeness given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so there is no semantics for a description to clarify beyond the empty schema. The no-parameter baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb 'List' and resource 'saved ScratchJr projects', clearly orienting an agent to a read-only enumeration action. It does not explicitly contrast with scratchjr_list_assets or say whether all projects are returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or exclusion guidance is provided; an agent must infer when to choose this over scratchjr_list_assets or scratchjr_get_project. This leaves usage context to the tool name and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_open_projectB
Save the current project and open the requested project in the real editor.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID from list_projects or create_project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses one meaningful behavioral side effect beyond the annotations: it saves the current project before opening another. However, it does not explain what happens on failure, whether unsaved changes are silently overwritten, or why 'real editor' matters. Since readOnlyHint is false, the safety profile is already known from annotations, and the description adds only modest context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the key action (saving the current project) and states the main operation without filler. Every phrase carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with a documented schema this is minimally adequate, but it omits any mention of return value/behavior, connection prerequisites (despite scratchjr_connect existing), or what distinguishes opening in the real editor from other project operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents projectId as 'Project ID from list_projects or create_project' with full coverage. The description adds no further parameter semantics beyond 'requested project,' so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs and resources: 'Save the current project' and 'open the requested project in the real editor.' It clearly identifies the tool's function, but it does not explicitly contrast it with sibling tools like scratchjr_edit_project or scratchjr_get_project, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as scratchjr_edit_project, scratchjr_get_project, or scratchjr_run_project. The intended use is only implied by the name and description, with no exclusions, prerequisites, or conditions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_run_projectA
Run green-flag scripts in the current project, optionally opening a specified project.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project ID from list_projects or create_project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that the tool is not read-only and not destructive. The description adds the useful detail that providing projectId triggers an open-then-run sequence. However, it does not disclose whether currently running scripts are stopped or whether execution is synchronous, leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the primary action first and then the parameter-dependent behavior. There is no filler, no repetition of the tool name, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and annotations providing the safety profile, the description gives enough information for an agent to invoke it correctly. It covers the current-project vs specified-project distinction, though it does not explain what happens if no current project exists or whether the run blocks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes projectId as a project ID, but the description adds the key meaning that it is optional and selects which project to open before running. With 100% schema description coverage, this is above the baseline of 3 because it clarifies the parameter's role in the overall operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Run green-flag scripts') and a resource ('current project' or 'specified project'), which clearly distinguishes it from sibling tools like open_project and stop_project. It is a precise verb+resource statement, not a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the context: run in the current project, or open and run a specified project when projectId is provided. It does not explicitly name alternatives or state when not to use the tool, but the selection context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_save_projectA
Save the open project, regenerate its thumbnail and flush all data to disk.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral detail beyond annotations by mentioning thumbnail regeneration and durability ('flush all data to disk'). It aligns with readOnlyHint=false and destructiveHint=false, and gives the agent a realistic sense of the side effects of saving.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with no filler. All three key behaviors—save, regenerate thumbnail, flush—are front-loaded and necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter save operation, the description is complete: it identifies the resource and the persistence behavior. No output schema is present, but no return-value documentation is essential for a straightforward save command.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the empty schema is fully covered, so there is nothing for the description to add about arguments. The baseline of 4 for no parameters is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (save), the target resource (open project), and key side effects (regenerate thumbnail, flush to disk). The behavior is unambiguous and distinct from siblings like screenshot, export, or backup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the invocation context clear: use this when the open project should be persisted to disk. It does not explicitly name alternative tools such as export or backup, but the operation's purpose is specific enough to avoid major confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_screenshotARead-only
Capture the real ScratchJr window and return an image for visual verification, plus its saved file path.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, so no contradiction; the description adds value by clarifying that this captures the actual window and saves a file whose path is returned. It does not disclose details like window focus behavior or failure states, but for a non-mutating capture tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence that front-loads the action and purpose. Every phrase earns its place, with no redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter capture tool, the description adequately states input (none), what it does, and what it returns (image and file path). It does not mention prerequisites such as the app being open, but this is inferable from sibling tools and does not undermine correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema carries no burden. The baseline of 4 is appropriate because the description does not need to clarify any parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action ('Capture the real ScratchJr window'), a clear resource, and a concrete purpose ('for visual verification'). It also states the return value (image and saved file path), making it easy to distinguish from siblings like status or get_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool ('for visual verification') but does not explicitly state when to prefer it over alternatives or mention prerequisites such as needing the ScratchJr app to be running/connected. Usage guidance is present but only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_statusARead-only
Check the live ScratchJr connection without launching the app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds behavioral value by stating the tool does not launch the app and provides a 'live' status check, which is extra context beyond what annotations convey. This is useful and not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single 10-word sentence that is fully front-loaded with the main action ('Check') and includes only essential qualifiers. There is no fluff, and every word contributes to conveying the tool's purpose and key behavioral characteristic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status-check tool with no parameters, annotations, or output schema, the description communicates purpose and a key side-effect detail. However, it does not describe the return value (e.g., what the status looks like—boolean, string, or details), which would be helpful for an agent to interpret the result. This is a minor but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so the description does not need to explain parameters. Per the calibration baseline, a 4 is appropriate for zero-parameter tools—the description correctly omits parameter details and focuses on the tool's action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') and resource ('live ScratchJr connection') and adds the qualifier 'without launching the app,' which clearly differentiates it from sibling scratchjr_connect. An agent can immediately understand the tool's scope and how it differs from other connection-related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without launching the app' implies this is a safe, lightweight check that can be performed anytime, but there is no explicit 'when to use' or 'use this instead of' guidance. The distinction from scratchjr_connect is implied rather than stated, so the usage context is present but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scratchjr_stop_projectA
Stop scripts; optionally reset characters to their starting positions.
| Name | Required | Description | Default |
|---|---|---|---|
| reset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the main behaviors: stopping scripts and optionally resetting characters. It adds this context to the minimal annotations (readOnlyHint=false, destructiveHint=false), but it does not explain side effects such as whether the project remains open or whether any project data is changed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence, front-loads the primary action, and then adds the optional parameter context. No words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-boolean-parameter tool with no output schema, the description covers the essential behavior and parameter effect. It could be slightly more explicit about the scope ('all scripts in the current project') but is otherwise sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the burden for the 'reset' parameter. It clearly links 'reset' to resetting characters to their starting positions, which is meaningful beyond the bare schema default of false.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Stop scripts') and a distinct optional behavior ('reset characters to their starting positions'), which differentiates it from siblings like scratchjr_run_project and scratchjr_click_character. The resource scope is implied by the project name and the action is concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state when to use this tool or compare it with alternatives such as scratchjr_run_project or scratchjr_status. It gives no explicit conditions, prerequisites, or exclusions, leaving the agent to infer usage from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v1.0.0- First observed
scratchjr_add_svg_asset - First observed
scratchjr_backup - First observed
scratchjr_block_reference - First observed
scratchjr_click_character - First observed
scratchjr_connect - First observed
scratchjr_create_project - First observed
scratchjr_edit_project - First observed
scratchjr_export_project - First observed
scratchjr_get_project - First observed
scratchjr_list_assets - First observed
scratchjr_list_projects - First observed
scratchjr_open_project - First observed
scratchjr_run_project - First observed
scratchjr_save_project - First observed
scratchjr_screenshot - First observed
scratchjr_status - First observed
scratchjr_stop_project
TDQS
Scored across 17 tools
Each tool targets a distinct operation: connection status, launching, asset listing, block documentation, project listing, screenshot, project CRUD, execution control, event triggering, backup, export, and SVG import. There is no overlap between tools; even get_project, open_project, and save_project serve clearly separate read, open, and persist functions.
Most tools follow the verb_noun pattern (list_assets, get_project, create_project, edit_project, run_project, stop_project, click_character, export_project, add_svg_asset). A few deviations exist (status, connect, block_reference, screenshot, backup) that are still intuitive but break the strict convention. Overall the pattern is recognizable and readable.
With 17 tools, the server is slightly above the typical well-scoped range of 3–15, but each tool covers a distinct functional area of the ScratchJr desktop integration. The count feels justified given the breadth of operations (asset management, project lifecycle, execution control, backup/export, custom assets).
The tool surface covers the full project lifecycle: create, read, edit, open, save, run, stop, and backup, plus asset listing and import. Minor gaps include no explicit delete-project operation and no direct asset removal, but these are rarely needed for typical automation and agents can work around them. Overall the surface is comprehensive for the intended use case.
Maintenance
Related MCP Connectors
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
- MorphedOAuthapp.morphed
Create AI images and videos, manage projects and credits, and use workspace campaign context.
- ApricotOAuthtools.apricot
Manage SysML2 projects and files directly through your coding agent.
Create and manage AI agents that collaborate and solve problems through natural language interacti…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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 gradedqualityDmaintenanceEnables AI agents to create, compile, and run Scratch projects by editing plain text and using a live editor loop.18 npm1Mozilla Public 2.0
- AlicenseAqualityDmaintenanceConnects AI assistants to live Purl Studio projects, enabling reading objects, modifying scripts, and setting properties.263 npmMIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to directly manage Roblox Studio projects by creating, reading, updating, and deleting scripts, listing instances, executing Luau code, and inspecting properties. It works through natural language, making Studio operations accessible to AI.-