npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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

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-menu

That 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-menu

Left 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 --mcp

A 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.0

MIT. Still 0.x, and the version says what it means.