Koskamo

spawnpop MCP

An MCP server that allows AI agents to generate Roblox game assets including GUI sets, icons, thumbnails, 3D props, and music. It plans asset kits from text descriptions, handles credit-based pricing, and provides signed download links for integration with Roblox Studio.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

spawnpop MCP logo, by spawnpopCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by spawnpop
You need:A key is created after a first credit purchase, because a key is how an agent spends credits.Keys are stored hashed, so a lost key cannot be shown again; create a new one.
MCP endpoint (Streamable HTTP)
https://spawnpop.com/mcp
Vendor documentation

What you can do with it

  • Plan a complete asset kit from a one-sentence game description
  • Generate GUI sets, icons, and thumbnails for Roblox experiences
  • Create 3D props and music assets for game development
  • Integrate generated assets into Roblox Studio via MCP

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
spawnpop 1.0.0
MCP protocol
2025-06-18
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

spawnpop makes Roblox game assets (GUI, icons, thumbnail, 3D props, music) for you to place with Roblox Studio MCP. Workflow: 1. plan_kit(description): free, returns items and their credit price. Works without a key; with a key it saves a project. 2. draft(projectId, itemIds, confirmCredits, requestId): 13 credits per draft image, each with an AI fit verdict. 3. approve(projectId, approvals): pick the drafts that fit. No charge. 4. generate(projectId, "approved", confirmCredits, requestId): final assets from the approved drafts. A GUI set is the sliced kit plus one finished, populated screen in the kit look: they are bought together (the price of the screen is in plan_kit and in the total); options.iconStyle picks the game icon look when styles are listed. 5. get_status(projectId, waitSeconds=25): repeat until done. No need to poll faster. 6. get_files(projectId): signed URLs plus the exact next calls for Roblox Studio MCP (upload_image, execute_luau). 7. Sprite sheets: generate_sprite_sheet(description, style, extras, confirmCredits, requestId) draws one character with idle, run and attack animations; get_sprite_status(runId, waitSeconds=25) returns the download links. Without a key it only quotes the price and links the user to the browser preview. 8. Starting from an idea: game_concept(genre, artStyle, target, idea) writes a game spec at no charge (game_spec.json, GAME_SPEC.md, AGENTS.md, PROMPT.md) for you to build from; record progress with update_state(specId, patch) (state only, never the intent); get_spec(specId) reads it back; asset_kit(specId) quotes the matching kit and returns a projectId for draft/generate. Money: confirmCredits must equal the price you showed the user. A retry with the same requestId never charges twice. If a call returns insufficient_credits, show the user payUrl and wait; after they pay, retry the same call. Never ask the user to paste a Roblox API key into chat; Open Cloud keys belong in their own shell.

Tools

13 advertised

plan_kit — Plan a Roblox asset kit
Advertised by the server during the last successful anonymous check.

No charge. Turns a one-sentence game idea into a priced kit (GUI, icons, thumbnail, 3D props, music). With an API key the plan is saved as a project; without one you get the same plan and price plus a link for the user to connect.

plan_kit input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "description"
  ],
  "properties": {
    "genre": {
      "enum": [
        "simulator",
        "tycoon",
        "tower_defense",
        "obby",
        "rng",
        "horror",
        "roleplay",
        "fighting"
      ],
      "type": "string"
    },
    "style": {
      "type": "string",
      "maxLength": 300,
      "description": "Art direction, e.g. \"chunky pastel cartoon\"."
    },
    "description": {
      "type": "string",
      "maxLength": 500,
      "minLength": 3,
      "description": "The game idea in plain words."
    }
  }
}
plan_kit annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
draft — Draft items cheaply
Advertised by the server during the last successful anonymous check.

Costs 13 credits per draft image. Makes low-cost previews with an AI fit check so finals are only bought for what works. confirmCredits must equal the price (items x copies x variants); requestId makes a retry free.

draft input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectId",
    "itemIds",
    "confirmCredits",
    "requestId"
  ],
  "properties": {
    "itemIds": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 64,
        "minLength": 1
      },
      "maxItems": 40,
      "minItems": 1
    },
    "variants": {
      "anyOf": [
        {
          "type": "number",
          "const": 1
        },
        {
          "type": "number",
          "const": 4
        }
      ],
      "default": 1
    },
    "projectId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "requestId": {
      "type": "string",
      "pattern": "^[\\w-]+$",
      "maxLength": 64,
      "minLength": 8
    },
    "confirmCredits": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0
    }
  }
}
draft annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
approve — Approve drafts
Advertised by the server during the last successful anonymous check.

No charge. Marks one draft per item copy as the reference its final is made from. Use the outputId shown by get_status.

approve input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectId",
    "approvals"
  ],
  "properties": {
    "approvals": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "itemId",
          "outputId"
        ],
        "properties": {
          "copy": {
            "type": "integer",
            "default": 0,
            "maximum": 49,
            "minimum": 0
          },
          "itemId": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          },
          "outputId": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          }
        }
      },
      "maxItems": 40,
      "minItems": 1
    },
    "projectId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    }
  }
}
approve annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate — Generate final assets
Advertised by the server during the last successful anonymous check.

Spends credits. confirmCredits must equal the price of the items; if the price changed nothing is charged and price_changed comes back. Credits paid for an item's draft count toward that item's final (draft + final = the quoted price): confirming the plan_kit price is accepted and only the lower remaining price is charged. The same requestId returns the same jobs and charges nothing. itemIds may be "approved".

generate input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectId",
    "itemIds",
    "confirmCredits",
    "requestId"
  ],
  "properties": {
    "itemIds": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          },
          "maxItems": 40,
          "minItems": 1
        },
        {
          "type": "string",
          "const": "approved"
        }
      ]
    },
    "options": {
      "type": "object",
      "properties": {
        "iconStyle": {
          "enum": [
            "avatar_3d",
            "cartoon"
          ],
          "type": "string"
        }
      },
      "description": "iconStyle: the game icon look when plan_kit listed styles.gameIcon."
    },
    "projectId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "requestId": {
      "type": "string",
      "pattern": "^[\\w-]+$",
      "maxLength": 64,
      "minLength": 8
    },
    "confirmCredits": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0
    }
  }
}
generate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_status — Project status
Advertised by the server during the last successful anonymous check.
Advertised read-only

No charge. One row per plan item, drafts with the AI fit verdict (fit, misfit, unjudged or pending; unjudged never blocks approve), approvals and balance. waitSeconds (0-25) returns as soon as something changes, so a call can come back earlier than that.

get_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectId"
  ],
  "properties": {
    "projectId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "waitSeconds": {
      "type": "integer",
      "default": 0,
      "maximum": 25,
      "minimum": 0
    }
  }
}
get_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_files — Finished files
Advertised by the server during the last successful anonymous check.
Advertised read-only

No charge. Finished files with one-hour signed download URLs, sizes, triangle counts and stud sizes, plus a ready next-step block for Roblox Studio MCP and Open Cloud.

get_files input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectId"
  ],
  "properties": {
    "projectId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    }
  }
}
get_files annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_projects — List projects
Advertised by the server during the last successful anonymous check.
Advertised read-only

No charge. Your recent projects, newest first.

list_projects input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1
    }
  }
}
list_projects annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_sprite_sheet — Generate a game sprite sheet
Advertised by the server during the last successful anonymous check.

Spends credits (180, plus 50 for each extra animation, at most 2). Draws one character from a description in a chosen style with idle, run and attack animations and delivers the sheet, GIFs, frames and JSON via get_sprite_status. confirmCredits must equal the price; the same requestId returns the same order and charges nothing. Only one paid sprite order is open per account at a time. Without an API key nothing is spent: you get the price and links for the user.

generate_sprite_sheet input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "description",
    "style"
  ],
  "properties": {
    "style": {
      "enum": [
        "pixel",
        "cartoon",
        "painted"
      ],
      "type": "string"
    },
    "extras": {
      "type": "array",
      "items": {
        "enum": [
          "walk",
          "jump",
          "hurt",
          "death"
        ],
        "type": "string"
      },
      "default": [],
      "maxItems": 2
    },
    "fromRunId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1,
      "description": "A finished web preview of the same character: keeps its character and idle sheet, so only the rest is drawn."
    },
    "requestId": {
      "type": "string",
      "pattern": "^[\\w-]+$",
      "maxLength": 64,
      "minLength": 8,
      "description": "Required with an API key. A new one for each new purchase, the same one to retry."
    },
    "description": {
      "type": "string",
      "maxLength": 300,
      "minLength": 3
    },
    "confirmCredits": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "The exact price you showed the user. Required with an API key."
    }
  }
}
generate_sprite_sheet annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_sprite_status — Sprite sheet status
Advertised by the server during the last successful anonymous check.
Advertised read-only

No charge. Progress of a sprite sheet order. When it is done: signed one-hour download links for the sprite sheet PNG, one GIF per animation, a frames zip, the sheet JSON and the character. waitSeconds (0-25) returns as soon as something changes, so a call can come back earlier than that.

get_sprite_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "runId"
  ],
  "properties": {
    "runId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "waitSeconds": {
      "type": "integer",
      "default": 0,
      "maximum": 25,
      "minimum": 0
    }
  }
}
get_sprite_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
game_concept — Write a game spec from an idea
Advertised by the server during the last successful anonymous check.

No charge. Turns a genre preset, an art-style preset and a one-line idea into a short game spec your coding agent can build from: intent (frozen), plan (milestones with testable done_when, playtest, asset manifest) and state (you update it with update_state). Returns game_spec.json plus GAME_SPEC.md, AGENTS.md and PROMPT.md to save in the project. Names of existing games, characters and brands are removed: specs are original games only. With an API key the spec is saved (specId) for get_spec, update_state and asset_kit.

game_concept input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "genre",
    "artStyle",
    "idea"
  ],
  "properties": {
    "idea": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "One sentence in your own words. No \"like <existing game>\"."
    },
    "genre": {
      "enum": [
        "obby",
        "simulator",
        "survivors",
        "cozy",
        "rpg",
        "voxel",
        "coop"
      ],
      "type": "string",
      "description": "obby | simulator (also tycoon) | survivors (horde) | cozy (one-verb 3D toy) | rpg | voxel (city builder) | coop (two players)"
    },
    "target": {
      "enum": [
        "roblox",
        "web"
      ],
      "type": "string",
      "default": "roblox",
      "description": "roblox, or web (a single-page three.js game)"
    },
    "artStyle": {
      "enum": [
        "low_poly",
        "cartoon",
        "voxel",
        "pixel",
        "watercolor",
        "ink_wash",
        "neon"
      ],
      "type": "string"
    }
  }
}
game_concept annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_spec — Read a saved game spec
Advertised by the server during the last successful anonymous check.
Advertised read-only

No charge. The saved spec (all three layers) and its handoff files. Without specId, lists your recent specs.

get_spec input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "specId": {
      "type": "string",
      "pattern": "^[a-z0-9]{8,32}$"
    }
  }
}
get_spec annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_state — Record build progress
Advertised by the server during the last successful anonymous check.

No charge. Updates ONLY the STATE layer of a saved spec: milestone_status ({milestoneId: todo|doing|done|blocked}), built (lines appended) and notes (appended). The intent and the plan cannot be changed here; if the intent looks wrong, ask the human.

update_state input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "specId",
    "patch"
  ],
  "properties": {
    "patch": {
      "description": "{ milestone_status?, built?, notes? }"
    },
    "specId": {
      "type": "string",
      "pattern": "^[a-z0-9]{8,32}$"
    }
  }
}
update_state annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
asset_kit — Quote the matching asset kit
Advertised by the server during the last successful anonymous check.

No charge here. Plans the assets a saved spec needs (GUI set with its finished screen, icons, thumbnail, props, music) in the spec's style and returns one total in credits plus a kit projectId. Show the user the total; then draft/approve/generate on that projectId exactly as after plan_kit (generate takes confirmCredits). The kit zip includes the spec files. Calling it again returns the same project.

asset_kit input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "specId"
  ],
  "properties": {
    "specId": {
      "type": "string",
      "pattern": "^[a-z0-9]{8,32}$"
    }
  }
}
asset_kit annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1078 ms
95th percentile latency
1078 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1078 ms · metadata changed · 13 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http spawnpop-mcp https://spawnpop.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add spawnpop-mcp --url https://spawnpop.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable spawnpop-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "spawnpop-mcp": {
      "url": "https://spawnpop.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "spawnpop-mcp": {
      "type": "streamableHttp",
      "url": "https://spawnpop.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start spawnpop-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "spawnpop-mcp": {
      "type": "http",
      "url": "https://spawnpop.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http spawnpop-mcp https://spawnpop.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "spawnpop-mcp": {
      "url": "https://spawnpop.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "spawnpop-mcp": {
      "serverUrl": "https://spawnpop.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like spawnpop MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.