Working on your own machine
Clone a game to your computer and build it with your own AI coding assistant.
umicat games live in the browser, and for most people that is the whole story. But a game is ordinary code — TypeScript, Vite, a git history — and you can have all of it on your own machine, edited by whichever AI coding assistant you already use.
That works through the umicat MCP server: a small program that runs locally and gives your assistant a way to reach your projects. Clone a game, change it, run it, send the work back.
Is this for you?
It is worth setting up if you are comfortable in a terminal and you already pay for an AI coding assistant (Claude Code, Codex, or anything else that speaks MCP).
| In umicat | On your machine | |
|---|---|---|
| Setup | none — open the editor | install a server, sign in |
| Who pays for the AI | your umicat credits | your own subscription |
| Making art, sound, music | yes | no — these stay in umicat |
| Placing entities, HUD layout | visual editors | possible, but you'd be guessing |
| Publishing | yes | no — publishing stays in umicat |
| Big refactors, real debugging | fine | much better |
| Seeing a change | preview reloads | run the game locally |
Both write to the same project. You can build in the browser on Monday, clone it on Tuesday, and open the editor again on Wednesday.
Install
Make sure you have Node.js. Version 20 or newer.
node --versionIf that prints nothing, install it and open a new terminal:
brew install nodeOr the LTS installer from nodejs.org.
# Debian/Ubuntu — the distro package is often several majors behind
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejsOr the LTS tarball from nodejs.org, or a version manager
such as fnm or nvm.
winget install OpenJS.NodeJS.LTSOr the LTS installer from nodejs.org. This page is for native Windows — PowerShell or the terminal, no WSL needed. If you do work in WSL, follow the Linux tab instead: everything inside it is Linux.
This is not an extra requirement — a umicat game is a Vite + TypeScript project, so running one on your machine needs Node regardless.
Claude Code's own installer does not bring Node with it, so a brand-new machine can have a working Claude Code and no Node at all.
And git, which is what puts the project on your disk. git --version
should print something.
xcode-select --installsudo apt install git # or your distribution's equivalentwinget install Git.GitOr git-scm.com. Windows ships no git at all, so this one is usually a real install rather than a check. Open a new terminal afterwards.
Add the server to your assistant.
Claude Code and Codex write the config for you:
claude mcp add umicat -- npx -y @umicat/mcp # Claude Code
codex mcp add umicat -- npx -y @umicat/mcp # CodexEverything else takes the same server block:
{
"mcpServers": {
"umicat": { "command": "npx", "args": ["-y", "@umicat/mcp"] }
}
}Claude Code and Codex write the config for you:
claude mcp add umicat -- npx -y @umicat/mcp # Claude Code
codex mcp add umicat -- npx -y @umicat/mcp # CodexEverything else takes the same server block:
{
"mcpServers": {
"umicat": { "command": "npx", "args": ["-y", "@umicat/mcp"] }
}
}On native Windows the server has to be started through cmd:
{
"mcpServers": {
"umicat": { "command": "cmd", "args": ["/c", "npx", "-y", "@umicat/mcp"] }
}
}npx on Windows is npx.cmd, a batch script, and the way assistants launch a
local server will not run one directly. Without the wrapper the server appears
in the list and never connects.
Write this one by hand. claude mcp add umicat -- cmd /c npx -y @umicat/mcp
is known to store /c as C:/ (claude-code#20061),
which fails in a way that looks like the server is broken. If you run the
command anyway, check what it wrote with claude mcp get umicat before
anything else. Claude Code's own file is %USERPROFILE%\.claude.json, and a
project-scoped server goes in .mcp.json at the project root.
Only the file and the key that wraps it differ between assistants:
| Assistant | File | Wrapping key |
|---|---|---|
| Cursor | ~/.cursor/mcp.json, or .cursor/mcp.json in the project | mcpServers |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | mcpServers |
| VS Code | .vscode/mcp.json | servers |
| Codex, by hand | ~/.codex/config.toml (TOML: [mcp_servers.umicat]) | — |
VS Code is the odd one out: its workspace file wraps servers in servers, not
mcpServers, and the wrong key fails silently.
On Windows, ~ in that table means %USERPROFILE% — C:\Users\<you> — and
every one of them needs the same cmd wrapper: for Codex's TOML that is
command = "cmd" with args = ["/c", "npx", "-y", "@umicat/mcp"].
Anything not listed here: it is an ordinary stdio MCP server, run
npx -y @umicat/mcp (or cmd /c npx -y @umicat/mcp on Windows).
If it will not connect — /mcp showing failed, usually with ENOENT or
EINVAL — the command could not be started at all. That is a Node problem
rather than a umicat one.
Either Node is missing (see the step above), or it is installed somewhere the
server's PATH does not reach — usual with nvm, fnm and volta. Pin the
path:
claude mcp remove umicat
claude mcp add umicat -- "$(which npx)" -y @umicat/mcpEither Node is missing (see the step above), or it is installed somewhere the
server's PATH does not reach — usual with nvm, fnm and volta. Pin the
path:
claude mcp remove umicat
claude mcp add umicat -- "$(which npx)" -y @umicat/mcpCheck the cmd /c wrapper first — without it this is exactly the failure you
get, and claude mcp add may have written C:/ where /c belongs:
claude mcp get umicatIf the wrapper is right and it still will not start, Node is missing or off the
PATH. Confirm which npx is being found, in a new terminal — an installer
that changed the PATH does not reach one already open:
(Get-Command npx).Sourcenvm-windows in particular needs nvm use <version> before anything is on the
PATH at all.
Every assistant gets the same tools. Guidance about how umicat's SDK works is
installed two ways so it lands whichever one you use — as skills for Claude
Code, and as an AGENTS.md index for everything else, which is the
cross-vendor convention most agents read. If your project already has its own
AGENTS.md, it is left alone.
Sign in. Ask your assistant to sign in to umicat. A browser opens, you approve on a real umicat page, and you are done — nothing to copy or paste. The sign-in lasts 90 days; your assistant is told the date, and renewing is this same step.
Clone a game. Ask it to list my umicat projects, then clone the one you want. The code lands in a directory you choose, with its full history.
Restart your assistant (or /reload-plugins in Claude Code). A clone
carries guidance about how umicat's SDK expects games to be built,
and it loads at startup. See Working locally.
Signing out, and why there is no "Connect" button
Ask your assistant to sign out and it forgets the credential on this machine. That is not the same as revoking it: the credential stays valid on umicat until it expires or you revoke it at umicat.ai → Settings → Access tokens. A token deliberately cannot revoke itself, so a leaked one cannot lock you out of your own account.
You may have seen other MCP servers appear in /mcp as not connected, with a
button that starts a login. That is MCP's OAuth flow, and the specification
defines it for HTTP transports only — a local (stdio) server is told to take
credentials from the environment instead.
This server has to be local: putting your game's code on your disk is the whole point, and a remote server cannot reach your filesystem. So signing in is a request rather than a button. Your assistant is told at connect time to sign in before doing anything, so in practice you just ask for what you want and the sign-in happens on the way.
On a machine with no browser
A server or a container cannot open the sign-in page. Create a token instead, at umicat.ai → Settings → Access tokens, and pass it in the environment:
claude mcp add umicat --env UMICAT_TOKEN=umicat_pat_… -- npx -y @umicat/mcpOn Windows, put it in the same hand-written block as an env entry:
{
"mcpServers": {
"umicat": {
"command": "cmd",
"args": ["/c", "npx", "-y", "@umicat/mcp"],
"env": { "UMICAT_TOKEN": "umicat_pat_…" }
}
}
}UMICAT_TOKEN always wins over a stored sign-in, so this is also how you pin
a specific token.
What a token can and cannot do
Signing in this way is not the same as signing in to the website. What your assistant gets can read and change the code of projects you have access to, create a project, edit its details, upload files to it, and set its cover, logo and screenshots — that is what makes any of this possible — and nothing else. It cannot spend credits, buy anything, change your account, or create another token.
The line is drawn precisely where money is: uploading a file you already made costs nothing, so it is allowed; generating art with AI calls a paid model, so it is not. A cover you rendered yourself goes up from your machine; having umicat draw one for you does not. Publishing, deleting a project and managing collaborators are out for the same reason in a different currency — those stay deliberate acts you take in umicat.
It cannot throw work away either: umicat only accepts pushes that build on what is already there. See Sending work back.
Revoke it any time from the same settings page. It stops working everywhere immediately.
Your token is never written into a cloned game. It is handed to git one
command at a time, so a clone you share, copy or back up carries no
credential. The one exception is if you explicitly ask for plain git push
support, which writes it to ~/.config/umicat/token —
C:\Users\<you>\.config\umicat\token on Windows, which is where it goes
there too rather than under AppData.