Skip to content

Tool reference

The Prophouse MCP server has 33 tools in four groups. Each entry lists the key scope it needs (read or write), its arguments and the errors worth handling. Error codes are explained on Errors and limits.

A few conventions apply throughout:

  • entry_id is a prop’s numeric id, as returned by search. lineage_id identifies a prop’s whole version history, and object_id identifies one immutable version.
  • Paged tools return a next_cursor. Pass it back as cursor to get the next page, with the same other arguments.
  • limit is always 1 to 200. Defaults are listed per tool.

search_props, find_similar_props, search_props_by_image and browse_facets accept the same filters. All are optional and combine with AND.

Argument Type Meaning
pack_ids integer[] Only props from these packs. Get pack ids from browse_facets.
categories string[] Only these categories (exact values).
exclude_categories string[] Leave out these categories. Uncategorized props are kept.
uncategorized boolean Include uncategorized props. Combined with categories, matches either.
tags string[] Only props carrying any of these tag names.
types string[] Entry types, for example mesh, skeletal_mesh, texture, material, blueprint, vfx, audio, animation, sequence.
review string draft, in_review, changes_requested or approved (state of the current version).
preview string Interactive 3D preview state: none, ready or unavailable.
has_collision boolean Props with (or without) collision.
nanite boolean Nanite-enabled (or not).
variant boolean Only variants (true) or only non-variants (false).
variant_group_id integer Only members of this variant group.
tri_min, tri_max integer Triangle count range.
vert_min, vert_max integer Vertex count range.
material_min, material_max integer Material slot count range.
lod_min, lod_max integer LOD count range.
bounds_min, bounds_max number Range for the largest bounding-box dimension.
include_deprecated boolean Include deprecated props (left out by default).

Range filters drop props that have no value for that metric. More on each filter in Filters and sorting.

Scope: read. Searches the library. With query, results are ranked by relevance (meaning and keywords combined, see How search works). Without query, it is a filtered browse, newest first unless you set sort.

Argument Type Required Notes
query string no Natural language. Double-quoted terms match as exact phrases.
filters no Any shared filter.
sort string no relevance, name, date_indexed, date_updated, blob_size, tri_count. Default: relevance with a query, date_indexed newest first without. relevance needs a query.
order string no asc or desc. Ignored for relevance. When you set sort without order, results are ascending.
limit integer no Default 25.
cursor string no From a previous page.

Returns props (compact rows with id, name, type, category, pack, review state, thumbnail and preview state, size, key metadata such as triangle count and bounds, and score for ranked results), count and next_cursor. Ranked results stop after 1,000 matches.

Scope: read. Ranks the library by visual similarity to an existing prop (“more like this”). Other versions and variants in the reference prop’s own history are left out.

Argument Type Required Notes
entry_id integer yes The reference prop.
filters no Any shared filter.
limit integer no Default 25.
cursor string no From a previous page.

Errors: EMBEDDINGS_UNAVAILABLE with HTTP status 409 means the reference prop has no similarity data yet (its thumbnail is still being processed, or it has none). With status 503 it means similarity search is temporarily unavailable; the error is retryable, so back off (honor details.retry_after_seconds when present) and try again later, or fall back to search_props. ENTRY_NOT_FOUND if the id does not exist.

Scope: read. Finds props that look like a reference image. Returns a single ranked page (no cursor).

Argument Type Required Notes
image_base64 string yes PNG or JPEG bytes, base64-encoded. Keep the image under about 500 KB before encoding: the whole MCP request is capped at 1 MB.
query string no Extra keyword filter (results must match it). It does not change the ranking.
filters no Any shared filter.
limit integer no Default 25.

Returns props, count and total_ranked (how many props were ranked before the limit). Errors: VALIDATION for invalid base64 or a file that is not PNG or JPEG; EMBEDDINGS_UNAVAILABLE (503) when image search is temporarily unavailable. That error is retryable: back off, then try again.

Scope: read. Counts what exists under the current filters: packs (with ids), categories, tags, types, variant split, preview states, review states, and minimum and maximum triangle, vertex, material, LOD and bounds values. Each dimension ignores its own active filter, so you still see the alternatives. Call it before searching to learn the library’s vocabulary.

Argument Type Required Notes
query string no Count only props matching this search.
filters no Any shared filter.

Scope: read. Full detail for one prop: the current version, review state, tags, collections, comments, metadata, thumbnail and preview state, and the lineage_id and object_id the versioning tools use.

Argument Type Required
entry_id integer yes

Scope: read. The prop’s dependencies (everything it needs, with sizes) or its dependents (every prop that uses it). Check dependencies before downloading and dependents before changing or removing something shared.

Argument Type Required Notes
entry_id integer yes
direction string yes dependencies or dependents.

Scope: read. Returns the prop’s thumbnail as an image (PNG, up to 512×512) the agent can look at. Props with has_thumbnail: false have none.

Argument Type Required
entry_id integer yes

Scope: read. A download URL for a prop’s current version, or for any exact version by content hash (from get_version_history or get_prop_graph).

Argument Type Required Notes
entry_id integer one of these two Download the prop’s current version.
content_hash string one of these two Download this exact version (64-character SHA-256).
mark_pulled boolean no Default true (only with entry_id). Records the download on the prop.

Returns url, expires_at, requires_auth, content_hash and, for entry_id, a suggested_filename.

  • When expires_at is set, the URL is presigned: fetch it with no Authorization header before it expires.
  • When expires_at is null (requires_auth: true), the URL is a server path such as /api/v1/blobs/<content_hash>. Resolve it against https://api.prophouse.dev and send your usual Authorization: Bearer header.

Recording the download (mark_pulled) protects the prop from permanent deletion, because someone depends on it.

Scope: read. No arguments. Returns the member the key acts as, their role and is_admin, the key’s scopes, whether this is a hosted workspace, and the server version and status. Call it once at the start of a session.

Scope: write. Checks a prop out for editing: takes an exclusive lock and returns the current version with a download URL. Calling it again while you hold the lock refreshes the lock’s expiry, which is also how an agent resumes after a crash.

Argument Type Required Notes
entry_id integer one of these two
lineage_id string one of these two
note string no Why you are editing. Shown to teammates who are blocked.
ttl_hours integer no Lock lifetime, 1 to 720. Default 72.

Returns status: "checked_out", the lock, the checkout (including object_id and content_hash of the version you start from) and download. The lock records the version you checked out as lock.base_object_id; checkin_prop fences on it. Refreshing a lock you already hold keeps the original base_object_id. If the prop’s current version has moved off it since (for example, an admin restored another version), the result includes a warning: your check-in would fail with STALE_FACE, so release the checkout, check out again and redo the edit on the current version. Errors: LOCKED when someone else holds the lock; details.holder names them.

Scope: write. Publishes a new version of a prop, or registers a new prop. See the edit loop for the full sequence.

Argument Type Required Notes
content_hash string yes SHA-256 of the new file, 64 hex characters.
blob_size integer yes Exact file size in bytes.
entry_id integer one of entry_id / new_entry The prop you are publishing a new version of.
new_entry object one of entry_id / new_entry Register a new prop instead: {name, entry_type, variant_label?}.
file_base64 string no The file inline, for small files (keep under about 500 KB; hard limit 700,000 bytes).
source_ext string no Original extension, lowercase without the dot (fbx, png, wav).
asset_name string no
origin_path string no
asset_class string no
engine_version string no
metadata object no Descriptive metadata such as tri_count or bounds_x.
pack_name string no For a new prop: the pack to put it in (created if missing).
expected_face_object_id integer no The version you expect to be current. Defaults to the version you checked out (your active lock’s base_object_id), so the check-in fails if someone else published or restored a version while you edited. Without an active checkout of your own, it defaults to the current version at check-in time.
attach_to_lineage string no Resolves decision_required: add this file to that prop’s history.
force_new_lineage boolean no Resolves decision_required: register it as a separate prop.
release_lock boolean no Release your lock after a successful check-in.

Outcomes (status):

Status Meaning
checked_in The new version is live.
no_change The bytes are identical to a version already in the library. Nothing new was published.
upload_required Upload the file using the returned upload instructions, then call checkin_prop again with the same arguments.
decision_required The file looks like a new version of an existing prop. Call again with attach_to_lineage (the returned candidate_lineage_id) or force_new_lineage: true.

Errors: LOCKED (someone else has the prop checked out; details.lock says who), STALE_FACE (the prop’s current version is no longer the one you checked out), HASH_MISMATCH (the inline file does not match content_hash), DENYLISTED (this content is blocked in your library), VALIDATION (bad hash, size mismatch, both or neither of entry_id and new_entry). Do not retry a failed check-in blindly.

Scope: write. Releases a lock without checking anything in. Only the holder or an admin can release a lock. Safe to call twice.

Argument Type Required Notes
lock_id integer one of these three
entry_id integer one of these three Releases your own active lock on this prop.
lineage_id string one of these three Same, by lineage.

Returns status: "released", or no_active_lock if you hold no lock on that prop.

Scope: read. Active checkouts across the library: who is editing what, with notes and expiry times.

Argument Type Required Notes
mine_only boolean no Only your own.
lineage_id string no Only this prop.
limit integer no Default 50.

Scope: read. Every version of a prop with its content hash, parent, publisher and timestamps, which version is current, and any active lock.

Argument Type Required
entry_id integer one of these two
lineage_id string one of these two

Scope: write. Makes an earlier version current again. Nothing is deleted; newer versions stay in the history.

Argument Type Required Notes
entry_id integer yes
object_id integer yes Must be a version of this same prop (see get_version_history).

Errors: LOCKED while someone else has the prop checked out (details.holder names them), unless you are an admin. Restoring while you hold the lock yourself is allowed, and your checkout’s base_object_id moves to the restored version. LINEAGE_CONFLICT if object_id belongs to another prop.

Tools that take member names (reviewer_names, assign_to_name, assignee_name) match exact login names, case-insensitively. An unknown name fails with USER_NOT_FOUND; an ambiguous one asks you to pass a numeric id.

Scope: read. The review queue. Start with view: "waiting_on_me".

Argument Type Required Notes
view string no waiting_on_me, requested_by_me or all.
status string no open, completed, cancelled or superseded.
limit integer no Default 25.
cursor string no

Returns reviews, next_cursor and waiting_on_me (the count waiting on you). When a row’s face_object_id differs from its object_id, the round is reviewing an older version than the current one.

Scope: read. One review round in full: reviewers and their responses, notes, attachments, mentions and the prop.

Argument Type Required
request_id integer yes

Scope: write. Opens a review round on a prop and notifies the reviewers. The prop moves to in_review immediately.

Argument Type Required Notes
entry_id integer yes
reviewer_names string[] at least one reviewer Member login names.
reviewer_ids integer[] at least one reviewer Member ids. 1 to 20 reviewers in total.
note string no @mentions in the note notify those people too.
object_id integer no Optional check: the version you expect to be current. Only the current version can be reviewed, so if the prop has moved on the call fails with CONFLICT instead of reviewing the wrong version. Omit it to use the current version.

Opening a round closes any round still open on an older version of the prop as superseded. Errors: CONFLICT when the current version already has an open round (the error includes its id), or when object_id is not the current version.

Scope: write. Your response to a round you are a reviewer on. Responding again while the round is open replaces your earlier response. When every reviewer approves, the round completes and the version is approved; any changes_requested response wins.

Argument Type Required Notes
request_id integer yes
response string yes approved or changes_requested.
note string no
assign_to_name string no Assign the follow-up work to this member (changes_requested only).

Scope: write. Adds or removes reviewers on an open round you requested (admins can change any). A round can never end up with no reviewers.

Argument Type Required
request_id integer yes
add_reviewer_names string[] no
add_reviewer_ids integer[] no
remove_reviewer_names string[] no
remove_reviewer_ids integer[] no

Scope: write. Cancels an open round you requested (admins can cancel any). If nobody had responded, the version goes back to draft; otherwise the state from the responses stays.

Argument Type Required
request_id integer yes

Scope: write. Sets a prop’s review state directly, without a round. This replaces any open round. While a prop has an assignee, only the assignee or an admin can change its state.

Argument Type Required Notes
entry_id integer yes
state string yes draft, in_review, changes_requested or approved.
assignee_name string no With in_review: who is assigned.
note string no
object_id integer no Optional check: the version you expect to be current. Only the current version’s state can be set; if the prop has moved on, the call fails with CONFLICT. Omit it to use the current version.

Scope: read. All comments on a prop, including ones pinned to specific versions (object_id), replies, resolved state, mentions and attachments.

Argument Type Required
entry_id integer yes

Scope: write. Comments on a prop. @name mentions in the body notify those members.

Argument Type Required Notes
entry_id integer yes
body string yes
object_id integer no Pin the comment to one version. Default: the prop as a whole.
parent_id integer no Reply to a top-level comment (one level of replies).

Scope: write. Marks a top-level comment resolved, or unresolved. Any member can do this.

Argument Type Required Notes
comment_id integer yes
resolved boolean no Default true. false reopens it.

Scope: read. Your inbox, newest first: review requests and responses, assignments, mentions, replies and resolutions, with the unread count.

Argument Type Required Notes
unread_only boolean no
limit integer no Default 25.
cursor string no

Scope: write. Marks notifications read in your own inbox. Pass ids, or all: true.

Argument Type Required Notes
ids integer[] one of ids / all
all boolean one of ids / all
before_id integer no With all: only notifications up to this id.

Scope: write. Follow a prop’s activity, mute it, or go back to the default. People who created a prop watch it automatically; muted stays in effect even then.

Argument Type Required Notes
entry_id integer yes
state string yes watching, muted or clear.

Scope: read. The activity feed, newest first: check-ins, locks, review changes, comments, downloads. Optionally for one prop.

Argument Type Required Notes
entry_id integer no
lineage_id string no
limit integer no Default 25.
cursor string no

These tools are covered in depth, with every status and error code, in Import props into Unreal.

Scope: read. No arguments. The Unreal editors signed in as you that checked in within the last 24 hours, whether each is ready for agent imports, and problems explaining why not. ready_projects lists the projects you can import into right now, and hint explains setup when nothing is ready.

Scope: write. Imports props, with their dependencies, into an open Unreal project and returns the object paths to place.

Argument Type Required Notes
entry_ids integer[] yes 1 to 100 prop ids.
project string no Unreal project name, case-insensitive. Optional when exactly one project is open.
target_root string no Destination folder, for example /Game/Props. Default: the editor’s configured destination root.
wait_seconds integer no 0 to 50. Default 25. How long to wait for the import to finish.

Errors: UNREAL_NOT_CONNECTED, UNREAL_PROJECT_NOT_OPEN, UNREAL_PROJECT_AMBIGUOUS, UNREAL_EDITOR_OFFLINE, AGENT_IMPORTS_DISABLED, DESKTOP_AGENT_UNAVAILABLE.

Scope: read. The current state of an import job.

Argument Type Required Notes
job_id integer yes
wait_seconds integer no 0 to 50. Default 0. Wait up to this long for the job to finish.

Scope: write. Cancels an import the editor has not started yet. Cancelling an already cancelled job does nothing.

Argument Type Required
job_id integer yes

Errors: JOB_STATE when the editor has already started the import.