I make I streamcontent I make I buildgames

for devs & their agents

Your agent ships. We find the hype.

FanZero speaks MCP. Point Claude Code, Codex or any agent at it, and it can check your build, publish your game, read the review and ship fixes without you opening a browser. It is told to ask you before anything that costs you a cut, and a human curator still gives the final yes.

1 · Connect

Codex, Cursor and the .mcp.json file read FANZERO_API_KEY when they start. The claude mcp add command copies it when you run it, so set it first (or run the command again once you have a key). VS Code asks for the key. Other MCP clients: same URL and header, see the page your agent reads.

terminal
claude mcp add --transport http fanzero https://fanzero.app/mcp --header "Authorization: Bearer $FANZERO_API_KEY"
or, in a game repo: .mcp.json
{
  "mcpServers": {
    "fanzero": {
      "type": "http",
      "url": "https://fanzero.app/mcp",
      "headers": {
        "Authorization": "Bearer ${FANZERO_API_KEY}"
      }
    }
  }
}

No key yet? Your agent asks you for a studio name, then calls create_studio. Or make one here.

Step by step, with what your agent asks you first: publish from Claude Code.

2 · Say the magic words

From your game's folder:

Read https://fanzero.app/agents.md, then publish the game in this folder to FanZero.

No game yet? Ask for one first: “Make a game about a raccoon running a night market.” Then hand it the line above.

It reads the guidelines, runs check_build until the build passes, checks the key with whoami, asks you before it publishes or offers a cut, submits, and ships fixes with update_game.

Tools

13 tools, straight from the server's catalog. Your agent runs the first 6 on its own. The other 7 touch your listing, your offer or a real streamer, so it is told to ask you first.

On its own

read_listing_guidelinesWhat FanZero accepts: build rules, pitch, pact rules and how review works. no keyread-only
check_buildRuns the automated checks on a build (and the pitch and pacts if sent). Saves nothing. no keyread-only
whoamiWhich studio the key belongs to, with game and pact-request counts. Without a key, how to get one. no keyread-only
get_reviewStatus, next step, check results, critic notes, curator note and log for one of your games. read-only
list_my_gamesYour games, who holds each one, and every pact request with its proposed actions, dates and next step. read-only
browse_gamesSearches the public catalog of live games: who is free, top share, studio. no keyread-only

Only with your OK

create_studioRegisters the studio once and returns its API key. Refuses an exact duplicate. no key Your agent is told: “Ask whether they already have a studio and key; if not, ask for the studio name and a contact.”
submit_gameSubmits a NEW game (build, pitch, pacts), runs the checks and the critic, then queues it for a human curator. Your agent is told: “It publishes their game and offers revenue shares: get their OK on the pitch and every pact term.”
update_gameChanges the pitch, pacts or build of one of your games. A listed game's new build replaces the live one only if it passes the automated checks, and those read the code without playing it. Your agent is told: “New pacts are revenue offers, dropped pacts decline waiting requests, and a passing build for a listed game goes live at once.”
add_pactOffers one more revenue-share pact on one of your games. Your agent is told: “A pact is a revenue-share offer: the human picks the suggested action, share_pct and optional requirement or audience floor.”
close_pactCloses a pact; requests still waiting on it are declined. Running deals keep their terms. Your agent is told: “Closing declines requests still waiting on that pact.”
respond_to_claimApproves or declines a proposed action schedule. Legacy proof responses remain supported. needs human_approved: true to accept Your agent is told: “Approving commits share_pct% of net revenue for 4 weeks from the first proposed action date; every answer reaches a real creator.”
confirm_deliveryLegacy contracts only: confirms proof under the older go-live rules. Scheduled pacts need no delivery confirmation. needs human_approved: true Your agent is told: “Confirming means the studio owes the share for that window. Check the proof link together.”

One exception: while the game is still in review, it sends fixed builds with update_game on its own, as part of the publish job you gave it. Anything on a listed game, its listing or its pacts: it asks you.

HUMAN_APPROVED

Accepting a creator's actions and dates commits you to a revenue share for 4 weeks. Your agent needs your explicit approval and must send human_approved: true. On the studio desk, you review and accept the plan yourself. Older pacts may still require delivery confirmation.

The review gauntlet

🚪 The Bouncer

Automated, instant. Runs offline? Has input? No trackers, no external assets, no snooping on the parent page? Pacts make sense? Your agent can run it as often as it likes with check_build; nothing is saved.

🧐 The Critic

Scores fun potential, clarity and streamability, and writes notes your agent can act on. This instance runs the house checklist; it switches to Claude when an API key is set.

🧑‍⚖️ The Curator

A person plays every game before it is listed. That's what keeps the list worth browsing.

Guidelines

Also as a page: listing guidelines.

# FanZero listing guidelines (for humans and agents)

FanZero lists *very early* games: napkin ideas, prototypes, vertical slices. Rough is fine. Boring is not.

## The build
- Must run in a browser from an index.html at the root. Single-file builds are ideal.
- Max 8 MB total. Assets inline (data URIs) or as extra files you send with the build.
- No network calls at runtime: no fetch/XHR/WebSocket, no CDNs, no analytics, no ads, no links out. Games run in a sandboxed iframe that blocks network calls and outside assets.
- One page: the game never loads another page in its frame (no location changes, location.assign/replace, meta refresh or links to other pages). The checks refuse a build that does, and the player closes a game that does it anyway.
- Games run on an opaque origin: localStorage, sessionStorage, IndexedDB and cookies throw. Keep state in memory or wrap storage in try/catch.
- No eval tricks, no cookie/storage snooping of the parent page, no popups.
- It has to be playable in under 10 seconds: a title screen, then fun. Keyboard + mouse/touch where possible.
- Tip: call parent.postMessage({ type: 'fanzero:score', score }, '*') on game over and FanZero will show the score to the player.
- The automated checks read the code; they don't play it. Play your build in a sandboxed iframe (sandbox="allow-scripts") before you send it, above all as an update to a game that is already listed.

## The pitch
- title (max 60 chars), tagline (8-120 chars, make it bite), description (60-4000 chars: what it is, what makes it weird, where it's going).
- genre: arcade, action, puzzle, roguelike, platformer, cozy, strategy, rhythm, horror, weird.
- stage: napkin, prototype, vertical-slice, alpha.
- controls: one line.
- store_url: optional https link to where it already sells (Steam, itch.io, your site). Already on sale is fine.

## Pacts (the whole point)
At least one pact. A pact = what % of net revenue the streamer who takes it gets, and for doing what (YouTubers and TikTokers count as streamers).
- action: livestream | video | short | post | playtest
- share_pct: 0 < x <= 50 (percent of the game's net revenue, so 10 means 10%)
- requirement: be concrete, e.g. "Min 60 min live, link in chat", "Video >= 8 min, game in title".
- min_audience: optional follower floor.

How every pact runs (same rules for all, nothing to configure):
- One streamer at a time per game. Other streamers can still pitch while it's held; you accept the next one when the game is free again. No overlap, no attribution fights.
- Accepting a pitch gives the streamer 30 days to go live and send proof. Miss it and the claim expires; the game is free again. Deadlines are exact times, shown in UTC.
- The window is 4 weeks (28 days), counted from when the stream, video or post went live (the streamer reports it with the proof link), not from when you confirm. A window never starts before the previous one on the same game ends.
- The share is share_pct% of the game's net revenue earned during those 4 weeks, from every store it sells on (Steam, itch.io, your site). Already on sale before the pact? Those stores count too.
- Proof doesn't check out? Send it back (send_back): no window starts, and the first time they get at least 3 more days to fix it. A later send-back adds no time, and one after their deadline ends the claim. Or turn it down (decline): no window, and the game is free for the next pitch.
- Proof waiting for your check holds the game only until its 4 weeks would have ended. After that the game is free; you can still confirm (the window is recorded as completed) or turn it down.
- You can only accept a pitch on an open pact of a live game. Closing a pact (or replacing it with update_game) passes the pitches still waiting on it.
- When a window ends, the same pact can go to the next streamer.

Pacts are tracked on FanZero; money moves outside the platform for now. Be honest: under-promise.

## Review
1. The Bouncer: automated checks above (it reads the source and the pitch; it doesn't run the game). Blocking issues bounce the build back with notes.
2. The Critic: an AI reviewer scores fun potential, clarity and pitch (0-100) and leaves notes.
3. The Curator: a human plays it and gives the final yes. No game is listed without a person.
Status: checking -> changes_requested | awaiting_curator -> listed | rejected.
Fix notes with update_game (send a new build) and it goes through review again. Agents can dry-run the automated checks with check_build first; it saves nothing.
A new build for a game that is already listed goes through the automated checks (the Bouncer and the critic) before it replaces anything: if it fails you get build_rejected, and the live version, pitch and pacts stay as they were. If it passes, the new version goes live right away, with no human playing it first (the game was already approved; curators see it in the log). So play it yourself before you send it.