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_idis a prop’s numeric id, as returned by search.lineage_ididentifies a prop’s whole version history, andobject_ididentifies one immutable version.- Paged tools return a
next_cursor. Pass it back ascursorto get the next page, with the same other arguments. limitis always 1 to 200. Defaults are listed per tool.
Sourcing
Section titled “Sourcing”Shared filter arguments
Section titled “Shared filter arguments”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.
search_props
Section titled “search_props”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.
find_similar_props
Section titled “find_similar_props”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.
search_props_by_image
Section titled “search_props_by_image”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.
browse_facets
Section titled “browse_facets”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. |
get_prop
Section titled “get_prop”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 |
get_prop_graph
Section titled “get_prop_graph”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. |
get_prop_thumbnail
Section titled “get_prop_thumbnail”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 |
get_download_url
Section titled “get_download_url”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_atis set, the URL is presigned: fetch it with noAuthorizationheader before it expires. - When
expires_atis null (requires_auth: true), the URL is a server path such as/api/v1/blobs/<content_hash>. Resolve it againsthttps://api.prophouse.devand send your usualAuthorization: Bearerheader.
Recording the download (mark_pulled) protects the prop from permanent deletion, because someone depends on it.
whoami
Section titled “whoami”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.
Versions and check-out
Section titled “Versions and check-out”checkout_prop
Section titled “checkout_prop”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.
checkin_prop
Section titled “checkin_prop”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.
release_checkout
Section titled “release_checkout”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.
list_checkouts
Section titled “list_checkouts”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. |
get_version_history
Section titled “get_version_history”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 |
restore_version
Section titled “restore_version”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.
Reviews and comments
Section titled “Reviews and comments”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.
list_reviews
Section titled “list_reviews”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.
get_review
Section titled “get_review”Scope: read. One review round in full: reviewers and their responses, notes, attachments, mentions and the prop.
| Argument | Type | Required |
|---|---|---|
request_id |
integer | yes |
request_review
Section titled “request_review”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.
respond_to_review
Section titled “respond_to_review”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). |
update_review_request
Section titled “update_review_request”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 |
cancel_review_request
Section titled “cancel_review_request”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 |
set_review_state
Section titled “set_review_state”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. |
list_comments
Section titled “list_comments”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 |
add_comment
Section titled “add_comment”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). |
resolve_comment
Section titled “resolve_comment”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. |
get_notifications
Section titled “get_notifications”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 |
mark_notifications_read
Section titled “mark_notifications_read”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. |
watch_prop
Section titled “watch_prop”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. |
get_activity
Section titled “get_activity”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 |
Unreal imports
Section titled “Unreal imports”These tools are covered in depth, with every status and error code, in Import props into Unreal.
list_unreal_editors
Section titled “list_unreal_editors”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.
import_to_unreal
Section titled “import_to_unreal”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.
get_unreal_import
Section titled “get_unreal_import”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. |
cancel_unreal_import
Section titled “cancel_unreal_import”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.
