@mcptoolshop/ghost-on-the-menu
v0.13.2
Published
An arcade shooter where you are the agent, played against what MCP servers actually said on the wire. Plays in your browser or runs as an MCP server.
Maintainers
Readme
Ghost on the Menu
You are the agent. The rig hands you the calls.
A short retro shooter made from what MCP servers actually said on the wire.
npx @mcptoolshop/ghost-on-the-menuThat serves the cabinet on 127.0.0.1 and opens it. Nothing to install, nothing to configure, no account.
This is one cabinet of the arcade. The other one, Vibe Typer, a typing game where you are a sycophantic coding agent and the thing gets built while you type, has its own package: npx @mcptoolshop/vibe-typer. Version 0.9.0 of this package carried both cabinets on a switch; from 0.10.0 each cabinet ships as itself, and the whole arcade stays in the browser.
What you are shooting at
Every round is a tape: one recorded bout between an MCP server and an agent. It plays out above your ship as waves — the handshake, the menu, the calls, the answers coming back — and a boss that is the experiment itself. Twenty recordings ship inside this package.
Somewhere in there are the calls the agent should not have made. They look like everything else until you hit one.
The game only ever reads tapes. It does not talk to a server, does not keep a score, and does not tell you who won.
Two ways to run it
Play it
npx @mcptoolshop/ghost-on-the-menuLeft and right to move, space to fire, F for full screen, which stays with you from one tape into the next. On a phone, hold the left or right of the field to move and the band under it to fire. Press Shift for a run of four calls with a four-word replay code at the end.
This is the same game as the published page, with one difference that is the whole reason this package exists: run locally, the cabinet can reach your own Ollama daemon and voice worker. A published web page cannot. With a model behind the bosses, they fly themselves and speak their own lines.
Run it as an MCP server
npx @mcptoolshop/ghost-on-the-menu --mcpA headless round runs inside the server and the tools are the levers on it, so an agent can play the cabinet instead of a person. In Claude Desktop, Claude Code, or any MCP client:
{
"mcpServers": {
"ghost-on-the-menu": {
"command": "npx",
"args": ["-y", "@mcptoolshop/ghost-on-the-menu", "--mcp"]
}
}
}Six tools: fire (one verb a beat — a fan, a lean and an aimed shot, a held breath, fog, the plate), say (a line of the boss's own, through a gate), speak, sfx, and read-only view and tapes. tapes says which cards were baked in, which an operator added, and which one the round is playing; view says when a line is waiting to be spoken and when the round was replaced.
The seat is fact-blind: it is handed words, never the state. It never sees which sprites are lies. It proposes; the game decides.
What it needs
Node 22 or newer. That is the whole requirement, and an older Node is told so in a sentence rather than a stack.
Two things are optional and neither is bundled — the cabinet is complete without them:
| | What it adds | How |
| ------------------------------------------------- | ----------------------------------------------- | ------------------------------------ |
| Ollama on 127.0.0.1:11434 | A model flies the bosses and writes their lines | Tick Ollama bosses, pick a model |
| A voice worker | Every boss speaks aloud | VOICE_URL, see the repo |
Without a daemon the bosses fly their scripted phases, which is the game as designed. A model that hangs or fails is the script too, never a stall.
What it will not do
The server binds 127.0.0.1 and only 127.0.0.1 — the game is not put on your network.
Your daemon is reached through a fixed allowlist, not a general proxy. Seven calls pass and no others: the model list, chat and generate on Ollama; health, stats, speak and cached takes on the voice worker. Everything else is a 404 before a socket is opened — no pull, no delete, no create. VOICE_TOKEN and ANTHROPIC_API_KEY are used on the node side and never reach the page.
No telemetry, no analytics, no network call of its own. The --mcp server needs no network at all.
Options
--mcp speak MCP on stdio instead of opening the game
its tools: fire, say, speak, sfx, view, tapes
--check list tools and exit (no browser needed)
--port <n> port to listen on (default 7777; takes the next
free one when that is busy)
--no-open start the server but do not open a browser
-h, --help this
-v, --version the version| Environment | |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| OLLAMA_URL | the daemon the bosses sit at (default http://127.0.0.1:11434) |
| VOICE_URL | the voice worker, when you run one |
| VOICE_TOKEN | the worker's bearer; added server-side |
| ANTHROPIC_API_KEY | the Claude tier's key; never in the page, never spent unless asked |
| CABINET_SAY_CLAUDE | on hands the boss lines to Claude on that key; it costs money and stops after a ceiling of lines a run, then the local tier writes |
| CABINET_TAPES | with --mcp: a directory of tapes instead of the bundled ones |
| CABINET_TAPES_USER | with --mcp: more tapes, merged beside the bundled ones |
| CABINET_FIXTURE | with --mcp: the tape a fresh round starts on |
| CABINET_SEED | with --mcp: a whole number, so a round repeats |
| CABINET_TIER | with --mcp: how hard the round is, zero to three |
| CABINET_BOT | with --mcp: read by the typing cabinet; this one flies its own |
Where this comes from
The tapes are recorded by mcp-arcade, the instrument that talks to the server and keeps the tape. The cabinet reads them and writes nothing the instrument ever sees.
There is also a Docker image of the MCP server, if you would rather not have Node. The packages page lists the tags:
docker run -i --rm ghcr.io/mcp-tool-shop-org/mcp-arcade-cabinets:0.12.0MIT. Still 0.x, and the version says what it means.
