Skip to main content
Glama

roblox-monetize

Windows first zero dependencies license MIT

Website and live demo: roblox-monetize.vercel.app

Stop copy-pasting game pass IDs out of Creator Hub. Tell Claude "add a VIP pass for 299 Robux" and it creates the pass on Roblox, puts it on sale, and writes the real ID into your game's config.

A Claude Code skill that creates your Roblox game passes and developer products for you and writes their real IDs straight into your game's code. No more copying IDs out of Creator Hub.

You describe the items once (name, price, description). Then you run one command, or ask Claude to "set up monetization". Every item gets created, put on sale, and wired into your config.

  • Safe to re-run: existing IDs are kept, and items with the same name are reused, never duplicated.

  • Zero dependencies: a single Node script using Roblox's official Open Cloud API.

  • Two ways to use it: a Claude skill (default) or an MCP server (optional).

Requirements

  • Windows 10/11 (also works on macOS and Linux)

  • Node.js 18 or newer

  • Claude Code

  • A Roblox experience you own (or can edit in a group)

Related MCP server: Roblox MCP Server

Install with Claude (easiest)

Copy this whole block and paste it into Claude Code. Built for Windows first; macOS and Linux work the same.

Install the roblox-monetize Claude Code skill for me from https://github.com/rpatty-dev/roblox-monetize. Do these steps in order and stop to tell me if any of them fails:

1. Check that git and Node.js 18 or newer are installed (`git --version`, `node -v`). If either is missing, tell me exactly how to install it for my operating system and wait for me.
2. Clone the repo into a folder named roblox-monetize in my home directory (if it is already there, run `git pull` in it instead).
3. In that folder run `node install.mjs --mcp`. It must print "selftest ok" and "Skill installed".
4. Walk me through creating a Roblox Open Cloud API key, one step at a time:
   create.roblox.com > Open Cloud > API Keys > Create API Key; add "game-passes" with read + write and "developer-products" with read + write for my experience; set Accepted IP Addresses to 0.0.0.0/0; save and copy the key.
   Never ask me to paste the key into this chat. Once I have copied it, tell me to type this myself (with the ! at the start), using the real path on my machine:
   ! node "<home>/.claude/skills/roblox-monetize/scripts/monetize.mjs" set-key
   That reads the key from my clipboard and stores it privately.
5. Ask me for my universe ID (the number in my Creator Hub URL after /experiences/) and run the `check` command to prove the key works.
6. Tell me to restart Claude Code, then say "set up monetization for this game" inside my game project.

Install by hand

git clone https://github.com/rpatty-dev/roblox-monetize.git
cd roblox-monetize
node install.mjs          # skill only
node install.mjs --mcp    # skill + MCP server

Run in PowerShell or cmd on Windows; the same commands work in a macOS or Linux terminal. The installer links the skill into ~/.claude/skills/roblox-monetize (a junction on Windows, no admin needed) and runs a self-test. Restart Claude Code afterwards so it picks up the skill.

One-time setup: API key

  1. Go to create.roblox.com, then Open Cloud > API Keys > Create API Key.

  2. Under Access Permissions, add:

    • game-passes, with operations read and write, for your experience

    • developer-products, with operations read and write, for your experience

  3. Under Accepted IP Addresses, enter 0.0.0.0/0 (any IP) or your own IP.

  4. Save, then copy the key.

  5. With the key still on your clipboard, run:

# Windows (PowerShell)
node "$HOME\.claude\skills\roblox-monetize\scripts\monetize.mjs" set-key
# macOS / Linux
node ~/.claude/skills/roblox-monetize/scripts/monetize.mjs set-key

It reads the key straight from the clipboard, so it never lands in a chat or your shell history. Piping also works: echo $KEY | node ... set-key.

The key is saved to ~/.config/roblox-monetize/api-key (on Windows %USERPROFILE%\.config\roblox-monetize\api-key) with owner-only permissions. You can also set it with the ROBLOX_API_KEY environment variable instead.

Check it works (the universe ID is the number in your Creator Hub URL: /experiences/<universeId>/):

node ~/.claude/skills/roblox-monetize/scripts/monetize.mjs check <universeId>

Usage

With Claude

Open your game project in Claude Code and say something like:

set up monetization for this game: a 2x cash pass for 149 and a cash pack for 49

Claude finds your ID table, writes monetization.json, shows you a dry run, creates the items and fills in the IDs.

By hand

  1. Make sure your config has a table with a zero for each item:

Config.Passes = {
	DoubleCash = 0,
}
Config.Products = {
	CashPack = 0,
}
  1. Create monetization.json (see examples/monetization.json):

{
  "universeId": 1234567890,
  "configPath": "src/shared/Config.luau",
  "items": [
    { "key": "DoubleCash", "kind": "pass", "name": "2x Cash", "price": 149, "description": "Every action pays double. Forever." },
    { "key": "CashPack", "kind": "product", "name": "Cash Pack", "price": 49, "description": "A big pile of cash, instantly." }
  ]
}
  1. Run it:

S=~/.claude/skills/roblox-monetize/scripts/monetize.mjs
node $S sync monetization.json --dry   # preview
node $S sync monetization.json         # create + write IDs

Result:

Config.Passes = {
	DoubleCash = 2070181984,
}

Spec fields

Field

Required

Notes

universeId

yes

Experience (universe) ID, not the place ID

configPath

yes

Luau file holding the ID tables, relative to the spec

passTable

no

Default Config.Passes

productTable

no

Default Config.Products

items[].key

yes

Key inside the table, e.g. DoubleCash

items[].kind

yes

pass (one-time) or product (consumable)

items[].name

yes

Shown in the purchase prompt

items[].price

yes

Whole Robux, 1 or more

items[].description

no

items[].imagePath

no

PNG/JPG icon, relative to the spec

All commands

node monetize.mjs set-key                          # save the key from the clipboard (or stdin)
node monetize.mjs check <universeId>               # test the key
node monetize.mjs list <universeId>                # list passes and products
node monetize.mjs sync <spec.json> [--dry]         # create what's missing, write IDs
node monetize.mjs create-pass <universeId> "<name>" <price> ["desc"] [icon.png]
node monetize.mjs create-product <universeId> "<name>" <price> ["desc"] [icon.png]
node monetize.mjs selftest                         # offline test

MCP tools (with --mcp)

list_monetization, create_game_pass, create_developer_product, sync_config.

Troubleshooting

Error

Fix

No API key

Do the one-time setup

401

The key was copied wrongly or revoked. Regenerate it and run set-key again

403 Scope not authorized

Edit the key: add read and write for both APIs, plus the IP list

... not found in config

Add Key = 0, to that table first

429

Rate limited. Retries happen automatically

Why

Every Roblox dev has done this: make a pass in Creator Hub, copy the ID, paste it into Config.luau, repeat ten times, typo one, wonder why the purchase prompt is broken. This makes it one sentence to Claude, and it is safe to run again whenever you add items.

If it saved you time, a star helps other devs find it.

Notes

  • Purchases only work in the published game. Inside Studio they are free test purchases.

  • Paid random items (crates, loot boxes) must show their odds before purchase, and some regions block them. Check with PolicyService:GetPolicyInfoForPlayerAsync.

  • This tool uses Roblox's Open Cloud monetization endpoints, which Roblox marks as beta.

License

MIT © rpatty-dev

Available Tools

4 tools
create_developer_productC

Create one developer product (for sale).

NameRequiredDescriptionDefault
nameYes
priceYes
imagePathNo
universeIdYes
descriptionNo

TDQS

C2.3/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It indicates a creation operation and that the product is for sale, but says nothing about permissions, side effects, validation rules, or what happens on success or failure.

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 single sentence is concise and front-loaded, but its brevity reflects under-specification rather than efficient communication. For a five-parameter mutation, more structure and detail are needed.

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

Completeness1/5

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

The definition is far too sparse for a creation tool with five parameters, no annotations, and no output schema. It leaves essential information about parameters, behavior, and usage entirely unaddressed.

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

Parameters1/5

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

Schema description coverage is 0% and the description does not explain any of the five parameters. Required fields like universeId and price, and optional fields like imagePath and description, are left entirely to the bare 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 description states a specific verb and resource: create a developer product. It is clear what the tool does, though it does not explicitly distinguish the tool from siblings like create_game_pass beyond the resource name.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as create_game_pass or list_monetization. The parenthetical '(for sale)' is the only contextual hint, and no prerequisites or exclusions are provided.

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

create_game_passC

Create one game pass (for sale).

NameRequiredDescriptionDefault
nameYes
priceYes
imagePathNo
universeIdYes
descriptionNo

TDQS

C2.2/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden, yet it only hints that the pass is purchasable ("for sale"). It says nothing about required permissions, whether the pass goes live immediately, whether creation is idempotent, or what is returned — significant gaps for a mutation tool.

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 single short sentence is front-loaded and free of padding, but it is under-specified rather than concise — brevity here costs information rather than saving it.

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

Completeness2/5

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

For a 5-parameter mutation tool with no annotations, no output schema, and zero schema description coverage, one sentence is far from sufficient. An agent cannot tell what a valid call requires beyond the field names or what happens after creation.

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

Parameters2/5

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

Schema description coverage is 0% across 5 parameters, so the description should compensate, but it adds no meaning for universeId, price, imagePath, or description. The only hint is that price relates to sale, which is already obvious from the parameter name and minimum constraint.

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

Purpose3/5

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

The description gives a clear verb+resource ("Create one game pass") which is understandable on its own, but it does nothing to differentiate from the sibling create_developer_product, and the parenthetical "(for sale)" is ambiguous rather than clarifying scope.

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

Usage Guidelines1/5

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

There is no guidance on when to use this tool versus create_developer_product or list_monetization, no prerequisites, and no stated alternatives. The agent must infer everything from the name alone.

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

list_monetizationB

List all game passes and developer products in a universe.

NameRequiredDescriptionDefault
universeIdYes

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden, and 'List all' at least implies a non-mutating, non-paginated full enumeration. However it never addresses authorization requirements, whether the two resource types come back merged or separately, or what an empty universe returns — meaningful gaps for a tool with zero annotation coverage.

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

Conciseness5/5

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

One sentence, front-loaded with the verb and scope, with no filler or redundancy. Nothing could be trimmed without losing meaning.

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

Completeness3/5

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

For a simple single-parameter read tool with no output schema, the definition is minimally adequate but leaves the agent guessing about the return shape (one combined list vs two separate collections) and about the required identifier's origin. Slightly more context would make it fully self-sufficient.

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

Parameters2/5

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

Schema description coverage is 0%, so the single universeId parameter is documented nowhere. The phrase 'in a universe' loosely maps to universeId, but the description adds no format, range, or provenance guidance (e.g. where to obtain the ID) beyond what the property name already suggests.

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 a specific verb (List) and two concrete resources (game passes, developer products) scoped to a universe, which is enough to distinguish it from the create_* siblings. It stops short of naming those siblings or contrasting behavior explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: the verb 'List' signals a read operation and the sibling names (create_game_pass, create_developer_product) make the read-vs-create split inferable. There is no explicit statement of when to prefer this tool, nor any precondition such as needing an existing universe or ownership permissions.

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

sync_configB

Create any missing passes/products and write their IDs into the game's Luau config. Idempotent. Pass specPath (monetization.json) or the fields inline. Use dryRun first.

NameRequiredDescriptionDefault
itemsNo
dryRunNo
specPathNo
passTableNo
configPathNo
universeIdNo
productTableNo

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose the key traits of idempotency and that it mutates the game's Luau config file, which is valuable. It omits what happens on partial failure, whether existing config content is preserved or overwritten, permission/auth requirements, and what is returned after creation.

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

Conciseness4/5

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

Short and front-loaded: the core action and idempotency come first, with the input-mode and dryRun notes following. Each sentence carries content, though the phrasing is clipped to the point of underspecifying the alternative input path.

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

Completeness2/5

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

For a 7-parameter mutation tool with no annotations and no output schema, the description is thin: it never explains default config location, how items and specPath interact if both are given, or what the caller gets back after IDs are written.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, and it only covers specPath, dryRun, and vaguely "fields inline." Four parameters (passTable, productTable, configPath, universeId) and the required-key structure of items (key/kind/name/price) receive no explanation anywhere.

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?

States specific verbs and resources: create missing passes/products and write their IDs into the Luau config. This distinguishes it from the pure-creation siblings by its sync/ID-writeback scope, though it doesn't explicitly name create_game_pass or create_developer_product as the single-item alternatives.

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

Usage Guidelines3/5

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

Gives a useful operating hint ("Use dryRun first") and a choice of input modes (specPath or inline fields), but never states when to prefer this bulk sync over the sibling create_game_pass/create_developer_product tools, or what preconditions (e.g., existing config file) are needed.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.0
    • First observedcreate_developer_product
    • First observedcreate_game_pass
    • First observedlist_monetization
    • First observedsync_config

TDQS

B3/5.0

Scored across 4 tools

Disambiguation4/5

List vs. create vs. sync are clearly distinct actions on the monetization domain. The one soft overlap is that sync_config also creates missing passes/products, so an agent must decide between the single-item create tools and the bulk idempotent sync, though the description's emphasis on config writing and dryRun helps differentiate them.

Naming Consistency5/5

All four tools follow a consistent verb_noun snake_case pattern: list_monetization, create_game_pass, create_developer_product, sync_config. The naming is predictable and readable throughout.

Tool Count5/5

Four tools is well-scoped for a narrow monetization-management server: one read, two granular writes, and one bulk sync. Each tool earns its place without bloat.

Completeness3/5

The surface covers listing and creation (both individually and via idempotent sync), but there is no update or delete operation for game passes or developer products, and no way to fetch or inspect a single item's details. These are notable lifecycle gaps that could leave agents unable to modify or remove existing monetization items.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers