Skip to main content
Glama

FanZero — indie game distribution

Update game

update_game
Destructive

Change the listing or offers; remove_preview retires a demo, keeping the original links and pact windows. Agent uploads need preview_review. Automated checks read the code without playing it. Original game links remain the default. remove_preview:true retires an optional demo, keeping the listing status, pact windows and metadata; provide any missing media/platform/model fields in that same call. It cannot be combined with html/files. Archived files and review remain for audit. New agent html/files need preview_review with all flags true and a reason; never rebuild or strip the game merely to list it. Metadata-only edits without removal go back to curator review. Passing pacts replaces open offers; accepted agreements retain terms.

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
genreNo
mediaNoScreenshots, gameplay and trailers. At least one when no optional playable version is supplied
pactsNo
stageNoOptional. Omitted means not specified on a metadata-only listing; legacy playable submissions default to prototype
titleNo
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.
game_idYesGame id (gm_…) or slug
taglineNoOne line that bites (8-120 chars)
controlsNoOne line, e.g. "Arrows or drag"
dev_noteNoA personal note from the dev to influencers
resubmitNoFor a metadata-only listing: rerun review with its current metadata
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.
descriptionNoWhat 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
remove_previewNoRetire the playable preview, preserving the valid listing/status and pact windows. No html/files in the same call

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
pact_changesYesSet when pacts were sent
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. Changed21 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 / 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"
      +]
  2. Changed6 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"
      +}
    • addedInput schema / properties / remove_preview
      Added value: +{
      +  "description": "Retire the playable preview, preserving the valid listing/status and pact windows. No html/files in the same call",
      +  "type": "boolean"
      +}
    • 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",
      -  "pact_changes"
      -]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",
      +  "pact_changes"
      +]
  3. Changed16 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"
      +}
    • addedInput schema / properties / resubmit
      Added value: +{
      +  "description": "For a metadata-only listing: rerun review with its current metadata",
      +  "type": "boolean"
      +}
    • 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",
      -  "pact_changes"
      -]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",
      +  "pact_changes"
      +]
  4. First observed

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description details exactly what survives a removal (listing status, pact windows, metadata; files and review retained for audit) and what is replaced (passing pacts replaces open offers while accepted agreements retain terms). It also discloses the review consequence of metadata-only edits and the mutual exclusion between remove_preview and html/files, which the schema does not enforce.

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

Conciseness3/5

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

The central rule (remove_preview preserves links and pact windows) is front-loaded, but the prose is dense and repetitive — remove_preview and "original links are the default" are each stated twice, and the sentences are stacked without structure for a 21-parameter tool. Little is filler, but the density makes it harder to scan than a short bulleted ordering would.

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 a 21-parameter mutation tool with nested objects, the description covers the highest-risk paths: preview retirement, agent HTML/file uploads and their review gate, and pact replacement. With an output schema present, return values need no explanation, and the remaining gaps (bulk field editing, idempotency of repeated calls) are modest against the 81% schema coverage.

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 already 81%, so the baseline is 3, but the description adds genuine meaning: remove_preview is a retire-don't-delete operation, it conflicts with html/files, and preview_review is required for new agent uploads with all three flags true. It also explains the pacts replacement semantics that the schema only hints at, though several ordinary fields (title, genre, tags, description) are left to the schema.

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 opening clause "Change the listing or offers" gives a concrete verb and resource, and the body clarifies that this covers both metadata edits and preview retirement. It does not name the neighbouring submit_game/publish_game tools, so the agent must infer that update_game is the edit path rather than the submission path.

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

Usage Guidelines4/5

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

It gives real conditional guidance: use remove_preview to retire a demo rather than deleting the listing, agent html/files require preview_review, and metadata-only edits go back to curator review. What is missing is an explicit routing statement against the siblings (submit_game, publish_game, check_build) for cases that look like an update but are not.

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