MCP server
Connect an AI agent (Claude, Cursor or any client that speaks the Model Context Protocol) and it can build a pack for you: create it, generate Blocks, 3D Models, Items, GUIs, Dialogs, Icons and Sounds, bring in files you already have, look at what came back, and try again where it's wrong.
It is the same API as the rest of this reference, with the same AI Credits, and it needs a key of its own. The difference is that the agent gets a list of tools to call instead of URLs somebody has to program against.
On every plan
MCP keys are available on every plan, the free one included, and the MCP server spends the same AI Credits Studio does. There is no separate MCP pricing.
Connect#
The server lives at https://api.resourcepack.ai/mcp and authenticates with
an MCP key from the Developers page.
MCP keys start rpai_mcp_ and only work on the MCP server, and API keys only
work on the REST API, so revoking the key you gave an agent never breaks your
own code. The wrong kind of key is refused with wrong_key_kind. (Keys made
before MCP keys existed work in both places.)
- 1
Get an MCP key
studio.resourcepack.ai/developers, the MCP keys card. Copy it straight away: it is only shown once.
- 2
Add the server to your client
In Claude Code:
claude mcp add --transport http resourcepack-ai \ https://api.resourcepack.ai/mcp \ --header "Authorization: Bearer rpai_mcp_YOUR_KEY"Any client that takes a JSON config wants this:
{ "mcpServers": { "resourcepack-ai": { "type": "http", "url": "https://api.resourcepack.ai/mcp", "headers": { "Authorization": "Bearer rpai_mcp_YOUR_KEY" } } } } - 3
Ask for something
"Make me a pack of overgrown temple blocks: mossy bricks, cracked stone and a carved idol model." The agent will create the pack, generate into it, wait for the results and show you what it made.
A key is your whole account
It can read, generate into and export every pack you own or collaborate on, and it spends your credits. An agent you connect it to can do all of that without asking. Use a key created for the purpose so you can revoke it on its own, and keep an eye on its history.
What the agent gets#
One tool per endpoint in this reference, named after it, plus one that has no HTTP equivalent. Each name below links to the endpoint it calls, where the arguments are documented in full.
| Tool | What it does |
|---|---|
list_packs | Every pack this key can reach, owned and shared. |
create_pack | Start a new pack. |
get_pack | One pack, and the oldest Minecraft version its contents load on. |
update_pack | Rename a pack, change its description, or choose whose credits it spends. Owner only. |
set_pack_icon | The pack's icon, from a picture or one of its textures. Owner only. |
duplicate_pack | A new pack holding a copy of everything in this one. |
delete_pack | Delete a pack and everything in it. Cannot be undone. |
get_account | Your AI Credits and plan limits, so an agent knows what it can afford before generating. |
get_style_guide | The pack's house style: palette, notes and reference pictures. |
set_style_guide | Change the house style every visual generation follows. Owner only. |
list_assets | What a pack holds, shaders, VFX and emotes included. Also how you recover a job handle from an earlier run. |
get_asset_file | An asset's file. An image comes back as an image, and a VFX can come back as a picture of it playing. |
rename_asset | Change an asset's label. Its id stays, so nothing breaks. |
delete_asset | Delete an asset from a pack. Free, and it cannot be undone. |
duplicate_asset | A copy of an asset in the same pack. Free. |
transfer_assets | Move or copy assets into another pack, or into a new one. Owner only. |
list_asset_versions | Every version an asset's AI edits and regenerates made. |
get_asset_version_file | One earlier version, to compare. An image comes back as an image. |
restore_asset_version | Undo: put an asset back as it was. Later versions are discarded. |
list_folders | The pack page's folders, and what is filed in each. |
create_folder | Make a folder for one tab's assets. |
update_folder | Rename or recolour a folder. |
delete_folder | Remove a folder. Its assets stay. |
file_assets | Put assets in a folder, or take them out. |
list_collaborators | Who else is in a pack, who is invited, and what each may do. Owner only. |
invite_collaborator | Invite somebody by Minecraft username or email. Owner only. |
update_collaborator | Change what a collaborator may do. Owner only. |
remove_collaborator | Take somebody out of a pack. Owner only. |
revoke_invite | Withdraw an invitation still waiting. Owner only. |
set_collaborator_notifications | Choose what you are told about collaborators' work. Owner only. |
regenerate_asset | Run a generation again, or retry a failed one. Spends credits. |
export_pack | Build the Java .zip, the Bedrock .mcpack, or the content for ItemsAdder, Nexo, Oraxen, CraftEngine or ModelEngine. Confirms it built rather than returning it. |
push_pack | Send the pack straight into Minecraft, like the Studio's Sync button. |
get_push_link | Who a push reaches, and the /rp sync code that links somebody. |
unlink_push | Stop pushes reaching the linked server. |
give_asset | Give in game: the item in the player's hands, the screen opened, the sound played, the set worn. |
get_sound | A sound's event, settings and takes. |
update_sound | Change a sound's event, category, subtitle or loop, or choose which take ships. |
get_sound_take | Hear one take before choosing it. Comes back as audio. |
copy_sound_take | Make a new sound from one take. |
delete_sound_take | Throw one take away. |
publish_pack | Publish a release every bound server hands its players. |
publish_to_gallery | Put an asset on the public gallery, with its title and description written for you if you leave them out. |
list_gallery | Browse and search what people have published to the public gallery. |
get_gallery_item | One gallery item. |
copy_from_gallery | Copy a gallery item into one of your packs. Free. |
get_distribution | What bound servers serve, how a release's build is going, and which versions it can be built for. |
update_distribution | Turn serving on or off, and choose the versions the next release is built for. |
get_distribution_stats | Players served, what their clients did with the pack, their versions, and serves per day. |
list_distribution_servers | The servers bound to a pack, and any claim code still waiting. |
bind_distribution_server | A /rp distribute code for somebody to type on their server. |
rename_distribution_server | Change the name a bound server is shown by. |
unbind_distribution_server | Stop a server handing out the pack. Cannot be undone. |
list_distribution_serves | The most recent times a server handed the pack to a player. |
list_distribution_players | Every player a bound server has handed the pack to. |
create_upload | A URL to put a file into, for anything too big to send inline. |
upload_asset | Put a file you already have into a pack: a texture, sprite, icon, model, sound, GUI, HUD or armour. Free. |
upload_reference | A reference picture for a generation to follow. |
import_pack | A whole resource pack .zip as a new pack, like the Studio's Import button. Free. |
generate_texture | A block texture. |
generate_model | A 3D model. The slow one: minutes, not seconds. |
generate_item | An item, as a flat sprite or real geometry. |
generate_gui | A container screen: chests, furnaces and the rest. |
generate_hud | The overlay drawn over the world: hearts, hunger, hotbar, crosshair. |
generate_dialog | A dialog: a server menu in Minecraft's own look, opened with /dialog. |
generate_icon | A bitmap glyph you can type into chat, signs and books. |
generate_rank_tag | A rank tag for a LuckPerms prefix or suffix, like a red OWNER badge. Done when it answers. |
generate_armor | An armour set: a reskin of a vanilla set, or 3D armour worn on the player. |
generate_sound | A sound effect. |
generate_shader | A shader: a HUD overlay (done when it answers), a 3D object in the world, or a text effect. |
generate_vfx | A VFX: an effect of glowing sprites played in the world. |
generate_emote | A player animation, played in game with /emote. Minutes, not seconds. |
create_emote_group | A movement group: a walk, run, crouch and jump of your own, worn as one. Free. |
update_emote_group | Rename a movement group, or change which emote plays in each state. |
get_model | A model's settings: its type, whether it stops vehicles, its animations. |
update_model | Whether a placed copy stops vehicles; convert it to a vehicle and back. |
export_model | One model as a resource pack of its own, for one Minecraft version. |
get_armor3d_file | A 3D armour set as a Blockbench project, or its texture. |
get_item_states | The states an item is drawn in, like a bow drawn back, and their looks. |
set_item_state | Give an item a look of its own for one state. |
list_custom_guis | A pack's Custom GUIs (MC GUI pages), and the templates to start one from. |
create_custom_gui | Make a Custom GUI, blank or from a template. |
get_custom_gui | A Custom GUI's HTML and CSS files. |
update_custom_gui | Write or remove a Custom GUI's files, or rename it. |
delete_custom_gui | Delete a Custom GUI. |
share_custom_gui | A code for /mcgui import on a server running MC GUI. |
generate_custom_gui_page | Have the AI write or rewrite one of a Custom GUI's pages. Done when it answers. |
get_vehicle | A vehicle's settings: seats, handling, hitbox, animations, sounds. |
set_vehicle | Make a model a vehicle, or change its settings. Free. |
rig_vehicle | Animate a vehicle and its riders together. Minutes, not seconds. |
edit_asset | Change something that already exists from a sentence, like the Studio's Edit with AI. Also animates a model and restyles a dialog. |
list_skins | Your player skins. |
generate_skin | A 64x64 player skin from a description. |
get_skin | One skin, and whether it's finished. |
get_skin_file | A skin's PNG. Comes back as an image. |
push_skin | Wear a skin in game now, like the skin editor's Sync. |
delete_skin | Delete a skin. |
get_job | One generation's status. Usually wait_for_job is what you want instead. |
wait_for_job | No HTTP equivalent. Waits for generations to finish, so the agent doesn't poll. |
The tools are generated from the same source as this reference and the OpenAPI document, so they take the same arguments, limits and enums. An endpoint that is switched off is left out of the list.
wait_for_job waits, so the agent doesn't poll#
Every generation is asynchronous: you get a job handle
and poll it. For an agent, each poll costs a whole turn, so wait_for_job does
the waiting on the server instead. The agent passes every handle it is waiting
on in one call and gets one answer when they have all finished.
It waits 120 seconds by default, up to 600 with timeoutSeconds. If time runs
out it says which jobs are still going and the agent calls again. Nothing is
lost or charged twice.
Files come back as files#
get_asset_file returns a generated texture, sprite or icon as an image, so
the agent can actually look at what it made before telling you it is done, and
regenerate it if it is wrong. Sounds come back as audio, models as their JSON.
Changing what's there, and what it costs#
There are three ways to change an asset, and only one is free:
| Change | Tools | AI Credits |
|---|---|---|
| By hand, from a file | upload_asset (a file you made), update_custom_gui (a Custom GUI's HTML and CSS), the settings tools (update_sound, set_vehicle, update_model, set_item_state...) | Free |
| Housekeeping | rename_asset, duplicate_asset, delete_asset, file_assets, restore_asset_version (undo an AI change) | Free |
| With AI | edit_asset, regenerate_asset, rig_vehicle, generate_custom_gui_page, every generate_* | Spends credits, at Studio's prices |
Dialogs have no hand-edit tool. A Dialog can't be uploaded or written as
JSON, so an agent changes one only through edit_asset, addressed as
texture/gui:<id>. This works on Dialogs in Minecraft's own look (Dialog
style):
mode: "edit"changes one page from a sentence ("add a Close button", "reword the title").mode: "restyle"gives one page a new look with nothing moved or reworded.pagepicks the page (the first by default).
Each call is one page and costs a flat 15 AI Credits, finished when it answers.
regenerate_asset makes a whole new Dialog at the price of generating one.
restore_asset_version puts back an earlier version for free. To move pieces,
change a button's command or fix a word without spending credits, open the
Dialog in Studio's editor.
Sending files in#
upload_asset, upload_reference and import_pack take a file in one of
four forms:
text: the file as text, such as a model's JSON the agent wrote itself.base64: the bytes inline. Fine for a 16px texture.url: a publichttpsaddress to fetch it from.upload: the id fromcreate_upload, after the bytes were PUT to the URL it returned.
Use upload for any file on disk. An agent with a shell sends the bytes
itself, so they never pass through the model:
curl -T lantern.bbmodel "<url from create_upload>"Base64 works too, but an agent writes it a token at a time, so it is slow and expensive for anything bigger than a small image.
An import runs after import_pack answers, like a generation: the agent waits on
its job (<pack>:import) with wait_for_job, and get_job then has the full
report of what came in and what was left out.
export_pack confirms the export built and how big it is, but doesn't return the
file, which is megabytes an agent has no use for. Download it over HTTP with an
API key (an MCP key is refused there):
curl -H "Authorization: Bearer $RPAI_KEY" -o pack.zip \
https://api.resourcepack.ai/v1/packs/YOUR_PACK/exportLimits and behaviour#
| Transport | Streamable HTTP. POST JSON-RPC. The server doesn't open a message stream, so a GET answers 405. |
| Sessions | None. Every request carries the key and stands alone, so a dropped connection costs nothing. |
| Rate limits | The same budgets as the REST API: 120 reads and 30 writes a minute per key. wait_for_job paces its own polling to stay inside the read budget. |
| Errors | A failed call comes back as a tool error the agent can read and act on, carrying the same stable code the REST API uses. |
| Origin check | The two origin-check endpoints are not tools. They need no key and exist for marketplaces, who are better served over HTTP. |
Tell it what you want, not how
The server gives the agent its own briefing (what a pack is, that generating
costs credits, how to tell assets apart by type), so you don't have to
explain any of it. Describe the pack you want and let it choose the calls.