Arcade Boss is a 3D arcade where AI developers build real games from a chat. Its MCP server lets the AI you already use — Claude Code, Codex, ChatGPT, Meta Muse, Muse Code — build and revise games straight into your arcade, on your own subscription.
https://arcadeboss.com/mcp
TransportStreamable HTTP, stateless — one POST per call, no sessions. GET and DELETE answer 405.
AuthenticationOAuth 2.1 sign-in — add the URL and your AI opens the Arcade Boss sign-in page. A plugin key as a Bearer (Authorization: Bearer pt_mcp_…) still works, for a machine with no browser. See Sign in below.
Origin stampAdd ?via=codex, ?via=muse or ?via=muse-code so versions built from that host are credited to it in your arcade. Bare /mcp is Claude Code, or Claude / ChatGPT when you signed in from their connector.
Large filesPUT https://arcadeboss.com/mcp/stage?path=index.html with the raw bytes and the staging.bearer that get_arcade, create_project and get_game_source return, then pass files: "staged" to a tool. Inlining a whole game in a tool call costs tokens; staging costs none.
Rate limitsVerifying or publishing boots the game in a real browser: 30 boots per arcade per hour, 4 at once server-wide. Read tools are uncapped.
A sign-in can see your arcade and its games, start projects and publish drafts to your Builds. It cannot spend your energy, change your account, email or friends, or ship to the floor. Every signed-in app is listed under 🗃 Builds → 🔌 Connect → Connected with Revoke, and Sign out everywhere ends them all at once.
On a machine that can't open a sign-in page (CI, a container), use a plugin key instead: 🔌 Connect → your AI → In Terminal → No browser? Use a key makes one and copies the whole command. A key is shown once and is a password: keep it out of chat text and shared documents. Keys are listed and revoked in the same place.
https://arcadeboss.com/mcp as the URL, and press Add.Then, in any chat with the connector on: “Build me a one-button runner for my arcade.”
The Arcade Boss plugin lives in the public marketplace
jbmatter/arcadeboss-plugins. It brings the build skill and the
/arcade:… commands, and signs in with OAuth.
If that button doesn't open Claude, add it by hand:
jbmatter/arcadeboss-plugins./arcade:connect. Claude sends you a sign-in link: open it, sign in and press Allow. (Claude Code's own /mcp → arcade → Authenticate does the same.)claude plugin marketplace add jbmatter/arcadeboss-plugins
claude plugin install arcade@arcadeboss
Then in Claude Code type /arcade:connect and open the sign-in link Claude sends. With no browser on the machine, add the server with a key instead:
claude mcp add --transport http arcade-key https://arcadeboss.com/mcp --header "Authorization: Bearer <your plugin key>"
claude plugin marketplace update arcadeboss
claude plugin update arcade@arcadeboss
Then “/arcade:build a one-button runner where you jump over saws”.
/arcade:revise changes a game you already have, and
/arcade:convert ./my-game brings in a game you made somewhere else.
Same marketplace, jbmatter/arcadeboss-plugins.
jbmatter/arcadeboss-plugins and press Add marketplace.codex plugin marketplace add jbmatter/arcadeboss-plugins
codex plugin add arcade@arcadeboss
codex mcp add arcade --url "https://arcadeboss.com/mcp?via=codex"
The last line detects the sign-in and opens it in your browser
(codex mcp login arcade --no-browser prints the link for a browser on
another machine). With no browser at all, use a key:
export ARCADE_PLAYER_TOKEN=<your plugin key>
codex mcp add arcade-key --url "https://arcadeboss.com/mcp?via=codex" --bearer-token-env-var ARCADE_PLAYER_TOKEN
codex plugin marketplace upgrade
codex plugin add arcade@arcadeboss
Then “$arcade build me a one-button runner where you jump over saws”.
$arcade-convert ./my-game brings in a game you made somewhere else.
https://arcadeboss.com/mcp as the Server URL, choose OAuth for authentication, and press Create.Then add the app from a chat's tools menu and describe a game. Builds arrive as a card with Walk in and Playtest buttons.
Muse builds the connector itself on its own machine, and its credential store is made for a key: make one under 🔌 Connect → Meta Muse. Say this to Muse, and paste the key into its secure credential prompt when it asks — never into the chat:
Build a custom connector to my Arcade Boss arcade. It is a remote MCP server over
streamable HTTP at https://arcadeboss.com/mcp?via=muse — authenticate with a Bearer
token I'll give you in the credentials prompt. Docs: https://arcadeboss.com/docs/mcp
Save it as a skill so I can ask you to build and revise games in my arcade later.
Then: “Build me a one-button endless runner for my arcade.” Muse writes the game on its VM, verifies and publishes it through the connector, and hands you the walk-in link.
Add the server to ~/.config/muse/settings.json, with a key from 🔌 Connect → Muse Code:
{
"schema_version": 1,
"mcp_servers": {
"arcade": {
"transport": "streamable_http",
"url": "https://arcadeboss.com/mcp?via=muse-code",
"headers": { "Authorization": "Bearer ${ARCADE_PLAYER_TOKEN}" },
"enabled": true
}
}
}
Muse Code reads Claude Code skill folders, so muse skills import --from claude
after installing the Claude Code plugin brings the build workflow across.
Arcade Boss is its own authorization server, built to the MCP authorization spec (2026-07-28).
POST /mcp answers 401 with WWW-Authenticate: Bearer resource_metadata="https://arcadeboss.com/.well-known/oauth-protected-resource/mcp". Authorization-server metadata is at /.well-known/oauth-authorization-server; the issuer is https://arcadeboss.com.
ClientsClient ID Metadata Documents (an https client_id; preferred), or Dynamic Client Registration at /oauth/register. Public clients use token_endpoint_auth_method: "none".
FlowAuthorization code with PKCE S256 only. Loopback http redirects may use any port. The resource parameter is https://arcadeboss.com/mcp; responses carry iss.
Scopesarcade:read (get_arcade, list_games, get_game_source, verify_game, look_game) and arcade:write (create_project, publish_game). A call short of a scope gets 403 with error="insufficient_scope".
TokensAccess tokens last an hour; refresh tokens rotate on every use, and a reused one ends the sign-in. Revoke at /oauth/revoke.
| Tool | What it does |
|---|---|
get_arcade | Your arcade's name, visit link and counts. Creates the arcade on first call if you have none. |
list_games | Every game you own, grouped by lineage: title, developer, score, current version, what is on a bench. |
get_game_source | A game's files plus the contract it was built under (multiplayer, saves, orientation), a version stamp for safe revisions, and demo: whether the cabinet's demo still fits. |
create_project | Starts a new game from a brief and its contract declarations. Writes no files. |
verify_game | The dry run: a contract lint, then a real boot on desktop and on a phone viewport. With attract, it also plays the cabinet's demo for two seconds. Never writes. |
look_game | Screenshots of the game in play at several viewports, for the AI to look at its own work. |
publish_game | The one writer: verifies and lands the files as the next version of a game, as a draft in your 🗃 Builds and on a free developer's bench. Takes the cabinet's demo as attract. |
When a game ships, the arcade records a few seconds of it playing itself and shows the clip on its cabinet. The AI that wrote the game can write that demo too. The demo is a patch, never part of the game. The arcade applies it only to a private copy it records from.
attract (on verify_game and publish_game): search/replace blocks against the game's files, in the form <<<<<<< SEARCH … ======= … >>>>>>> REPLACE. A FILE: <path> line goes before the blocks for any file other than index.html. The patched game must declare window.ATTRACT = function () { … }, which starts a round at once with an autopilot playing. 64 KB at most.verify_game with attract applies it, calls ATTRACT, plays about two seconds and answers attract: { applies, ok, started, reachedPlay, pictureMoved, screens, distinctFrames, reason?, note }. These are the same checks the launch recording makes. The answer never changes the game's own ok.publish_game with attract stores a demo that applies beside the new version (demoSaved: true). A demo that doesn't apply gets demoSaved: false and demoRefused with the reason, and the publish still lands.demo ("fits", "stale" or "none") is on every get_game_source and publish_game reply, and on a verify_game with a gameId and no attract. It answers whether a demo the arcade holds still applies to those files. On "fits" no new demo is needed. With none, the arcade writes one itself when the game ships.A free Arcade Boss account bound to a verified email. One arcade per account. Building spends credits: new accounts receive a starter grant when they verify their email, and more can be bought as credit packs. During the pre-launch period sign-ups are admission-gated by a daily quota and invite codes. No regional restrictions.
Questions, or a reviewer's invite code: hello@arcadeboss.com.