Agent workflows
These are the tool sequences that cover most agent work. You can hand them to your agent as instructions, but most agents follow them on their own once connected: the server sends a short version of this guidance when the agent connects.
Tool arguments are shown as JSON. Every tool is documented in the tool reference.
Source props and download them
Section titled “Source props and download them”-
browse_facetsreturns the packs (with their ids), categories, tags and types, with counts. Use it to turn “the Medieval Village pack” into apack_idsvalue and to check which types and categories exist.{ "query": "barrel" } -
Describe what you need in plain language and narrow with filters.
{"query": "rusty metal barrel","types": ["mesh"],"tri_max": 5000,"limit": 10}Rows include triangle count, bounds, pack, review state and whether a thumbnail exists, which is often enough to choose. For more,
get_propreturns the full record andfind_similar_propsfinds look-alikes of a good hit. -
get_prop_thumbnailreturns the thumbnail as an image the agent can see. It only works for props withhas_thumbnail: true. -
get_prop_graphwithdirection: "dependencies"lists everything the prop needs (materials, textures) with sizes. -
get_download_urlreturns a URL for the current version.{ "entry_id": 1234 }If
expires_atis set, fetch the URL with noAuthorizationheader before that time. Ifexpires_atis null, the URL is a path onhttps://api.prophouse.devand needs your usualAuthorization: Bearerheader. Save it undersuggested_filename.
If the goal is to get props into an open Unreal project, skip the download and use import_to_unreal instead. It brings dependencies along and places the files correctly.
Check out, edit, check in
Section titled “Check out, edit, check in”This loop gives an agent the same safety as a person using the desktop app or Unreal plugin: nobody’s work is overwritten.
-
checkout_proplocks the prop for you and returns the version to start from.{ "entry_id": 1234, "note": "Reducing tri count for mobile" }The lock records the version you checked out as
lock.base_object_id(the same ascheckout.object_id). If the call fails withLOCKED, a teammate is editing it:details.holdersays who. Do not try to work around the lock. Tell the user, or pick another prop. -
The result includes a
downloadURL (same rules asget_download_url). Edit the file with your own tools. -
Compute the SHA-256 of the edited file (64 lowercase hex characters) and its exact size in bytes.
-
Call
checkin_propwith the hash and the size:{"entry_id": 1234,"content_hash": "<64-hex-sha256>","blob_size": 482113,"release_lock": true}The check-in fails with
STALE_FACEif the prop’s current version is no longer the one you checked out. You can passexpected_face_object_idto name the expected version yourself, but you don’t need to while you hold the checkout.For files under about 500 KB you can include the bytes as
file_base64and the check-in completes in one call. -
For larger files the first call returns
status: "upload_required"with anuploadobject:mode: "direct":PUTthe raw bytes toupload.urlwith exactly the headers inupload.headersand noAuthorizationheader. A412response means the bytes are already stored; treat it as success.mode: "server":PUTthe raw bytes toupload.url(a path onhttps://api.prophouse.dev) with your usualAuthorization: Bearerheader.
Then call
checkin_propagain with the same arguments. The result ischecked_in.
Other outcomes:
no_change: the file is byte-identical to a version that already exists. Nothing was published.decision_required: the file looks like a new version of an existing prop that lost its link to it. Call again withattach_to_lineageset to the returnedcandidate_lineage_id, orforce_new_lineage: trueto keep it separate. Ask the user if you are unsure.STALE_FACEerror: someone published or restored a different version after you checked out. Do not retry. Callrelease_checkout, thencheckout_propagain to start from the current version, reapply your change and check in again. Callingcheckout_propagain without releasing only refreshes the lock and keeps your original baseline; its result then carries awarningthat the prop has moved.
To abandon an edit, call release_checkout with the entry_id. To register a brand-new prop instead of versioning one, pass new_entry ({"name": "SM_Crate_Small", "entry_type": "mesh"}) instead of entry_id, optionally with pack_name.
Work the review queue
Section titled “Work the review queue”-
list_reviewswithview: "waiting_on_me"lists the rounds waiting for your response.get_reviewgives the details of one. -
Inspect the prop with
get_prop,get_prop_thumbnailandlist_comments. -
Respond with
respond_to_review:{"request_id": 42,"response": "changes_requested","note": "Pivot is off-center; please fix before approval.","assign_to_name": "sam"} -
Discuss with
add_comment. Mention people as@nameto notify them, and pin a comment to a specific version withobject_id.
To start a round, call request_review with the prop and one or more reviewers. get_notifications is the agent’s inbox, and mark_notifications_read clears handled items. More about the review process itself is in Reviews.
Build an environment in Unreal
Section titled “Build an environment in Unreal”An agent can dress a level from your library: find props, import them into the Unreal project you have open, then place them with an editor-side tool. This needs one-time setup in the editor, described in Import props into Unreal.
-
Find the props with
search_props(andget_prop_thumbnailto check them). Collect theirentry_idvalues. -
If you do not know the project name, or more than one project is open, call
list_unreal_editors. Itsready_projectslists the projects you can import into. -
Call
import_to_unreal:{"entry_ids": [1234, 1240, 1311],"project": "ColdStorage","target_root": "/Game/Props"}The call waits up to 25 seconds for the editor to finish. If the result says
done: false, callget_unreal_importwith thejob_idandwait_secondsuntildoneistrue. -
Each entry in
requestedhas anobject_pathsuch as/Game/Props/Meshes/SM_Crate.SM_Crate. Spawn those in the level with a tool that controls the editor, such as an Unreal MCP server or the editor’s Python API:import unrealactors = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)asset = unreal.load_asset("/Game/Props/Meshes/SM_Crate.SM_Crate")actors.spawn_actor_from_object(asset, unreal.Vector(0, 0, 0))
Prophouse’s tools get the files into the project. Placing, moving and arranging actors is up to the editor-side tool.
