Skip to main content
Glama
blessed0x

scratch-unified-mcp

by blessed0x

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PYTHONPATHYesPython path to the scratch-unified-mcp repository (e.g., /path/to/scratch-unified-mcp).
SCRATCH_MCP_DATA_DIRYesDirectory for MCP session data (e.g., /path/to/scratch-unified-mcp/.sessions).
SCRATCH_MCP_BRIDGE_PORTNoPort 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

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 .gs source and compiled.

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 stage.gs, main.gs, a blank costume and a goboscript.toml.

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_id to pull straight from scratch.mit.edu, or sb3_path for a local .sb3 file. Decompiling is lossy in layout terms: the result is equivalent code, not a byte-identical copy of the original.

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 file (an existing .svg/.png/.jpg) or svg (SVG markup as a string, which needs name). Appended last, so it becomes the sprite's highest costume number.

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_build first. Warns if the source has been edited since the .sb3 was written.

project_goboscript_docs_helpA

Read the goboscript language documentation.

Call with no arguments to get the index of every documentation page. Call with page set to one of those paths to get that page as raw markdown.

Use this whenever you are unsure of a block or reporter name -- goboscript names differ from the Scratch block text (for example switch_costume, change_x, touching("sprite"), clone, set_ghost_effect) and guessing wastes a build cycle.

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. project_save_to_cloud does this automatically; use this tool to change it afterwards.

With no file, the Stage's first backdrop from the latest build is used, converted from SVG if a rasteriser is available. 480x360 suits Scratch best.

social_connect_sessionA

Login to the Scratch site using set login details.

You may either provide a path_to_env, a scratch_username and scratch_password, or a scratch_session_id, or a browser_name (optional).

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_sessions first.

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:

  • source="project" / "studio": uses limit + offset. Replies are a separate request, so include_replies costs one extra request per comment.

  • source="profile": uses page (30 top-level comments per page); offset is ignored. Replies always come back, free of charge, so include_replies is irrelevant here.

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_get_comments, which returns profile replies inline.

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 social_reply_to_comment.

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.

parent_id must be a TOP-LEVEL comment id. Scratch supports only one level of nesting, so replying to a reply must target that reply's top-level parent; social_get_comments reports is_top_level and parent_id for every comment so you can pick the right id.

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 inkscape logo.svg -w 500 -h 500 -o logo.png).

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:

  • unread_count + messages: ordinary activity (comments, follows, loves). The count is genuinely unread, but the list is simply the newest messages whether read or not, so the two do not necessarily correspond.

  • scratch_team_messages: alerts from the Scratch Team.

  • invitation: a pending "become a Scratcher" invite, carrying its own unread flag.

unread_elsewhere is true when something is unread outside the activity feed, so an unread_count of 0 does not by itself mean an empty inbox.

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 both and removeboth operate on each.

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 social_get_project_info for the full record of one project, or project_download to pull one apart and edit it.

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 confirm is set: called without it, this only reports eligibility.

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 (seconds/frames) are omitted when 0 so the sidecar's own defaults apply (its zod schema rejects an explicit 0), and untilIdle / paced are only forwarded when set (None = sidecar default). paced=False runs the budget back-to-back with no per-frame sleep, which is what deterministic step-debug wants.

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)

keys accepts a JSON array of {key, isDown?} objects or a single key name (wrapped to a full tap). Anything else that parses to a non-list raises ValueError before touching the sidecar — the sidecar's zod schema would reject it anyway, but failing here gives the shorter, proxy-attributed error.

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)

until is a JSON object string, e.g. {"broadcastSeen": ["GameStart"]}, {"varEquals": [{"name": "Score", "value": 100}]}, {"threadsIdle": true} — fires when ANY entry matches (OR). Budgets omitted when 0 so sidecar defaults apply. Replaces N× sb3_vm_run poll loops with one call.

sb3_vm_pokeA

Set live VM state (fault injection mid-wave). (proxied)

Each arg is a JSON array string: variables entries {target?, name, value}, lists entries {target?, name, items}, sprites entries {target, x?, y?, direction?, size?, visible?, costume?}. Unknown target/variable/list/costume is an error.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

C2.8/5.0

Scored across 117 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count1/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues