scratch-unified-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PYTHONPATH | Yes | Python path to the scratch-unified-mcp repository (e.g., /path/to/scratch-unified-mcp). | |
| SCRATCH_MCP_DATA_DIR | Yes | Directory for MCP session data (e.g., /path/to/scratch-unified-mcp/.sessions). | |
| SCRATCH_MCP_BRIDGE_PORT | No | Port for the Node bridge sidecar; defaults to 9060. Set only if something else holds 9060. | 9060 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| project_editing_guideA | Read this BEFORE creating or editing any Scratch project. Covers Scratch's hard limits (block counts, asset sizes, clone caps, cloud
variable rules and so on) and the goboscript language used to write
projects as text. Scratch projects are not edited as raw project.json here;
they are written as goboscript |
| project_check_toolchainA | Report whether the goboscript toolchain is installed and usable. Call this first if any other project_* tool complains about a missing binary. Never raises, so it is safe to use for diagnosis. |
| project_newA | Create a new goboscript project and make it the active project. Scaffolds a project directory with |
| project_openB | Register an existing goboscript project directory and make it active. |
| project_downloadA | Decompile a Scratch project into editable goboscript source, and make it active. Give either |
| project_listA | List the goboscript projects this server knows about. |
| project_selectA | Choose which open project the other project_* tools act on. |
| project_closeB | Forget a project. Does not delete anything from disk. |
| project_infoB | Summarise a project: its sprites, publish target and compatibility. |
| project_buildA | Compile the project to .sb3 with goboscript. Use this rather than running the goboscript CLI yourself. A failed build raises with the compiler's diagnostics passed through verbatim -- file, line, column and the offending source -- so fix those and call it again. Also reports which extensions the project uses and whether any of them are TurboWarp-only, which would block publishing to scratch.mit.edu. |
| project_save_to_cloudA | Build the project and upload it to scratch.mit.edu as the active session. Creates a new Scratch project the first time, then reuses that id for later saves. Uploads costume and sound files as well as the code, since Scratch stores assets separately and the project would render broken without them. Refuses to upload a project using TurboWarp-only extensions, and names them, because scratch.mit.edu will not accept it. |
| project_list_assetsA | List the costumes and sounds a sprite declares. |
| project_add_costumeA | Add a costume to a sprite, copying the file into the project's assets/. Give either |
| project_add_soundA | Add a sound to a sprite, copying the file into the project's assets/. Scratch accepts only MP3 and WAV; other formats make the project refuse to load, with no warning. |
| project_remove_assetA | Remove a costume or sound declaration from a sprite. Leaves the file in assets/ in case other sprites use it. |
| project_summaryA | Inspect what a project actually compiled to. Reads the built .sb3 and reports every target with its block and script counts, costumes, sounds, variables and lists, plus the assets embedded and which sprites use them. Use it to verify a build did what you intended -- that a costume really got attached, that layer order is right, that a sound is present and not oversized. Requires a build; run |
| project_goboscript_docs_helpA | Read the goboscript language documentation. Call with no arguments to get the index of every documentation page. Call
with Use this whenever you are unsure of a block or reporter name -- goboscript
names differ from the Scratch block text (for example |
| project_set_thumbnailA | Set the thumbnail of a published project. Scratch generates thumbnails in its editor, so a project uploaded through
this server keeps the grey placeholder until one is set. With no |
| social_connect_sessionA | Login to the Scratch site using set login details. You may either provide a If none is provided, it will fallback to logging in via the user's installed browser. Sessions are remembered across restarts by default, so this usually only needs to be called once per account. Check |
| social_list_sessionsA | List the Scratch sessions this server currently holds. Use it to discover what is already available before asking the user for credentials. |
| social_set_active_sessionA | Choose which logged-in account subsequent authenticated tools act as. |
| social_forget_sessionA | Drop a session from this server and from the on-disk store. |
| social_verify_sessionA | Check with Scratch whether a stored session id is still valid. Restored sessions are rebuilt offline from the session id, so an expired or revoked login looks fine until it is used. This performs a real request to confirm, and refreshes the account details on success. |
| social_set_bioB | Set the 'About me' section on the active session's profile. |
| social_set_whatimworkingonB | Set the "What I'm working on" section on the active session's profile. |
| social_get_user_infoB | Fetch a Scratch user's profile. |
| social_get_project_infoB | Fetch a Scratch project's metadata. |
| social_get_commentsA | Page through the comments on a project, a studio, or a user's profile. The sources paginate differently because Scratch exposes them differently, so read the argument notes:
Only top-level comments are listed. Scratch has a single level of nesting: a reply to a reply is stored as a reply to the top-level comment. Both sources page over a live feed, so on a busy project or profile a comment can shift between pages while you read them. |
| social_get_comment_repliesA | Fetch the replies to one top-level comment. For source="profile" this is slow: Scratch has no endpoint for a single
profile comment, so scratchattach pages through the profile until it finds
the id. Prefer |
| social_post_commentA | Post a comment on a project, a studio, or a user's profile, as the active session. Requires a logged-in session. To reply to an existing comment, prefer
Scratch rate-limits commenting and rejects content it considers spam or disallowed, which surfaces as a CommentPostFailure. |
| social_reply_to_commentA | Reply to an existing comment on a project, studio or profile, as the active session.
|
| social_set_pfpA | Set the profile picture of the active session's account. Scratch caps avatars at 500x500 pixels. An oversized image is rejected with HTTP 200 and an error in the body, so this checks the size before uploading and reads the response rather than assuming success. SVG is not accepted by Scratch; rasterise it first (for example |
| social_check_inboxA | Check the active account's message inbox. Scratch splits the inbox across three endpoints with independent unread state, and this reports all of them:
|
| social_follow_userA | Follow, unfollow, or check whether the active account follows a user. |
| social_like_projectA | Love and/or favourite a project, remove either, or just check. "like" is Scratch's love (the heart); "favourite" is the star. They are
independent, so |
| social_add_project_to_studioA | Add a project to a studio as the active account. Scratch only allows this if the account may add to that studio: it must be the owner, a curator, or the studio must allow anyone to add. |
| social_search_projectsA | Search Scratch's shared projects, or browse them when no query is given. Results are a lean summary: id, title, author, url, thumbnail and stats.
Follow up with Note: as of 27/07/26, the API is broken right now, so if it doesn't work it's an upstream issue -- not our one. You can, if you wish, search the web for status updates as to Scratch search functionality. |
| social_become_scratcherA | Accept a "become a Scratcher" invitation for the active account. Scratch promotes a New Scratcher only after the Scratch Team invites them.
On the website the invitation is accepted by reading through the Community
Guidelines and clicking to agree, so accepting here means the account holder
accepts those guidelines. For that reason nothing happens unless The guidelines are at https://scratch.mit.edu/community_guidelines and ask everyone on Scratch, in summary, to: be respectful, remembering the audience is broad and includes children; be constructive when commenting; share freely and give credit when remixing; keep personal information private; be honest rather than impersonating others or spreading rumours; and report anything inappropriate rather than escalating it. Promotion cannot be undone. |
| sb3_git_unpackA | Unpack an .sb3 into a diffable directory (project.json + assets/). |
| sb3_git_packB | Pack a diffable directory back into an .sb3. |
| sb3_git_diffA | Summarise an unpacked project dir: targets, block counts, assets. |
| sb3_studio_infoA | Fetch a Scratch studio's title, description, and stats. |
| sb3_remixesC | List remix lineage info for a project (id, title, author). |
| sb3_favoritesA | List a user's favorited projects (id + title). |
| sb3_cloud_get_varsA | Read current cloud variable values for a project. |
| sb3_cloud_set_varC | Set a cloud variable value. |
| sb3_cloud_logsC | Recent cloud activity log for a project. |
| sb3_open_projectC | Load an .sb3 file into the Node editor. (proxied) |
| sb3_save_projectB | Write the open project back to .sb3, live-reloading TurboWarp. (proxied) |
| sb3_project_infoB | Targets, extensions, monitors, meta of open project. (proxied) |
| sb3_scratch_loginC | Log in to scratch.mit.edu for the Node session. (proxied) |
| sb3_open_scratch_projectB | Download a scratch.mit.edu project by id for editing. (proxied) |
| sb3_push_to_scratchC | Save the open project back to scratch.mit.edu (confirm-gated). (proxied) |
| sb3_share_projectC | Publish the project so it is public (confirm-gated). (proxied) |
| sb3_list_spritesB | Every sprite with position/size/media. (proxied) |
| sb3_get_targetB | Full details for a sprite or Stage. (proxied) |
| sb3_get_target_jsonC | Raw project.json entry for a target, or subtree at a JSON Pointer. (proxied) |
| sb3_list_blocksB | Catalog of standard opcodes from scratch-vm, optionally by category. (proxied) |
| sb3_get_block_schemaB | Full schema for one opcode incl. shadow encodings. (proxied) |
| sb3_enable_extensionB | Register an extension so its blocks load. (proxied) |
| sb3_patch_targetC | Apply RFC 6902 JSON Patch (as JSON string) to a target. (proxied) |
| sb3_set_spriteC | Set sprite props; props is a JSON object string (x, y, size, ...). (proxied) |
| sb3_add_spriteC | Add a sprite; props is a JSON object string. (proxied) |
| sb3_remove_spriteC | Remove a sprite. (proxied) |
| sb3_rename_targetC | Rename a sprite/stage target. (proxied) |
| sb3_set_stageC | Set stage props; props is a JSON object string. (proxied) |
| sb3_set_variableC | Set/create a variable on a target. (proxied) |
| sb3_delete_variableC | Delete a variable. (proxied) |
| sb3_set_listC | Set/create a list on a target; items is a JSON array string. (proxied) |
| sb3_delete_listC | Delete a list. (proxied) |
| sb3_add_broadcastC | Add a broadcast message. (proxied) |
| sb3_list_commentsA | List sprite comments. (proxied) |
| sb3_add_commentC | Add a sprite comment. (proxied) |
| sb3_set_commentC | Edit a sprite comment. (proxied) |
| sb3_remove_commentB | Remove a sprite comment. (proxied) |
| sb3_add_costumeC | Add a costume from a file. (proxied) |
| sb3_remove_costumeC | Remove a costume. (proxied) |
| sb3_add_soundC | Add a sound from a file. (proxied) |
| sb3_remove_soundC | Remove a sound. (proxied) |
| sb3_reloadC | Load an .sb3 from disk in TurboWarp Desktop via bridge. (proxied) |
| sb3_run_projectB | Green flag in TurboWarp Desktop via bridge. (proxied) |
| sb3_stop_projectC | Stop in TurboWarp Desktop via bridge. (proxied) |
| sb3_vm_loadB | Load the open project into the headless VM. (proxied) |
| sb3_vm_green_flagC | Press green flag in the headless VM. (proxied) |
| sb3_vm_runA | Advance the headless VM; returns state + event timeline. (proxied) Budgets ( |
| sb3_vm_stopA | Stop all scripts in the headless VM. (proxied) |
| sb3_vm_stateB | Snapshot headless VM state. (proxied) |
| sb3_vm_inputB | Feed keyboard/mouse/answer input to the headless VM. (proxied)
|
| sb3_vm_threadsA | Live thread inspector: target, clone flag, hat, stack, status. (proxied) |
| sb3_vm_monitorsA | Full monitor table (visible or not): label, opcode, value, mode. (proxied) |
| sb3_vm_step_frameA | Step exactly one frame; returns before/after + delta. (proxied) |
| sb3_vm_seedB | Deterministic PRNG seed for operator_random; None restores Math.random. (proxied) |
| sb3_vm_watchC | Poll-and-diff variable watcher: old/new/changed per key. (proxied) |
| sb3_vm_stub_callsB | Recorded pen/sound stub calls since load. (proxied) |
| sb3_vm_pen_pngB | Pen raster as PNG base64 + non-transparent pixel count. (proxied) |
| sb3_vm_mix_wavB | Offline sound mix as WAV base64 + event count + seconds. (proxied) |
| sb3_vm_run_untilA | Run the headless VM on virtual time until a predicate fires. (proxied)
|
| sb3_vm_pokeA | Set live VM state (fault injection mid-wave). (proxied) Each arg is a JSON array string: |
| sb3_vm_clonesA | Live clone census: name, pose, costume, sprite-locals per clone. (proxied) |
| sb3_find_blocksA | Query every target's blocks map in the open project. (proxied) Filters combine (AND): opcode substring, field value, input name, topLevel-only. Needs an open project, not the VM. |
| sb3_validate_blocksA | Validate target blocks against the opcode catalog. (proxied) Omit target for all targets. Advisory — custom extension blocks ignored. |
| sb3_screenshotA | Capture the live TurboWarp stage as PNG (base64-wrapped note). (proxied) |
| sb3_screenshot_jpegB | Capture the live stage as compressed JPEG. (proxied) |
| spy_open_projectA | Open (or create) a ScratchPy .spy project file; all other spy_* tools act on it. |
| spy_project_overviewB | What is in the .spy project: tabs, variables, lists, custom blocks, package packs. |
| spy_read_blocksC | Readable outline of every script in a tab. |
| spy_read_codeD | The Python a tab's blocks generate. |
| spy_write_pythonC | THE MAIN BUILD TOOL: give ordinary Python, it becomes Scratch blocks in a tab. |
| spy_import_python_fileB | Turn an existing .py file on disk into blocks. |
| spy_delete_fileC | Remove a tab from the project. |
| spy_set_variableB | Create a variable or list, or change its starting value. |
| spy_runB | Run a tab's generated Python and return what it printed. |
| spy_list_block_typesC | Every kind of block ScratchPy knows, with the Python each one produces. |
| spy_list_packagesB | Python packages installed in the environment ScratchPy uses. |
| spy_install_packageC | pip install a package and turn it into blocks. |
| spy_add_package_blocksB | Make blocks for an already-installed module (stdlib modules work too). |
| spy_remove_package_blocksC | Take a package's blocks back out of the project. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 117 tools
The prefix families (project_, social_, sb3_, spy_) provide clear context, so many tools are distinguishable. However, there are multiple overlapping same-purpose tools across subsystems—project_info vs sb3_project_info vs social_get_project_info, project_download vs sb3_open_scratch_project, project_save_to_cloud vs sb3_push_to_scratch, and project_add_costume vs sb3_add_costume—which can cause misselection if the agent is not attentive to the descriptions.
All names are snake_case and there is a recognizable prefix convention, which is helpful. But within each prefix the pattern is mixed: some are verb_noun (project_add_costume, social_post_comment), some are noun phrases (project_summary, sb3_project_info, spy_project_overview), and some are noun+verb (sb3_vm_run, sb3_vm_input). Retrieval verbs also vary between get_, list_, and read_ without a consistent rule.
117 tools is an extreme tool count, far beyond what is practical for an agent to navigate or select from reliably. Even for a 'unified' Scratch server, this appears to be four or more separate tool surfaces merged into one, and the rubric explicitly flags 50+ tools as an extreme mismatch.
The server is functionally very complete: it covers goboscript project authoring, build/upload, Scratch website social interactions, .sb3 editing, VM-based testing, and ScratchPy code-to-blocks conversion. Minor gaps remain—social comment deletion/editing, studio creation/management, and project deletion/unsharing are absent—but these are workable around and do not block core workflows.