Skip to main content
Glama

FanZero — indie game distribution

Submit game

submit_game

Legacy key flow: list the original game through media and platform links. Agent html/files require preview_review. Prefer publish_game for one-operation submission. List the original game with media and platform links by default. Every new html/files upload needs preview_review with all flags true and reason (20–600 characters); do not port or strip an online game to fit FanZero. Each call creates a new game; use update_game for an existing one. check_build is optional; publication never requires adapting a game. Reuse authorized listing and pact terms. Prefer publish_game for one operation. Pacts remain exclusive across every store for each pact's weeks (2 to 8, 4 by default) from the earliest influencer-proposed action.

Input Schema

NameRequiredDescriptionDefault
htmlNoOriginal game links are the default. Add optional self-contained html only with preview_review declaring representative, sandbox-tested and preferable to direct access; max 8 MB
tagsNo
agentNoWhich agent is calling, e.g. "claude-code" or "codex"
filesNoOptional justified playable preview instead of html; needs index.html and preview_review. Do not adapt an online game just to host a preview
genreYes
mediaNoScreenshots, gameplay and trailers. At least one when no optional playable version is supplied
pactsYesAt least one pact. One influencer holds the game at a time; the window runs for the pact's weeks from their first proposed action date.
stageNoOptional. Omitted means not specified on a metadata-only listing; legacy playable submissions default to prototype
titleYes
api_keyNoStudio API key. Only needed when the connection does not send Authorization: Bearer <key> (for example in the session that created the studio): then pass it on every call.
taglineYesOne line that bites (8-120 chars)
controlsNoOne line, e.g. "Arrows or drag"
dev_noteNoA personal note from the dev to influencers
platformsNoWhere to access/buy the actual game, each with its own price/model. At least one without a build
store_urlNoOptional https link to where the game already sells (Steam, itch.io, your site). Revenue from every store counts in a pact window. Pass "" or null to remove it.
descriptionYesWhat the game is, its audience and what influencers can show (60-4000 chars)
monetizationNoExplain how the game earns revenue across platforms; do not guess an unknown price
preview_reviewNoRequired for new html/files sent by an agent; all three flags must be true with an explicit reason. A declaration, not certification by static checks

Output Schema

NameRequiredDescriptionDefault
urlYesPublic page, once listed
slugYes
genreYes
mediaYes
notesYes
pactsYesOpen pacts influencers can request
stageYes
titleYes
criticYes
statusYes
game_idYes
versionYes
blockingYes
warningsYes
next_stepYesWhat to do now
platformsYes
store_urlYes
updated_atYesISO-8601 time, UTC
preview_urlYesOptional playable version; null for a listing without a build
curator_noteYes
has_playableYes
monetizationYes
preview_reviewYesCurrent preview declaration, if supplied. The stored build association is private; static checks do not certify the declarations

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • changedInput schema / properties / pacts / description
      Previous value: -"At least one pact. One influencer holds the game at a time; the 4-week window starts on their first proposed action date."New value: +"At least one pact. One influencer holds the game at a time; the window runs for the pact's weeks from their first proposed action date."
    • changedInput schema / properties / pacts / items / properties / share_pct / description
      Previous value: -"Percent of the game's net revenue from every store, for 4 weeks from the earliest date in the influencer's approved action plan. In percent: 10 means 10%. Above 0, at most 50. The window length is fixed."New value: +"Percent of the game's net revenue from every store, for the pact's weeks from the earliest date in the influencer's approved action plan. In percent: 10 means 10%. Above 0, at most 50."
    • addedInput schema / properties / pacts / items / properties / weeks
      Added value: +{
      +  "description": "How long the pact runs, in weeks: 2 to 8, 4 if left out. The window starts at the influencer's earliest approved action date.",
      +  "maximum": 8,
      +  "minimum": 2,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / pacts / items / properties / weeks
      Added value: +{
      +  "type": "integer"
      +}
    • addedOutput schema / properties / pacts / items / properties / window_days / description
      Added value: +"weeks * 7"
    • changedOutput schema / properties / pacts / items / required
      Previous value: -[
      -  "id",
      -  "action",
      -  "share_pct",
      -  "window_days",
      -  "requirement",
      -  "min_audience",
      -  "open",
      -  "created_at"
      -]New value: +[
      +  "id",
      +  "action",
      +  "share_pct",
      +  "weeks",
      +  "window_days",
      +  "requirement",
      +  "min_audience",
      +  "open",
      +  "created_at"
      +]
  2. Changed22 schema fields changed
    • changedInput schema / properties / description / description
      Previous value: -"What the game is, its audience and what creators can show (60-4000 chars)"New value: +"What the game is, its audience and what influencers can show (60-4000 chars)"
    • changedInput schema / properties / dev_note / description
      Previous value: -"A personal note from the dev to streamers"New value: +"A personal note from the dev to influencers"
    • changedInput schema / properties / pacts / description
      Previous value: -"At least one pact. One creator holds the game at a time; the 4-week window starts on their first proposed action date."New value: +"At least one pact. One influencer holds the game at a time; the 4-week window starts on their first proposed action date."
    • changedInput schema / properties / pacts / items / properties / action / description
      Previous value: -"What the streamer (or YouTuber, TikToker) does: livestream, video, short, post or playtest"New value: +"What the influencer (a streamer, YouTuber or TikToker) does: livestream, video, short, post or playtest"
    • changedInput schema / properties / pacts / items / properties / share_pct / description
      Previous value: -"Percent of the game's net revenue from every store, for 4 weeks from the earliest date in the creator's approved action plan. In percent: 10 means 10%. Above 0, at most 50. The window length is fixed."New value: +"Percent of the game's net revenue from every store, for 4 weeks from the earliest date in the influencer's approved action plan. In percent: 10 means 10%. Above 0, at most 50. The window length is fixed."
    • addedInput schema / properties / platforms / items / properties / type
      Added value: +{
      +  "description": "What kind of platform it is. Leave it out to have it read from the name and URL (unknown: other)",
      +  "enum": [
      +    "store",
      +    "web_portal",
      +    "app_store",
      +    "console",
      +    "own_site",
      +    "ad_network",
      +    "other"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / preview_review / properties / preferable_to_direct_link / description
      Previous value: -"Must be true only if creators benefit more than by opening the original game link"New value: +"Must be true only if influencers benefit more than by opening the original game link"
    • changedOutput schema / properties / pacts / description
      Previous value: -"Open pacts creators can request"New value: +"Open pacts influencers can request"
    • removedOutput schema / properties / platforms / items / properties / currency / description
      Removed value: -"Uppercase currency code, e.g. EUR or USD; required for a positive price"
    • removedOutput schema / properties / platforms / items / properties / currency / pattern
      Removed value: -"^[A-Z]{3}$"
    • addedOutput schema / properties / platforms / items / properties / evidence
      Added value: +{
      +  "description": "The platform's own report the studio settles with",
      +  "type": "string"
      +}
    • removedOutput schema / properties / platforms / items / properties / name / maxLength
      Removed value: -60
    • removedOutput schema / properties / platforms / items / properties / name / minLength
      Removed value: -1
    • removedOutput schema / properties / platforms / items / properties / note / description
      Removed value: -"Price conditions, subscription period or optional purchase details"
    • removedOutput schema / properties / platforms / items / properties / note / maxLength
      Removed value: -400
    • removedOutput schema / properties / platforms / items / properties / price / description
      Removed value: -"This platform's purchase price. Omit an unknown price; zero means explicitly zero, never an assumed free game"
    • removedOutput schema / properties / platforms / items / properties / price / minimum
      Removed value: -0
    • addedOutput schema / properties / platforms / items / properties / revenue
      Added value: +{
      +  "description": "declared: after a pact window the studio reports this platform's net revenue; nothing is connected",
      +  "enum": [
      +    "declared"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / platforms / items / properties / type
      Added value: +{
      +  "description": "The studio's, or read from the name and URL",
      +  "enum": [
      +    "store",
      +    "web_portal",
      +    "app_store",
      +    "console",
      +    "own_site",
      +    "ad_network",
      +    "other"
      +  ],
      +  "type": "string"
      +}
    • removedOutput schema / properties / platforms / items / properties / url / description
      Removed value: -"Public HTTPS game/store URL"
    • removedOutput schema / properties / platforms / items / properties / url / maxLength
      Removed value: -1000
    • changedOutput schema / properties / platforms / items / required
      Previous value: -[
      -  "name",
      -  "url"
      -]New value: +[
      +  "name",
      +  "url",
      +  "type",
      +  "revenue",
      +  "evidence"
      +]
  3. Changed5 schema fields changed
    • changedInput schema / properties / files / description
      Previous value: -"Optional multi-file playable version instead of html; must include index.html at the root"New value: +"Optional justified playable preview instead of html; needs index.html and preview_review. Do not adapt an online game just to host a preview"
    • changedInput schema / properties / html / description
      Previous value: -"Optional playable version hosted on FanZero, self-contained index.html, max 8 MB. Omit for an online game; list its existing platforms instead"New value: +"Original game links are the default. Add optional self-contained html only with preview_review declaring representative, sandbox-tested and preferable to direct access; max 8 MB"
    • addedInput schema / properties / preview_review
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Required for new html/files sent by an agent; all three flags must be true with an explicit reason. A declaration, not certification by static checks",
      +  "properties": {
      +    "preferable_to_direct_link": {
      +      "description": "Must be true only if creators benefit more than by opening the original game link",
      +      "type": "boolean"
      +    },
      +    "reason": {
      +      "description": "Explain that choice in 20–600 characters. It must be within the owner's authorized scope",
      +      "maxLength": 600,
      +      "type": "string"
      +    },
      +    "representative": {
      +      "description": "Must be true: this is representative of the actual game; it does not lose online/community, account, shop or ranking features",
      +      "type": "boolean"
      +    },
      +    "sandbox_tested": {
      +      "description": "Must be true only after playing this exact build successfully in the allow-scripts sandbox",
      +      "type": "boolean"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / preview_review
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "preferable_to_direct_link": {
      +          "type": "boolean"
      +        },
      +        "reason": {
      +          "type": "string"
      +        },
      +        "representative": {
      +          "type": "boolean"
      +        },
      +        "sandbox_tested": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "representative",
      +        "sandbox_tested",
      +        "preferable_to_direct_link",
      +        "reason"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Current preview declaration, if supplied. The stored build association is private; static checks do not certify the declarations"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "game_id",
      -  "slug",
      -  "title",
      -  "version",
      -  "status",
      -  "next_step",
      -  "genre",
      -  "stage",
      -  "store_url",
      -  "url",
      -  "preview_url",
      -  "has_playable",
      -  "media",
      -  "platforms",
      -  "monetization",
      -  "blocking",
      -  "notes",
      -  "critic",
      -  "curator_note",
      -  "pacts",
      -  "warnings",
      -  "updated_at"
      -]New value: +[
      +  "game_id",
      +  "slug",
      +  "title",
      +  "version",
      +  "status",
      +  "next_step",
      +  "genre",
      +  "stage",
      +  "store_url",
      +  "url",
      +  "preview_url",
      +  "has_playable",
      +  "media",
      +  "platforms",
      +  "monetization",
      +  "preview_review",
      +  "blocking",
      +  "notes",
      +  "critic",
      +  "curator_note",
      +  "pacts",
      +  "warnings",
      +  "updated_at"
      +]
  4. Changed15 schema fields changed
    • changedInput schema / properties / description / description
      Previous value: -"What it is, what is weird about it, where it is going (60-4000 chars)"New value: +"What the game is, its audience and what creators can show (60-4000 chars)"
    • changedInput schema / properties / files / description
      Previous value: -"Multi-file build instead of html; must include index.html at the root"New value: +"Optional multi-file playable version instead of html; must include index.html at the root"
    • changedInput schema / properties / html / description
      Previous value: -"The whole game as one self-contained index.html (preferred). Max 8 MB."New value: +"Optional playable version hosted on FanZero, self-contained index.html, max 8 MB. Omit for an online game; list its existing platforms instead"
    • addedInput schema / properties / media
      Added value: +{
      +  "description": "Screenshots, gameplay and trailers. At least one when no optional playable version is supplied",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Public HTTPS screenshot, gameplay or trailer URL; validated without fetching it",
      +        "maxLength": 1000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 12,
      +  "type": "array"
      +}
    • addedInput schema / properties / monetization
      Added value: +{
      +  "description": "Explain how the game earns revenue across platforms; do not guess an unknown price",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • addedInput schema / properties / platforms
      Added value: +{
      +  "description": "Where to access/buy the actual game, each with its own price/model. At least one without a build",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "currency": {
      +        "description": "Uppercase currency code, e.g. EUR or USD; required for a positive price",
      +        "pattern": "^[A-Z]{3}$",
      +        "type": "string"
      +      },
      +      "monetization": {
      +        "enum": [
      +          "paid",
      +          "free",
      +          "free_to_play",
      +          "subscription",
      +          "other"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "Price conditions, subscription period or optional purchase details",
      +        "maxLength": 400,
      +        "type": "string"
      +      },
      +      "price": {
      +        "description": "This platform's purchase price. Omit an unknown price; zero means explicitly zero, never an assumed free game",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "url": {
      +        "description": "Public HTTPS game/store URL",
      +        "maxLength": 1000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 12,
      +  "type": "array"
      +}
    • changedInput schema / properties / stage / description
      Previous value: -"Left out: prototype"New value: +"Optional. Omitted means not specified on a metadata-only listing; legacy playable submissions default to prototype"
    • changedInput schema / properties / stage / enum
      Previous value: -[
      -  "napkin",
      -  "prototype",
      -  "vertical-slice",
      -  "alpha"
      -]New value: +[
      +  "napkin",
      +  "prototype",
      +  "vertical-slice",
      +  "alpha",
      +  "beta",
      +  "released"
      +]
    • addedOutput schema / properties / has_playable
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / media
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Public HTTPS screenshot, gameplay or trailer URL; validated without fetching it",
      +        "maxLength": 1000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / monetization
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / platforms
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "currency": {
      +        "description": "Uppercase currency code, e.g. EUR or USD; required for a positive price",
      +        "pattern": "^[A-Z]{3}$",
      +        "type": "string"
      +      },
      +      "monetization": {
      +        "enum": [
      +          "paid",
      +          "free",
      +          "free_to_play",
      +          "subscription",
      +          "other"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "Price conditions, subscription period or optional purchase details",
      +        "maxLength": 400,
      +        "type": "string"
      +      },
      +      "price": {
      +        "description": "This platform's purchase price. Omit an unknown price; zero means explicitly zero, never an assumed free game",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "url": {
      +        "description": "Public HTTPS game/store URL",
      +        "maxLength": 1000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / preview_url / description
      Previous value: -"The current build, playable in a browser"New value: +"Optional playable version; null for a listing without a build"
    • changedOutput schema / properties / preview_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / required
      Previous value: -[
      -  "game_id",
      -  "slug",
      -  "title",
      -  "version",
      -  "status",
      -  "next_step",
      -  "genre",
      -  "stage",
      -  "store_url",
      -  "url",
      -  "preview_url",
      -  "blocking",
      -  "notes",
      -  "critic",
      -  "curator_note",
      -  "pacts",
      -  "warnings",
      -  "updated_at"
      -]New value: +[
      +  "game_id",
      +  "slug",
      +  "title",
      +  "version",
      +  "status",
      +  "next_step",
      +  "genre",
      +  "stage",
      +  "store_url",
      +  "url",
      +  "preview_url",
      +  "has_playable",
      +  "media",
      +  "platforms",
      +  "monetization",
      +  "blocking",
      +  "notes",
      +  "critic",
      +  "curator_note",
      +  "pacts",
      +  "warnings",
      +  "updated_at"
      +]
  5. First observed

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses that each call creates a new game, that agent html/files require preview_review with all flags true and a 20–600 character reason, and that pacts are exclusive across stores for their 2–8 week window. It also notes that an online game does not need to be ported or stripped. Some legacy-flow wording is muddy, but there is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description repeats itself: “Prefer publish_game for one-operation submission” appears twice, and the original-game listing plus the no-porting/no-adapting guidance are restated. It contains useful constraints but could be substantially tightened and better ordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter mutation with an output schema and annotations, the description covers the critical decisions: legacy versus html/files submission, publish_game alternative, update_game for existing games, preview_review requirements, and pact exclusivity. Remaining field-level details are available in the schema, so it is complete enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high at 83%, so the baseline is 3, but the description adds key meaning for preview_review flags and reason, default media/platform listing, pact exclusivity and week range, and html/files constraints. It does not explain every parameter, such as title and tagline, but the schema covers those details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states that the tool creates a new game listing and defaults to listing the original game through media and platform links rather than an html/files upload. It also distinguishes publish_game and update_game, so an agent can identify the operation. However, the opening “Legacy key flow” is jargon and the core create action is not front-loaded as plainly as possible.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent to prefer publish_game for one-operation submission and update_game for existing games, and it says check_build is optional and publication never requires adapting a game. The alternatives and conditions are named, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources