resourcepack.ai
DOCS

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. 1

    Get an MCP key

    studio.resourcepack.ai/developers, the MCP keys card. Copy it straight away: it is only shown once.

  2. 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. 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.

ToolWhat it does
list_packsEvery pack this key can reach, owned and shared.
create_packStart a new pack.
get_packOne pack, and the oldest Minecraft version its contents load on.
update_packRename a pack, change its description, or choose whose credits it spends. Owner only.
set_pack_iconThe pack's icon, from a picture or one of its textures. Owner only.
duplicate_packA new pack holding a copy of everything in this one.
delete_packDelete a pack and everything in it. Cannot be undone.
get_accountYour AI Credits and plan limits, so an agent knows what it can afford before generating.
get_style_guideThe pack's house style: palette, notes and reference pictures.
set_style_guideChange the house style every visual generation follows. Owner only.
list_assetsWhat a pack holds, shaders, VFX and emotes included. Also how you recover a job handle from an earlier run.
get_asset_fileAn asset's file. An image comes back as an image, and a VFX can come back as a picture of it playing.
rename_assetChange an asset's label. Its id stays, so nothing breaks.
delete_assetDelete an asset from a pack. Free, and it cannot be undone.
duplicate_assetA copy of an asset in the same pack. Free.
transfer_assetsMove or copy assets into another pack, or into a new one. Owner only.
list_asset_versionsEvery version an asset's AI edits and regenerates made.
get_asset_version_fileOne earlier version, to compare. An image comes back as an image.
restore_asset_versionUndo: put an asset back as it was. Later versions are discarded.
list_foldersThe pack page's folders, and what is filed in each.
create_folderMake a folder for one tab's assets.
update_folderRename or recolour a folder.
delete_folderRemove a folder. Its assets stay.
file_assetsPut assets in a folder, or take them out.
list_collaboratorsWho else is in a pack, who is invited, and what each may do. Owner only.
invite_collaboratorInvite somebody by Minecraft username or email. Owner only.
update_collaboratorChange what a collaborator may do. Owner only.
remove_collaboratorTake somebody out of a pack. Owner only.
revoke_inviteWithdraw an invitation still waiting. Owner only.
set_collaborator_notificationsChoose what you are told about collaborators' work. Owner only.
regenerate_assetRun a generation again, or retry a failed one. Spends credits.
export_packBuild the Java .zip, the Bedrock .mcpack, or the content for ItemsAdder, Nexo, Oraxen, CraftEngine or ModelEngine. Confirms it built rather than returning it.
push_packSend the pack straight into Minecraft, like the Studio's Sync button.
get_push_linkWho a push reaches, and the /rp sync code that links somebody.
unlink_pushStop pushes reaching the linked server.
give_assetGive in game: the item in the player's hands, the screen opened, the sound played, the set worn.
get_soundA sound's event, settings and takes.
update_soundChange a sound's event, category, subtitle or loop, or choose which take ships.
get_sound_takeHear one take before choosing it. Comes back as audio.
copy_sound_takeMake a new sound from one take.
delete_sound_takeThrow one take away.
publish_packPublish a release every bound server hands its players.
publish_to_galleryPut an asset on the public gallery, with its title and description written for you if you leave them out.
list_galleryBrowse and search what people have published to the public gallery.
get_gallery_itemOne gallery item.
copy_from_galleryCopy a gallery item into one of your packs. Free.
get_distributionWhat bound servers serve, how a release's build is going, and which versions it can be built for.
update_distributionTurn serving on or off, and choose the versions the next release is built for.
get_distribution_statsPlayers served, what their clients did with the pack, their versions, and serves per day.
list_distribution_serversThe servers bound to a pack, and any claim code still waiting.
bind_distribution_serverA /rp distribute code for somebody to type on their server.
rename_distribution_serverChange the name a bound server is shown by.
unbind_distribution_serverStop a server handing out the pack. Cannot be undone.
list_distribution_servesThe most recent times a server handed the pack to a player.
list_distribution_playersEvery player a bound server has handed the pack to.
create_uploadA URL to put a file into, for anything too big to send inline.
upload_assetPut a file you already have into a pack: a texture, sprite, icon, model, sound, GUI, HUD or armour. Free.
upload_referenceA reference picture for a generation to follow.
import_packA whole resource pack .zip as a new pack, like the Studio's Import button. Free.
generate_textureA block texture.
generate_modelA 3D model. The slow one: minutes, not seconds.
generate_itemAn item, as a flat sprite or real geometry.
generate_guiA container screen: chests, furnaces and the rest.
generate_hudThe overlay drawn over the world: hearts, hunger, hotbar, crosshair.
generate_dialogA dialog: a server menu in Minecraft's own look, opened with /dialog.
generate_iconA bitmap glyph you can type into chat, signs and books.
generate_rank_tagA rank tag for a LuckPerms prefix or suffix, like a red OWNER badge. Done when it answers.
generate_armorAn armour set: a reskin of a vanilla set, or 3D armour worn on the player.
generate_soundA sound effect.
generate_shaderA shader: a HUD overlay (done when it answers), a 3D object in the world, or a text effect.
generate_vfxA VFX: an effect of glowing sprites played in the world.
generate_emoteA player animation, played in game with /emote. Minutes, not seconds.
create_emote_groupA movement group: a walk, run, crouch and jump of your own, worn as one. Free.
update_emote_groupRename a movement group, or change which emote plays in each state.
get_modelA model's settings: its type, whether it stops vehicles, its animations.
update_modelWhether a placed copy stops vehicles; convert it to a vehicle and back.
export_modelOne model as a resource pack of its own, for one Minecraft version.
get_armor3d_fileA 3D armour set as a Blockbench project, or its texture.
get_item_statesThe states an item is drawn in, like a bow drawn back, and their looks.
set_item_stateGive an item a look of its own for one state.
list_custom_guisA pack's Custom GUIs (MC GUI pages), and the templates to start one from.
create_custom_guiMake a Custom GUI, blank or from a template.
get_custom_guiA Custom GUI's HTML and CSS files.
update_custom_guiWrite or remove a Custom GUI's files, or rename it.
delete_custom_guiDelete a Custom GUI.
share_custom_guiA code for /mcgui import on a server running MC GUI.
generate_custom_gui_pageHave the AI write or rewrite one of a Custom GUI's pages. Done when it answers.
get_vehicleA vehicle's settings: seats, handling, hitbox, animations, sounds.
set_vehicleMake a model a vehicle, or change its settings. Free.
rig_vehicleAnimate a vehicle and its riders together. Minutes, not seconds.
edit_assetChange something that already exists from a sentence, like the Studio's Edit with AI. Also animates a model and restyles a dialog.
list_skinsYour player skins.
generate_skinA 64x64 player skin from a description.
get_skinOne skin, and whether it's finished.
get_skin_fileA skin's PNG. Comes back as an image.
push_skinWear a skin in game now, like the skin editor's Sync.
delete_skinDelete a skin.
get_jobOne generation's status. Usually wait_for_job is what you want instead.
wait_for_jobNo 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:

ChangeToolsAI Credits
By hand, from a fileupload_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
Housekeepingrename_asset, duplicate_asset, delete_asset, file_assets, restore_asset_version (undo an AI change)Free
With AIedit_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.
  • page picks 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 public https address to fetch it from.
  • upload: the id from create_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/export

Limits and behaviour#

TransportStreamable HTTP. POST JSON-RPC. The server doesn't open a message stream, so a GET answers 405.
SessionsNone. Every request carries the key and stands alone, so a dropped connection costs nothing.
Rate limitsThe 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.
ErrorsA 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 checkThe 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.