Pixly
Server Details
Every visual AI tool for property listings — staging, enhancement, decluttering, cinematic video.
- Status
- Healthy
- Uptime
- 99.8% over 76 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 35 tools
Most tools have a sharply defined, single purpose (day_to_night, replace_sky, replace_lawn, reset_season, remove_furniture vs declutter_photo are explicitly contrasted). A few areas overlap — enhance_photo vs touch_up_exterior, and edit_staged_photo vs restyle_room — but the descriptions do the work of separating them (touch_up is one-click auto, enhance gives 3 variants; edit_staged swaps one thing, restyle refaces surfaces). Overall an agent can select correctly with the descriptions.
Names are uniformly lowercase snake_case, which is a strong consistent baseline. The verbs vary (replace_, reset_, restyle_, render_, plot_, upscale_, watermark_) and a few read as phrases (day_to_night, before_after_image), but nothing mixes camelCase or casing, so the pattern is predictable enough to scan.
35 tools is heavy for a single server and well above the 3-15 sweet spot, so the surface is broad and takes effort to scan. Each tool does map to a genuinely distinct editing/generation operation, so it is defensible, but the count sits at the borderline-heavy end rather than feeling tightly scoped.
Coverage is strong: full lifecycle for listings (create/list/update), upload paths (ticket and URL), generation, editing, video, floor plans, job polling, credits/billing, and inspection via view_pixly_photo. The main gap is deletion/cleanup — no delete_listing or remove-from-library tool — plus no explicit export/download, but core workflows have no dead ends.
Available Tools
35 toolsbefore_after_imageBefore & After ImageAInspect
Free (no credits): one comparison image from a before and an after photo of the same place — e.g. an empty room and its virtual staging, a daylight shot and its dusk version, a room before and after a restyle. Side by side, stacked, or split by a line; original shape, square, 4:5 or 9:16. Write the labels in the user's language. Returns a finished image at once.
| Name | Required | Description | Default |
|---|---|---|---|
| aspect | No | Shape of the image: original (follows the photos), 1:1 square, 4:5 Instagram post, 9:16 Stories/Reels. | original |
| labels | No | Show the Before / After labels. | |
| layout | No | side = next to each other, stack = one above the other, vsplit = one frame split by a vertical line, diagonal = split by a slanted line. | side |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| afterLabel | No | Label text for the after photo, in the user's language (default "After"). | |
| afterR2Path | No | Storage path of the after photo — the alternative to afterImageUrl. | |
| beforeLabel | No | Label text for the before photo, in the user's language (default "Before"). | |
| beforeR2Path | No | Storage path of the before photo — the alternative to beforeImageUrl. For a Pixly result, its original photo is the job's source. | |
| afterImageUrl | No | The AFTER photo (e.g. the staged room, the dusk version). Public https URL or data: URI; or afterR2Path. | |
| beforeImageUrl | No | The BEFORE photo (e.g. the empty room, the daylight shot). Public https URL or data: URI; or beforeR2Path. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive, open-world behavior. The description adds two useful facts beyond them: it is credit-free, and it returns synchronously ('Returns a finished image at once'), which tells the agent not to poll for a job. It stops short of stating whether repeated calls produce new artifacts, which the non-idempotent hint would make relevant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One densely packed sentence, front-loaded with the most decision-relevant token ('Free (no credits)') and closing with the output/timing statement. Every clause carries information, though the enumeration of examples and layout/aspect forms duplicates schema enums and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, 100% schema coverage, an output schema present, and annotations covering the safety profile, the description supplies what structured fields cannot: the free-of-cost condition, the synchronous return, and the paired-photo premise. Nothing essential for correct invocation is missing; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds genuine semantics beyond the schema: it declares the implicit requirement of a before/after pair of the same place (which 0-required-parameter schema does not enforce) and reiterates the label-language rule. The layout and aspect options it mentions ('side by side, stacked, or split by a line; original shape, square, 4:5 or 9:16') map to enum values already documented, so the added value sits mainly in the input-pairing constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and artifact: it produces 'one comparison image from a before and an after photo of the same place', backed by three concrete example pairs (empty room/staged, daylight/dusk, before/after restyle). It also names the output medium ('a finished image at once'), which implicitly separates it from the sibling before_after_reel. An agent can identify the resource and result type without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives rich when-to-use context in the form of scenario examples ('an empty room and its virtual staging', 'a daylight shot and its dusk version') and flags a cost condition ('Free (no credits)'). However, it never states when to choose this over alternatives like before_after_reel or day_to_night, nor any exclusions or prerequisites, so selection guidance is contextual rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
before_after_reelBefore & After VideoAInspect
Before and after video: animate a before→after transformation (e.g. empty room → staged, or a renovation, or a daylight photo → its Day to Night version with videoIntent day_to_night) into a social-ready reveal reel from two photos. Both photos are required. Only have one? Make the other first with a photo tool — virtual_staging (empty room → furnished), remove_furniture (furnished → empty), day_to_night, restyle_room, makeover_exterior and the other edit tools — and pass its result as afterImageUrl (or beforeImageUrl). Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Video shape. original (default) keeps the photos' own shape; 9:16, 16:9 or 1:1 crop both photos, centred, to that shape first. | original |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| afterR2Path | No | R2 path of the end frame — the alternative to afterImageUrl. | |
| revealStyle | No | How the transformation is revealed | smooth |
| videoIntent | No | staging_reveal: an empty room becoming a furnished one (or a renovation). day_to_night: Before is a daylight photo and After its dusk version (a Pixly Day to Night result and its original) — the video turns day into the lit evening; revealStyle does not apply. | staging_reveal |
| beforeR2Path | No | R2 path of the start frame — the alternative to beforeImageUrl. | |
| afterImageUrl | No | End frame (e.g. the staged result) — https URL or data: URI | |
| beforeImageUrl | No | Start frame (e.g. the empty room photo) — https URL or data: URI | |
| durationSeconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false). The description adds genuinely useful context beyond them: both photos are required, credits are deducted from the Pixly balance, and that revealStyle is ignored when videoIntent=day_to_night. It does not mention persistence or job/async behaviour, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first clause, then the requirement and the fallback workflow. The long tool-list sentence is dense but earns its place as actionable routing. Slightly heavy, but nothing is truly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers inputs, cost, and the one-photo workaround. The only mild gap is durationSeconds, which has no described meaning in either the schema or the description, and no mention of synchronous vs. job-based completion for a paid video render.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the baseline is 3. The description adds meaning above the schema by clarifying the before/after position convention for day_to_night (Before = daylight, After = its dusk version) and by linking beforeImageUrl/afterImageUrl to the output of specific photo tools, which is not stated in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (animate) and resource (a social-ready reveal reel from two photos), with concrete examples of the transformation (empty room → staged, renovation, daylight → Day to Night). This clearly distinguishes it from the sibling before_after_image (image vs. video) without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Goes beyond stating what it does: it declares both photos are required and, for the one-photo case, names the exact alternative tools (virtual_staging, remove_furniture, day_to_night, restyle_room, makeover_exterior) and where to pass their output (afterImageUrl or beforeImageUrl). This is explicit when/how-to-chain guidance an agent can act on directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blur_faces_platesBlur Faces & PlatesAInspect
Free (no credits): find and blur people's faces and car licence plates in property photos before they're posted — street and exterior shots, open houses. Automatic detection, 1–5 photos per call. Says so when nothing is found.
| Name | Required | Description | Default |
|---|---|---|---|
| faces | No | ||
| style | No | blur | |
| photos | Yes | The photos, 1–5. Each item takes imageUrl or r2Path. | |
| plates | No | ||
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish non-read-only, non-destructive behavior; the description usefully adds that it costs no credits, is fully automatic, caps at 1–5 photos per call, and reports when nothing is detected. It does not clarify that output is a new asset or how results relate to the source photo, which would matter for a non-idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key qualifier 'Free (no credits)' and packs cost, scope, and the failure-report behavior into one dense sentence with no filler. Slightly run-on but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers cost, batch size, detection targets, and the no-detection edge case. It leaves the style and listingId parameters unaddressed, a minor gap for a 5-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, so the description must carry weight; it confirms the 1–5 batch limit and the faces/plates targets, but ignores the style (blur vs pixelate) enum behavior and the listingId placement semantics. Baseline 3 is appropriate given partial schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (find and blur) and resources (people's faces, car licence plates) with the domain (property photos) and scenarios (street/exterior shots, open houses). This clearly separates it from siblings like watermark_photos or declutter_photo without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use before photos are posted, for street and exterior shots and open houses. It does not name any alternative tool or state when not to use it (e.g., versus watermark_photos), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinematic_motionCinematic MotionAInspect
Photo to video: turn a single listing photo into a short cinematic real estate video with a professional camera move (zoom, orbit, fly-through, crane up…). No second frame needed. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Video shape. original (default) keeps the photo's own shape; 9:16 or 16:9 crop the photo, centred, to that shape before it is animated. | original |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| direction | No | The direction the camera travels, for the moves that have one (orbit, pan, drone-orbit). 'left-to-right' sends the camera rightward, 'right-to-left' leftward. Ignored by every other move; omit to use the move's own default. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| cameraMove | No | Camera-move preset | zoom |
| durationSeconds | No | Clip length in seconds. Leave out for the default 5 s; 10 s costs about twice as much — use it only when the user asks for a longer video. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the write/non-repeatable nature is known. The description adds one genuinely useful non-annotation fact — that the call consumes credits from the user's Pixly balance — but says nothing about synchronous vs. job-based execution even though a get_job sibling exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that lead with the transformation and the key differentiator (single photo, no second frame), then append the cost note. No filler, though the parenthetical example list is slightly redundant with the enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present, return values need no explanation, and the cost warning plus the single-image constraint cover most agent needs. The one real gap is execution model — whether the result is immediate or must be polled via get_job — for a tool annotated as non-idempotent and open-world.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents format, direction, listingId, duration and the imageUrl/r2Path choice, making 3 the baseline. The description only echoes the camera-move family ("zoom, orbit, fly-through, crane up"), adding no syntax or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: turns one listing photo into a short cinematic video via a named camera move, with example moves matching the cameraMove enum. The phrase "No second frame needed" implicitly separates it from the before/after tools, but it never names or differentiates itself from the closest siblings photo_to_video and flythrough_video.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"No second frame needed" gives implied guidance that this is the single-image path versus the before/after siblings, and the durationSeconds text states when to pick 10 s ("only when the user asks for a longer video"). However, nothing tells the agent when to choose this over photo_to_video or flythrough_video, which is the actual ambiguity among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_listingNew Property FolderAInspect
Create a property folder before work on a whole property (a set of listing photos, a walkthrough). Ask the user once which property it is and pass that as title; if they skip, leave title out. Pass the returned listingId to the tools so their results land in it. Costs nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The property in the user's words, e.g. "12 Oak St" — leave out if they skipped the question |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=false, idempotentHint=false, and destructiveHint=false. The description adds two useful facts beyond the annotations: the operation costs nothing, and the returned listingId must be threaded into later calls. It does not restate safety traits, which is appropriate, though it could clarify non-idempotency explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each earning its place: purpose, title handling, downstream linking, and cost. The most important guidance is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description covers the critical return value ('listingId') and how to use it. Combined with the single optional parameter and full schema coverage, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning: ask the user once for the property name, pass their words as title, and omit it if they skip. This is more than the schema's example and directly guides correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a property folder') and clarifies scope with examples ('a set of listing photos, a walkthrough'), distinguishing it from per-image sibling tools. An agent can immediately tell this is the container-setup step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it ('before work on a whole property'), how to handle the optional title (ask once; omit if skipped), and what to do next ('Pass the returned listingId to the tools'). This is a complete usage recipe with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upload_ticketUpload a Local PhotoAInspect
Get a presigned upload URL for a LOCAL image file — the one case a URL can't cover. PUT the file to uploadUrl with the same Content-Type, then pass the returned r2Path to a generation tool instead of imageUrl. Ticket expires in 1 hour.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Original filename, used for the extension | |
| sizeBytes | No | Exact byte size of the file. Recommended: when given it is signed into the URL, so the upload is bounded server-side. | |
| contentType | Yes | MIME type the PUT request will send |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-destructive, non-idempotent, closed-world), so the description rightly spends its words on behavior the annotations can't convey: the PUT contract ('same Content-Type'), the 1-hour ticket expiry, and the r2Path hand-off. That is substantive operational context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the purpose and the LOCAL constraint before the mechanics. Every clause carries information — no filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by naming the returned fields (uploadUrl, r2Path) and the full client workflow. Combined with the schema and annotations, an agent has everything needed to call it and use the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents filename, sizeBytes, and contentType with enum values. The description adds only the Content-Type-must-match-PUT note and the existence of uploadUrl/r2Path; baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get a presigned upload URL') and immediately scopes it to 'a LOCAL image file — the one case a URL can't cover', which cleanly separates it from upload_image_from_url. An agent can pick this tool over its sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use condition (local file, not a URL) and a downstream routing instruction ('pass the returned r2Path to a generation tool instead of imageUrl'). The alternative upload_image_from_url is implied by the URL contrast rather than named explicitly, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
day_to_nightDay to NightAInspect
Day to dusk (virtual twilight): turn a daytime listing photo into a magazine-style evening scene — lights on, warm glow, dusk sky — with the building and camera angle unchanged. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-read-only, non-idempotent, non-destructive, open-world). The description adds genuinely useful context beyond them: the operation consumes credits from the user's Pixly balance, and the output preserves the building and camera angle. It does not state whether the source image is left intact or what happens on repeated calls, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the transformation and its alias (virtual twilight), followed by the visual effects and then the credit cost. Two sentences with no filler; the em-dash effect list is dense but each item earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the mutation/safety profile. The description supplies the cost behavior and output constraints an agent needs to decide and call correctly; only the treatment of the original image and failure/credit-refund behavior are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so r2Path, imageUrl, and listingId are fully documented in the schema, including the either/or requirement. The description adds no parameter-level detail, which is the expected baseline when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific transformation verb and resource: turn a daytime listing photo into an evening/dusk scene, with concrete visual outcomes (lights on, warm glow, dusk sky) and a preserved constraint (building and camera angle unchanged). It is clearly distinguishable in substance from siblings like replace_sky or reset_season, though it never names a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the usage context (a daytime listing photo) but gives no explicit when-to-use/when-not-to-use and names no alternatives among the many photo-transformation siblings (replace_sky, reset_season, enhance_photo). The agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declutter_photoDeclutterAInspect
Remove clutter, mess, and personal items from a listing photo while keeping the room, furniture, and architecture intact. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this mutates state, is not idempotent, and is non-destructive; the description adds the material detail that it consumes credits from the user's Pixly balance, which annotations cannot express. It does not say whether repeated calls re-charge credits or what happens to untouched regions, so it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste: function and scope first, then the cost consequence. Nothing padded or repeated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the credit-cost caveat covers the main behavioral risk. A gentle note on credit exhaustion failure behavior is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters are documented there, including the r2Path/imageUrl alternative. The description adds no meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('remove clutter, mess, and personal items') plus resource (a listing photo) with a stated scope constraint: keep room, furniture, and architecture intact. That constraint helps separate it from siblings like remove_furniture or restyle_room, though those tools are never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear from 'listing photo', but there is no explicit when-to-use or when-not guidance and no mention of the obvious alternatives (remove_furniture, edit_staged_photo, restyle_room) that an agent must choose between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_floor_planDraw Floor PlanAInspect
Free (no credits): draw a clean 2D floor plan from a layout YOU write — read the user's description, or look at their hand sketch or brochure plan, and send every room as a rectangle in metres (or feet) plus doors and windows. Returns the drawn plan (areas and dimensions on it) at once, saved so the user can fine-tune it in Pixly's floor plan editor. If the layout has problems (overlapping rooms, a door between rooms that don't touch) you get exactly what to fix — fix it and call again. To change a plan, call again with its planId and the whole updated layout; the new version is saved as its own plan and the earlier one is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| doors | No | ||
| rooms | Yes | Every room as an axis-aligned rectangle. Neighbouring rooms must share the wall exactly (one's right edge = the other's left edge) and must not overlap. An L-shaped space = two rectangles joined by a doorway. Lay out a typical sensible plan when the user gives only rough sizes. | |
| title | No | Address or listing name for the plan's title block. | |
| units | No | Units of every number below, and of the labels on the plan. | m |
| planId | No | To CHANGE a plan you drew before: its planId from that result, with the whole updated layout — saved as a new plan beside it (nothing is overwritten). Omit for a new plan. | |
| windows | No | ||
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=false, destructive=false), the description discloses cost (free, no credits), that a validated result is returned in one shot, that invalid layouts return exactly what to fix with a retry instruction, and the versioning behaviour (a changed plan is saved as its own plan and the earlier one is kept). This is precisely the contextual detail the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The free/cost point and the core action are front-loaded, and the retry loop and versioning details follow logically. Sentence three and four are long compound constructions that could be split, but every sentence carries distinct information with no obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter creation tool with an output schema present, the description covers the action, the input-authoring model, the failure/retry contract, the save destination, and the update semantics. Return-value detail is correctly left to the output schema, and nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 71% and the nested schema is already highly descriptive (wall-sharing rules, L-shape guidance, planId change semantics, units). The description restates the essentials ('every room as a rectangle in metres (or feet) plus doors and windows', 'the whole updated layout') without adding syntax or constraints the schema does not already state, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb + resource ('draw a clean 2D floor plan') and immediately clarifies the distinctive input model: the agent writes the layout itself rather than the tool deriving it from photos. The '2D' qualifier and 'Free (no credits)' framing implicitly separate it from photorealistic sibling renders like render_floor_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context: read the user's description, or work from their hand sketch or brochure plan. It also states the re-invocation rule ('To change a plan, call again with its planId'). It never explicitly names an alternative sibling (e.g. render_floor_plan) or states when not to use this tool, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_staged_photoEdit PhotoAInspect
Change one thing in a photo and keep everything else exactly as it is — the parts the edit doesn't touch are copied from the photo, not redrawn. Works on any photo: a staged room, any Pixly result, or the user's own picture (swap the sofa, recolour a wall, remove a car, change the words on a sign). Optional mask limits the change to a marked area. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| mask | No | Optional area to change: a PNG as a data:image/png;base64 URI or an https URL, the photo's shape, WHITE where the photo may change and BLACK (or transparent) everywhere else. Leave it out to let the request alone decide — that already keeps the rest of the photo. | |
| style | No | Optional. Style id of the staging being edited (the ids virtual_staging takes). Left out, it is read from the photo's history; a photo that was never staged needs none. | |
| r2Path | No | Storage path of the photo to edit (a resultPaths entry, or an upload) — the alternative to imageUrl. | |
| imageUrl | No | The photo to edit: a Pixly result (a resultUrls entry), the user's own photo, or any public image URL / data:image URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| maskR2Path | No | Storage path of a mask — the alternative to mask. | |
| sourceJobId | No | Job the photo came from, when it is a Pixly result (lineage) | |
| sourceResultIndex | No | Which of that job's results was edited | |
| customInstructions | Yes | The change to make, in the user's words, e.g. "make the sofa dark green", "remove the car from the driveway", "change the sign to SOLD". |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), the description adds meaningful traits: the untouched regions are copied rather than regenerated (a non-idempotent, preservation-guaranteeing behavior), credit consumption from the user's Pixly balance, and that style is inferred from photo history. No rate-limit or failure-mode detail, but the annotations plus this context cover the important ground.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single well-structured block, front-loaded with the core behavioral guarantee, then input classes, examples, mask note, and cost. Dense but not padded; the parenthetical example list is long yet each example is a distinct use case an agent can pattern-match against.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and all 9 parameters have rich schema descriptions. The description supplies the elements the schema cannot: the preservation guarantee, credit cost, and the broad domain of accepted inputs. A statement about failure modes or typical latency would complete it, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a detailed mask definition with white/black semantics, so the schema does the heavy lifting. The description adds only a light restatement ('Optional mask limits the change to a marked area') and does not mention r2Path/imageUrl alternatives, style, or listingId. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource and a precise scope constraint: 'Change one thing in a photo and keep everything else exactly as it is — the parts the edit doesn't touch are copied from the photo, not redrawn.' It also enumerates the input classes (staged room, Pixly result, user's own picture) and concrete edits, so an agent can distinguish it from siblings like restyle_room or remove_furniture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear: it works on any photo, gives representative edits (swap sofa, recolour wall, remove car, change sign words), and notes the optional mask narrows the change. What is missing is routing against specific alternatives — nothing says when to prefer restyle_room, remove_furniture, replace_sky, or enhance_photo over this generic editor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enhance_photoEnhanceAInspect
Real estate photo editing in one step: turn an amateur listing photo into a finished, professional photo (exposure, color, clarity). Returns 3 variants to pick from. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, destructive=false, idempotent=false, openWorld=true), the description discloses two genuinely useful traits: it returns 3 variants rather than one, and it consumes Pixly credits, which matters because idempotentHint=false means retries are billable. It stops short of saying how many credits or whether each variant is a separate charge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each load-bearing: purpose, output behavior, and cost. The primary action is front-loaded before the secondary facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so variant structure need not be spelled out, and annotations carry the safety profile. What the description supplies (variant count, credit cost) plus the schema's source-path guidance makes it adequate, though credit amount and output resolution remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so r2Path, imageUrl, and listingId are already fully documented in the schema, including the 'either/or' requirement for the image source. The description adds nothing about parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('turn an amateur listing photo into a finished, professional photo') and names the edit dimensions it covers (exposure, color, clarity), which separates it from siblings such as restyle_room, declutter_photo, or touch_up_exterior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the framing ('in one step', cost in credits), but the description never states when to choose this over the many sibling photo editors, nor any when-not condition. An agent must infer the fit from surrounding tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flythrough_videoFlythroughAInspect
Flythrough video: one continuous camera move through a home from 2-4 room photos in walking order. Each pair of neighbouring photos becomes a 3-second move that flies from one room into the next, and the moves are stitched into one film with a cinematic speed ramp. Returns one job: poll get_job until the film is ready (a few minutes). Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional name for the tour, e.g. the street address. | |
| format | No | Film shape. Omit to follow the photos (landscape photos → 16:9). | |
| photos | Yes | The rooms in walking order, 2 to 4 photos (e.g. hallway → living room → kitchen). Each photo should show the doorway or opening into the next room — the camera flies through it. Each item takes imageUrl or r2Path. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, open-world. The description adds critical operational behavior: it returns a job to poll via get_job, takes a few minutes, and consumes Pixly credits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the output and input requirements in three tight sentences. Every sentence adds either process, workflow, or cost information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and rich annotations, description only needs to cover the callable contract and follow-up. It supplies the async job and credit model, making the definition complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description repeats the 2-4 walking-order constraint already in the photos schema and adds no syntax or format details for title, format, or listingId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific output (one continuous camera move through a home) and the input scope (2-4 room photos in walking order). The pairwise 3-second moves and stitching detail distinguish it from generic single-photo video siblings like photo_to_video or cinematic_motion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear implied context: it is for 2-4 photos in walking order and requires polling get_job afterward. However, it never names alternatives or states when not to use it (e.g., vs photo_to_video), so guidance stops at implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_checkout_linkGet a Payment LinkAInspect
Use when a tool fails for lack of credits or a plan. Returns a Stripe Checkout URL for the user to pay on — this never charges anything by itself, and you cannot pay for them. With no active plan it is a subscription (plans: starter (Starter: $5.99/week, 20 credits); agent (Agent: $19.99/month, 100 credits); pro_agent (Pro Agent: $49.99/month, 300 credits); team (Team: $149.99/month, 1000 credits)); with a plan it is a one-time credit top-up. After they pay, credits arrive in seconds: check get_credit_balance, then run the tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | Plan to subscribe to, for an account with no active plan. Defaults to "starter". Ignored for a top-up. | |
| topUpUsd | No | For an account that already has a plan: one-time credit top-up amount in USD (10–500, default 10), priced at that plan's rate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), the description discloses critical non-obvious behavior: the tool never charges anything itself, the agent cannot pay on the user's behalf, and credits land in seconds after payment. It also enumerates each plan with its price and credit allotment, which is behaviorally relevant for choosing arguments.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage trigger and the core return value, then the branch logic and recovery steps. The inline plan/price enumeration is dense and slightly interrupts the flow, but it earns its place by letting the agent choose a plan without another lookup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, non-required-arg tool with no output schema, the description covers what is returned (a Stripe Checkout URL), what it does not do (charge), the two parameter regimes, and the post-payment verification loop. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description nonetheless adds meaning by tying 'plan' to the subscription branch and 'topUpUsd' to the existing-plan branch, and by listing plan names with prices/credits. It does not restate the 10–500 USD bounds or default values, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it returns a Stripe Checkout URL for the user to pay through, and explicitly distinguishes itself from the sibling get_credit_balance (which is for verification, not payment). An agent can tell instantly that this is a billing/payment-link tool rather than one of the ~30 image-processing siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger is stated up front: 'Use when a tool fails for lack of credits or a plan.' It then splits the two usage branches explicitly (no active plan = subscription, existing plan = one-time top-up) and gives a post-payment procedure (check get_credit_balance, then re-run the failed tool). This is explicit when-to-use guidance with a named follow-up alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_credit_balanceCredit BalanceARead-onlyIdempotentInspect
The user's current Pixly credit balance and plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered. The description adds that plan information is included in the response, which is genuinely new, but nothing about auth requirements or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words; the resource being returned is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description is the only statement of what comes back, and it does name both balance and plan. Slightly thin on return format, but adequate for a trivial zero-argument read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to document; baseline 4 applies. No parameter meaning is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('Pixly credit balance and plan') with an implied read verb. It is unambiguous and, given the siblings are all image-editing tools, naturally distinguishable as an account query, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer it calls up account balance/plan info, but there is no explicit when-to-use, when-not-to-use, or prerequisite guidance (e.g., whether authentication is required or when to check balance relative to generation calls).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobCheck Job StatusARead-onlyIdempotentInspect
Check a generation job's status and fetch result URLs when it's done. Video jobs take 1-5 minutes — poll this with a few seconds between calls. For several jobs at once (a plan's steps), pass jobIds.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | No | Job id returned by a generation tool | |
| jobIds | No | Several job ids at once (a plan's steps): answers when all are done, or with where each one is |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond those annotations: expected video job duration (1-5 minutes) and polling cadence (a few seconds between calls).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, purpose front-loaded, followed immediately by actionable polling and batch guidance. No filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description covers purpose, polling timing, and batch usage; it omits edge cases like invalid or expired jobIds, but is otherwise complete for a simple status-check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both jobId and jobIds. The description's mention of passing jobIds for a plan's steps largely repeats the schema's own description ('Several job ids at once (a plan's steps)'), adding little new semantic detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Check a generation job's status and fetch result URLs when it's done.' It clearly distinguishes this status-checking tool from the many generation siblings (photo_to_video, virtual_staging, etc.) without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage context: poll with a few seconds between calls, video jobs take 1-5 minutes, and use jobIds for several jobs at once (a plan's steps). It lacks explicit when-not-to-use or named alternatives, but the operational guidance is clear enough to steer the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_libraryList LibraryARead-onlyIdempotentInspect
List the user's recent generations, or with type "uploads" their own uploaded source photos, newest first. Uploads are the way in when the photo is a local file: connectors cannot send bytes, so the user adds it at https://pixly.app/app and you pick up the r2Path here.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by media type. "uploads" lists the user's own source photos instead of generations — use it when they refer to a photo they added but have not run a tool on yet. | |
| limit | No | ||
| listingId | No | Only this property folder's results and photos (from list_listings) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior. The description adds context the annotations cannot carry: uploads must be added by the user at the web app, connectors cannot send bytes, and the r2Path is available here — genuinely useful workflow behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose before the uploads explanation. The second sentence is somewhat dense/run-on but every clause carries information an agent needs to handle local-file uploads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description covers the two list modes and the upload workflow, implying r2Path is returned. It omits pagination/limit behavior, but overall it gives enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%; the schema already documents 'type' and 'listingId'. The description reinforces the 'uploads' meaning and adds the 'newest first' ordering, but says nothing about the undocumented 'limit' parameter or its cap, so it does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the user's recent generations', or 'uploads' for source photos, 'newest first') so the agent knows exactly what is returned. It distinguishes the uploads mode from the generations mode, though it does not explicitly contrast with siblings like list_listings or view_pixly_photo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use condition for the 'uploads' type: 'the way in when the photo is a local file', because 'connectors cannot send bytes'. This routes the agent usefully, but it offers no exclusions or explicit alternatives when the agent should instead call list_listings or view_pixly_photo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_listingsProperty FoldersARead-onlyIdempotentInspect
The user's property folders (a listing such as "12 Oak St" holds that property's photos, staged versions, edits, videos and floor plan): id, title, how many photos and videos. Use when the user names a property, or before work for one, so results land in its folder.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description adds real value beyond them: it discloses the returned fields (id, title, photo and video counts) and explains the folder resource model (what a listing holds), which is meaningful context for a tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and its structure, then the usage trigger. The parenthetical definition is dense but informative, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter read tool with no output schema, the description covers the resource, the fields returned, and when to call it. It is complete enough to invoke correctly, though it omits any mention of result ordering or how an empty folder set is represented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys a specific resource (the user's property folders / listings) and even defines what a listing contains (photos, staged versions, edits, videos, floor plan) plus the returned fields (id, title, photo/video counts). The listing verb is only implied by the noun phrase rather than stated, and no sibling such as list_library or create_listing is explicitly contrasted, so it is clear but not sibling-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Use when the user names a property, or before work for one, so results land in its folder.' That is clear when-to-use context, but it names no alternatives or when-not-to-use conditions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
makeover_exteriorExterior MakeoverAInspect
Design the garden of an exterior listing photo as one coherent scheme — planting, a terrace or deck, a pool, a pergola, a fire pit, a fence, lighting — in a chosen style, at the right scale and perspective, while the house, its roof, the driveway, the sun direction and the neighbours stay exactly as shot. One run builds the whole scheme. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Your own words about the garden you want (e.g. "a small kidney-shaped pool with a stone surround and lavender everywhere"). 160 characters max; anything in it that is not a description of the garden is ignored. | |
| scope | No | 'full' (the default) redesigns the whole yard in the style; 'add' keeps the existing garden and builds the chosen elements into it. The house, the driveway and the neighbours never change either way. | |
| style | No | The design language of the whole scheme: 'modern_minimal', 'mediterranean', 'classic_english', 'natural_lowwater', 'tropical_resort', 'farmhouse', or 'auto' (the default — chosen to suit the house's architecture and the climate in the photo). | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| include | No | Which elements the scheme includes, any number: 'planting' (beds, hedges, a feature tree), 'patio_dining' (a paved terrace with a dining set), 'deck_lounge' (a deck with loungers or a low sofa), 'pool', 'pergola', 'fire_pit', 'fence_gate' (a boundary treatment with a gate), 'lighting'. Omit or send an empty list (the default) to let the tool design what the lot wants. One run composes them all into one garden, each sized to the plot. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, but the description adds genuinely non-structural context: credits are deducted from the user's Pixly balance, one run produces the full scheme, and the house, roof, driveway, sun direction and neighbours stay exactly as shot. This preservation guarantee and the credit cost are exactly the kind of behavioral detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, followed by the cost note. The long em-dash element list is dense but earns its place by defining the scheme's components. Minor trimming possible but well-structured overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and the rich 100%-covered schema plus annotations carry the structural load. The description supplies the invariants (what stays as shot) and the credit cost, so an agent has enough to call it correctly. It could be tighter on credit amount and failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's enumeration of elements (planting, terrace, pool, pergola, fire pit, fence, lighting) loosely maps to the 'include' enum and it mentions 'a chosen style,' but it adds no syntax, defaults or format guidance beyond what the schema already documents thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (design the garden of an exterior listing photo) with explicit scope: it builds a coherent whole scheme of planting, terrace/deck, pool, pergola, fire pit, fence and lighting in a chosen style. This clearly separates it from single-element siblings like replace_lawn, reset_season or touch_up_exterior without the agent needing to open another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description conveys that one run builds the whole scheme, but never says when to prefer this over replace_lawn, touch_up_exterior or edit_staged_photo, nor when a partial-element tool would be the better choice. The scope ('add' vs 'full') distinction that would help routing lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photo_to_videoPhoto to VideoAInspect
Turn a start photo — and optionally an end photo — into a video. With an end photo the camera travels from the first photo and lands exactly on the second (e.g. two views of the same kitchen → an orbit around the island). Pick a ready-made camera move or write your own prompt; choose the model, length and sound. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | kling-v3: 3/5/8/10/15 s, optional sound, lands most precisely on the end frame. kling-2.6: 5/10 s, silent, cheaper. | kling-v3 |
| sound | No | Add ambient sound (kling-v3 only; kling-2.6 is always silent). | |
| format | No | Video shape. original (default) keeps the start photo's own shape; 16:9, 9:16 or 1:1 crop the photos, centred, to that shape before they are animated. | original |
| prompt | No | Your own description of the video, in any language. Replaces cameraMove when set. | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Start frame — where the video begins. Public https URL or data: URI; either imageUrl or r2Path is required. | |
| endR2Path | No | R2 path of the end frame — the alternative to endImageUrl. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| cameraMove | No | Ready-made camera move used when no prompt is given. | smooth |
| endImageUrl | No | Optional end frame — the camera travels from the start photo and lands exactly on this one. Best when both photos show the same space from different spots. | |
| durationSeconds | No | Clip length. kling-v3 takes 3, 5, 8, 10 or 15; kling-2.6 takes 5 or 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it's a non-idempotent, open-world, non-destructive write. The description adds genuinely new context beyond annotations: it consumes credits from the user's Pixly balance, and explains the end-frame landing behavior. It omits any async/job semantics (the get_job sibling suggests polling), which would have earned a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action ('Turn a start photo ... into a video') and stays reasonably tight. The kitchen orbit example is illustrative but slightly expendable; overall efficient with no wasted preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and all 11 params are fully documented in the schema. The description supplies the remaining gaps an agent needs: credit cost, the optional end-frame behavior, and the cameraMove-vs-prompt choice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters including enum trade-offs (model time/sound differences, cameraMove, format). The description only paraphrases ('choose the model, length and sound') without adding format or syntax detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: turn a start photo (and optionally an end photo) into a video. The end-frame mechanism description (camera lands exactly on the second image) is distinctive and clarifying. However, it never names the related siblings (cinematic_motion, flythrough_video, before_after_reel) to differentiate scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives implied usage: with an end photo you get a landing shot, otherwise pick a cameraMove or prompt. But there is no explicit 'when to use this vs cinematic_motion / flythrough_video' guidance, leaving the agent to infer routing among several video-generation siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_photosPlan Photo EditsAInspect
Several listing photos at once: one plan of photo steps (straighten, enhance, sky, lawn, staging, declutter…) with one total and one confirmation, instead of a confirm per photo. The first call runs nothing: it returns each step's cost, the total and a confirmationCode, and the Pixly card shows the plan with one button. After the user says yes in the chat, call again with only confirmationCode: it starts every step whose photo is ready and returns their jobs (poll with get_job jobIds). Steps that work on an earlier step's result start when you call again with the same confirmationCode once that result is completed. Only for photos; videos have their own tools.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | What to do, step by step | |
| photos | No | Every photo of the set, in order; steps refer to them by number (from 1) | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| confirmationCode | No | The plan's confirmationCode — only after the user agreed to the plan. Starts the steps whose photo is ready; call again with it later to start steps that work on earlier results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: the first call is a dry-run that returns each step's cost, the total and a confirmationCode, the card shows one button, the second call starts only steps whose photo is ready, and dependent steps require re-calling with the same code once the earlier result completes. It also points to get_job for polling. This is exactly the rich context annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, followed by the two-phase protocol. Sentences are long and clause-heavy (em-dash lists, nested conditions), which makes it dense, but nearly every clause carries required protocol information so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description still explains what each phase returns (costs, total, confirmationCode, jobs), how dependent steps sequence, and the photo-vs-video scope. For a stateful two-call batch planner this covers everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns above it by giving operational meaning to confirmationCode (gates the run, reused to trigger dependent steps) and to the steps array as an ordered plan. The dry-run-then-confirm semantics of confirmationCode are the added value the schema alone does not spell out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (plan photo edits across several listing photos) and states the key differentiator: one plan with one total and one confirmation rather than a confirm per photo. It also draws a clean boundary against video tools, so an agent can distinguish it from the single-step siblings like straighten_photo or enhance_photo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit call-timing rules: the first call runs nothing and returns costs plus a confirmationCode, and the second call (only confirmationCode) starts the steps. It also states the photos-only restriction. It stops short of naming the single-edit siblings as the alternative path, so the routing guidance is clear but not fully explicit about when to prefer them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_signPlot NumberAInspect
Place a photorealistic 3D monument sign with your exact text (price, area, SOLD) onto a photo of an empty plot, matched to perspective and lighting. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | Sign material/style; defaults server-side | |
| text | Yes | Sign label, verbatim — a price ("$1,200,000"), area ("800 m²"), or short word ("SOLD") | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| orientation | No | Letter orientation (letter looks only); defaults server-side |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the mutation/safety profile (readOnly=false, destructive=false, non-idempotent). The description adds a genuinely useful behavioral fact beyond them: it consumes credits from the Pixly balance, which tells the agent this is a paid operation. It does not, however, note that re-runs would re-charge (non-idempotent).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the visual action is front-loaded and the billing note follows. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the billing disclosure plus rich schema make the definition nearly complete for a 6-param tool. The one gap is the absence of any when-to-use / routing guidance among the many sibling image tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description only echoes the text parameter with examples (price, area, SOLD), adding no meaning beyond what is already there, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ("Place") plus a concrete resource ("photorealistic 3D monument sign with your exact text") applied to a defined input ("a photo of an empty plot"). This clearly separates it from sibling tools like watermark_photos, virtual_staging, or restyle_room.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the context (an empty-plot photo) but never states when to choose this tool over alternatives such as virtual_staging or edit_staged_photo, nor any prerequisites for the source image. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_furnitureRemove FurnitureAInspect
Remove furniture from a photo: empty a room and rebuild the surfaces behind what was taken out, keeping the architecture and camera angle identical — the blank canvas for restaging. By default it also removes the room's own joinery (fitted kitchen, built-in wardrobes, bathroom fixtures); mode 'movable' leaves those alone, and an optional extra takes the floor covering out too, for a full renovation strip-back. Doors always stay. (Declutter is the opposite: it keeps the furniture.) Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How far to strip the room. 'fitted' (the default) removes the movable contents AND the room's own joinery — the fitted kitchen and its appliances, built-in wardrobes and shelving, and bathroom sanitaryware. 'movable' removes only furniture, rugs, curtains, art, plants and lamps, leaving the kitchen, built-ins, sanitaryware, floor and doors exactly as they are. | |
| extras | No | Extra things to take out, for a full strip-back. Only applies with mode 'fitted' and is ignored otherwise: 'floor' takes the floor covering down to bare concrete screed. Omit to keep the floor. Doors always stay, as do walls, ceiling, windows, structural openings and the camera. | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are thin on specifics (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false), and the description fills the gap well: it discloses the default behavior (joinery also removed), what 'movable' preserves, that the floor extra applies only in 'fitted' mode, that doors always stay, and that the operation costs credits from the Pixly balance. This is meaningful behavioral context an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and each subsequent sentence adds a distinct fact (default behavior, movable mode, floor extra, doors, cost). The prose is dense with em-dashes and parentheticals, but no sentence is filler, so it stays reasonably tight for the amount of behavior being conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary. The description covers the mutation's scope, defaults, mode interaction, an extra option, invariants (doors, walls, camera), and the credit cost, which is everything an agent needs to invoke this photo-edit tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents mode, extras, r2Path, imageUrl, and listingId in detail, including defaults. The description largely restates those semantics in prose (mode default, extras-only-with-fitted, doors stay), adding little beyond what the schema carries, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('remove furniture from a photo') and defines the outcome precisely: emptying the room while rebuilding surfaces behind the removed objects and keeping architecture and camera angle identical. It explicitly distinguishes itself from a named sibling, declutter_photo ('Declutter is the opposite: it keeps the furniture'), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear use context ('the blank canvas for restaging', 'a full renovation strip-back') and names the opposite sibling (declutter) with the condition that separates them. It does not, however, mention other plausible alternatives such as restyle_room, virtual_staging, or edit_staged_photo, so routing is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_floor_planFloor Plan RenderAInspect
Turn a picture of any floor plan — a hand sketch, a photo of a brochure page, a blueprint, a screenshot — into a polished real-estate floor plan: a furnished top-down 2D plan with real floors and room names, or a 3D isometric cutaway. The rooms, walls, doors and windows are kept exactly as drawn; nothing is added and written dimensions are left off. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | Which picture to make of the plan: 'furnished' (the default — a polished top-down 2D plan with real floors, furniture and room names) or 'isometric' (a 3D cutaway of the same layout, furnished, no text). The photo must show a floor plan: a hand sketch, a brochure page, a blueprint, a screenshot. The layout is kept exactly as drawn; written dimensions are left off. | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true). The description adds meaningful behavior beyond that: a preservation guarantee that rooms/walls/doors/windows are kept exactly as drawn, nothing is added, written dimensions are omitted, and that the call consumes Pixly credits. Return/pagination behavior is not described, but an output schema exists to cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the input-to-output transformation before the preservation constraint and cost note. Slightly long and partially duplicative of the schema's look enum text, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and all four parameters are covered. The description supplies the important non-obvious context (layout is preserved, dimensions dropped, credits consumed, open-world rendering). Adding explicit sibling routing would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents look, r2Path, imageUrl and listingId in detail. The description reinforces the enum's two output styles but adds no syntax or precedence detail beyond the schema (e.g. which of imageUrl/r2Path wins is left to the schema). Baseline 3 is correct when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific transformation (a photo of a floor plan 6 a polished furnished 2D or 3D isometric plan) with concrete input examples (hand sketch, brochure photo, blueprint, screenshot). An agent can tell this renders an existing plan photo, which implicitly differs from draw_floor_plan, but the description never names or contrasts that sibling, so differentiation is only inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the input requirements ('a picture of any floor plan'), and the credit cost is stated, but there is no explicit when-to-use vs. when-not, and no routing to the obvious alternative (draw_floor_plan) or to upload paths for sourcing an image.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_lawnLawn ReplacementAInspect
Turn patchy, brown or bare grass in an exterior listing photo into a healthy green lawn, leaving driveways, paths, beds and the house untouched. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| lawn | No | Lawn style. 'auto' lets the tool pick a healthy lawn that suits the photo. | auto |
| shade | No | How green; only used with a chosen lawn style. | medium |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| stripes | No | Mowing stripes: auto (stripes for fresh_mown and golf, none otherwise), on, off. | auto |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false), and the description adds value beyond them: the credit cost against the Pixly balance and the concrete preservation boundary of what will not be altered. It does not note non-idempotency or auth/rate-limit behaviour, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both earning their place: the first front-loads the action and scope, the second the cost. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter descriptions, the description only needs to convey purpose, boundaries and cost, which it does. A brief pointer that either imageUrl or r2Path supplies the source, or that results can go into a listing, is unnecessary since the schema covers it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (lawn, shade, stripes, r2Path, imageUrl, listingId) are already documented in the schema. The description adds only the general notion of a lawn transformation, no extra parameter meaning. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replace) and resource (lawn) plus the exact scope: patchy/brown/bare grass in an exterior listing photo, with explicit boundaries ('driveways, paths, beds and the house untouched'). This clearly distinguishes it from siblings like touch_up_exterior or makeover_exterior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context ('exterior listing photo') implies when it applies, but there is no explicit when-to-use or when-not-to-use guidance relative to neighbours such as reset_season or touch_up_exterior. Nothing tells the agent how to choose this over adjacent exterior-editing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_skySky ReplacementAInspect
Replace a grey, overcast or blown-out sky in an exterior listing photo with a natural clear blue sky, matching the light and keeping the building, trees and reflections unchanged. A run takes about 1–2 minutes; poll get_job until it completes. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| sky | No | Sky style. 'auto' lets the tool pick what suits the photo's light. | auto |
| sun | No | Sun glow: auto (a glow for sunset/sunrise styles, none otherwise), on (place it with sunX/sunY), off. | auto |
| sunX | No | With sun=on: glow position from the left edge, 0..1. | |
| sunY | No | With sun=on: glow position from the top edge, 0..1 (kept in the top 60%). | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish that this is a non-destructive write; the description adds the traits an agent actually needs: a 1–2 minute asynchronous runtime with a required get_job polling loop, and credit consumption from the user's Pixly balance. It also discloses what is preserved (building, trees, reflections), which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: what it does, how long it takes and how to wait, and what it costs. The purpose is front-loaded ahead of the operational and billing details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description fills the remaining gaps an agent needs for a 7-parameter async, credit-consuming tool: latency, polling protocol and cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the enums, sunX/sunY semantics and the imageUrl/r2Path requirement. The description only indirectly touches parameters via 'matching the light', which loosely maps to the sun=auto behavior, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('replace ... sky in an exterior listing photo') plus the exact input condition (grey, overcast or blown-out) and the preservation guarantee. It is clearly distinguishable from sibling tools such as day_to_night, reset_season and replace_lawn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('grey, overcast or blown-out sky in an exterior listing photo') and the operational follow-up ('poll get_job until it completes'). It does not name alternative tools (e.g. day_to_night) or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_seasonSeasonal ResetAInspect
Photograph the same property in another season: take the snow off the ground, the roof and the branches and put the garden in leaf, or move a summer shot to autumn or winter. The house, the driveway, the paths and the camera angle stay exactly as shot. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| season | No | The season to show the property in: 'spring', 'summer', 'autumn', 'winter', or 'auto' (the default — the tool shows the property at its best, which for a snowy or dormant photo means high summer). Only the planting, the ground cover and the daylight change; the house, the driveway, the paths and the framing stay exactly as shot. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations by disclosing that the operation costs credits from the user's Pixly balance and that structural elements stay fixed. The annotations already cover safety and open-world traits, so the remaining credit-cost disclosure is the main added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three efficient sentences, front-loads the core transformation, and uses concrete examples without wasted wording. Every sentence contributes to understanding the tool's effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, complete input schema descriptions, and presence of an output schema, the definition is largely complete. It covers the transformation scope and credit cost, though it could say more about processing behavior or how image sources are expected to be supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meaning is already well documented, including the season enum and image source fields. The description reinforces the preservation semantics and seasonal scope but does not add substantial new parameter guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific transformation: photographing the same property in another season while preserving the house, driveway, paths, and camera angle. It is clearly distinct from a generic edit, though it does not explicitly name related siblings such as day_to_night or replace_lawn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through examples like removing snow or moving a summer shot to autumn or winter, but there is no explicit when-to-use guidance or comparison with alternative photo tools. An agent can infer the seasonal use case, but must still decide between this and siblings on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restyle_roomRestyleAInspect
Give one or more surfaces of a room a new finish — repaint the walls, change the floor, reface the kitchen cabinets and worktop, retile the bathroom or refinish the furniture — while the room's layout, fittings, windows and camera angle stay exactly as shot. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| looks | No | The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, 'own_colour' (walls, cabinets, furniture) with a hex colour in `colours`, or 'material_photo' with a photo of the material in `references`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles (wall tiles only; a bathroom floor is 'floor'): white_metro, zellige_white, marble_large, travertine, green_gloss. floor also takes terrazzo, encaustic_pattern, matt_black_hex. furniture: light_neutral, warm_wood, dark_wood, black_leather. | |
| notes | No | Your own description of the finish for a surface, used when that surface's look is "custom" (e.g. "terracotta hex tiles with dark grout"). Set look "custom" and the note together; "custom" with no note falls back to "auto". 120 characters max, and anything in it that is not a description of a finish is ignored. | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| colours | No | Any colour as a hex code for walls, cabinets or furniture (e.g. {"walls": "#7A8B6F"}), used when that surface's look is "own_colour". The result matches it closely as it would look in the room's light. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| surfaces | No | Which surfaces get a new finish: 'walls', 'floor', 'cabinets' (fitted joinery plus its worktop and splashback), 'bathroom_tiles' (the tiled walls; a bathroom floor is 'floor') or 'furniture' (upholstery and wood finishes). Omit for walls. The room's layout, fittings and camera never change. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| references | No | A photo of the material itself — a floor plank, a tile, a fabric swatch, a wallpaper sample — for ONE surface, as the r2Path from create_upload_ticket or list_library (e.g. {"floor": "users/…/oak.jpg"}). Set that surface's look to "material_photo". One photo per run; a close, straight-on photo of the sample works best. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish the mutation profile (readOnlyHint=false, destructiveHint=false, non-idempotent, open world), and the description adds two genuinely useful facts beyond them: the source photo's layout, fittings, windows and camera angle are preserved unchanged, and the call 'Costs credits from the user's Pixly balance.' That billing disclosure is exactly the kind of non-obvious side effect an agent needs and cannot get from structured fields, though there is no detail on failure or fallback behaviour at the description level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence naming the operation and its surface scope, followed by a short sentence on the preservation constraint and billing. The em-dash list is dense but each item maps to a real capability; no sentence is filler and nothing important is buried at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers operation scope, the invariants it preserves, and cost. It does not mention the source-photo requirement or the library/folder plumbing, but those are documented in the schema descriptions of imageUrl, r2Path and listingId, leaving the definition complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the eight parameters carries a detailed description (including the per-surface preset lists and fallback-to-auto rules), so the baseline is 3. The prose contributes only the notion of 'one or more surfaces,' which merely restates the `surfaces` array and adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('give one or more surfaces of a room a new finish') and then enumerates the exact surfaces it can restyle — walls, floor, cabinets, bathroom tiles, furniture — which matches the schema's `surfaces` enum. The phrase 'of a room' plus 'the room's layout, fittings, windows and camera angle stay exactly as shot' separates it cleanly from exterior siblings such as makeover_exterior or replace_lawn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the tool for changing finishes without moving furniture, and the preservation clause rules out layout edits. But it never names an alternative (virtual_staging, remove_furniture, makeover_exterior) or gives an explicit when/when-not condition, so routing between the many photo-edit siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
straighten_photoStraighten PhotoAInspect
Free (no credits): automatically straighten a property photo — leaning walls made vertical (converging verticals from a tilted camera) and a tilted horizon levelled, like a pro photographer's lens correction. Crops the edges slightly. Best before staging or any other edit. Says so when the photo is already straight or has no straight lines to go by.
| Name | Required | Description | Default |
|---|---|---|---|
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), but the description adds material context beyond them: it is free/no credits, it crops the edges slightly (a real side effect of a non-destructive write), and it reports when no straightening was possible. That is behavior an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the cost and the core action, and every clause (mechanism, side effect, ordering advice, edge case) earns its place. The heavy use of em-dash asides makes it slightly denser to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation. For a 3-parameter tool with full schema coverage, the description covers cost, mechanism, side effects, sequencing, and the degenerate-input case — nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents r2Path, imageUrl, and listingId in detail. The description adds no parameter syntax or format meaning, which is the baseline-3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ("straighten a property photo") with the exact mechanism spelled out: leaning walls made vertical from converging verticals and a tilted horizon levelled. This clearly distinguishes it from siblings like enhance_photo, upscale_hd, or edit_staged_photo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Best before staging or any other edit" gives real sequencing guidance that shapes how an agent orders its calls, and the edge-case clause ("says so when the photo is already straight") sets expectations. It stops short of naming an alternative or stating when not to use it, so it doesn't reach 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
touch_up_exteriorExterior Touch-upAInspect
One-click retouch of an exterior listing photo: a natural sky where it is dull, a healthy lawn where the grass is dead, a clean driveway, and bins, hoses and other clutter removed — each only where needed, with the house unchanged. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| fix | No | Which areas the tool may touch: 'sky', 'lawn', 'hardscape' (driveway, paths, patio), 'clutter' (bins, hoses, tools, a stray vehicle). Omit for all four; each is fixed only where the photo needs it. | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe/non-destructive profile, and the description adds real value beyond them: the credit cost against the user's Pixly balance and the conservative behavioral guarantees ('each only where needed', 'the house unchanged'). It does not disclose asynchronous/job processing, which is a notable omission given the sibling get_job, but with a job-style output schema this is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the action and scope front-loaded, then a short cost note. The enumeration of effects is informative rather than padding, and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description sufficiently covers what the tool does, its credit cost, and its conservative scope. The main missing piece is whether invocation is asynchronous/returns a job, which matters in a system with get_job polling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters including the 'fix' enum values and the imageUrl/r2Path relationship. The description adds no format, default, or precedence detail beyond what the schema states, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (retouch) and resource (exterior listing photo) and enumerates the exact effects (sky, lawn, driveway, clutter removal), so the purpose is concrete. It never explicitly separates itself from overlapping siblings like replace_sky, replace_lawn, declutter_photo, or makeover_exterior, so an agent must infer that this is the combined one-click variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'one-click' and 'each only where needed' implies when this tool is preferred (a single combined pass rather than per-area tools), but there is no explicit when-to-use, no exclusions, and no named alternative. Usage is left to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_listingRename Property FolderADestructiveIdempotentInspect
Rename one of the user's property folders, only when they ask.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Its new name | |
| listingId | Yes | The folder (from list_listings) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the full safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=true). The description restates only the mutation itself and adds no behavioral context such as reversibility, permission requirements, or what happens to the old name. No credit for the annotation-only safety disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single ten-word sentence, front-loaded with the action and resource followed immediately by the gating condition. No filler, no redundancy — every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description covers what it does and when to invoke it, and annotations carry the safety profile. It does not address the surprising destructiveHint (why a rename is destructive, e.g. overwriting a name) or any success/failure outcome, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (title, listingId) are already documented in the schema. The description adds no syntax, format, or constraint meaning beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ("Rename") and resource ("property folders"), which usefully overrides the misleadingly generic tool name update_listing. It is clearly distinguishable from create_listing (creates) and list_listings (reads), though it does not name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"only when they ask" gives a concrete trigger condition (respond to an explicit user request) rather than leaving invocation context to inference. It offers no comparison to alternative tools such as create_listing or list_listings, but the when-to-use condition itself is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_image_from_urlImport Photo from URLAInspect
Rarely needed: generation tools take an imageUrl directly. Use this only to import a photo into Pixly ahead of time, e.g. to reuse one URL across several tools without refetching it each time.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Publicly reachable image URL (JPG/PNG/WebP, max 10 MB) to import into Pixly |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the call persists the image into Pixly ahead of time and the benefit is avoiding repeated fetches of the same URL. It still does not say what handle comes back or whether a repeat import of the same URL duplicates the asset (relevant given idempotentHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the de-prioritization caveat, then the legitimate use case. No wasted clauses and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter import tool with no output schema, the description conveys the side effect (import into Pixly), the precondition that generation tools don't need it, and the reuse rationale. The only real gap is the return value/asset handle, which the agent needs in order to actually reuse the import later.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself documents the URL format and constraints (JPG/PNG/WebP, max 10 MB). The description adds nothing about the single `url` parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('import a photo into Pixly') and the title reinforces it. It is framed as a caveat-first note ('Rarely needed') rather than a direct purpose statement, and it does not name a specific sibling tool it replaces, only the general class 'generation tools'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not ('Rarely needed: generation tools take an imageUrl directly') paired with a concrete when-to-use ('reuse one URL across several tools without refetching it each time'). This is exactly the alternative-comparison guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upscale_hdHD UpscaleAInspect
Enlarge a photo by up to four times with real detail, to a maximum of 4096 px on the long edge — for print, MLS uploads and large screens. Nothing in the photo changes. Free on any result Pixly made (pass its r2Path from list_library); 1 credit on your own photo. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, non-idempotent, open-world behavior, so the bar is lower. The description adds real value beyond them: 'Nothing in the photo changes' (content preservation), the output size ceiling, and the credit-charging rule that draws down the user's Pixly balance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the action, limits, and use cases before the cost model. Every clause carries information; no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers purpose, scale limits, non-destructiveness, and pricing, and the schema covers all three parameters, leaving little an agent needs to infer. Only the absence of any sibling routing keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with r2Path, imageUrl, and listingId all documented including the alternative-to relationship and folder placement behavior. The description reinforces r2Path's origin (list_library) but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (enlarge), resource (photo), hard limits (4x, 4096 px long edge), and intended use cases (print, MLS uploads, large screens). It is unmistakably distinguishable from most siblings by the upscale/print framing, though it never names the closest alternative (enhance_photo) to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this is the right call (print, MLS uploads, large screens) and states the cost condition that governs the decision: free when passing an r2Path from list_library, 1 credit for the user's own photo. No explicit when-not or named alternative is offered, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_pixly_photoView Pixly PhotoARead-onlyIdempotentInspect
Look at one of the user's Pixly photos or videos (a video gives its first frame) — returns a small copy of the picture you can see. Use it before writing anything about a Pixly result: a caption, a listing description, what changed. You cannot see Pixly results otherwise. Free; changes nothing. Text you write from it is the user's own (their listing, their post): leave Pixly out of it — no #Pixly, no 'made with Pixly'.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The library item: a job id (from a Pixly tool result, get_job or list_library), or "upload:<r2Path>" for an uploaded photo. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, but the description adds real context beyond them: the return is a downscaled copy, video surfaces only its first frame, the call is free and changes nothing, and text derived from it must exclude Pixly branding. That is meaningful behavioral guidance not present in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first clause, then usage, then constraints. Efficient overall, though the trailing branding instruction ('no #Pixly, no made with Pixly') is a slight extension of scope for a viewer tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return burden and does so: it tells the agent the output is a small visible copy of the image (first frame for video). For a one-parameter read tool, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the id parameter is fully documented in the schema (job id, get_job/list_library source, upload:<r2Path> form). The description adds no parameter-specific detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look at/view) and resource (user's Pixly photos or videos), and clarifies the video edge case ('a video gives its first frame'). No sibling tool does viewing, so the agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'before writing anything about a Pixly result: a caption, a listing description, what changed.' It also supplies the forcing constraint ('You cannot see Pixly results otherwise'), which removes any ambiguity about whether the call is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtual_stagingVirtual StagingAInspect
AI virtual staging: furnish and style an empty (or badly furnished) room photo in a chosen interior design style — also the tool for "redesign this room" or "show this room in another style". HD, watermark-free results. Costs credits from the user's Pixly balance.
| Name | Required | Description | Default |
|---|---|---|---|
| style | Yes | Interior style id. One of: modern-minimal, scandinavian, industrial, mid-century-modern, japandi, contemporary, transitional, urban-chic, bauhaus, organic-modern, brutalist, italian-modern, traditional, art-deco, colonial, victorian, french-country, english-cottage, neoclassical, art-nouveau, grandmillennial, hollywood-regency, parisian-chic, modern-classic, craftsman, mediterranean, mediterranean-modern, rustic-farmhouse, bohemian, tropical, family-staging, hygge, wabi-sabi, modern-farmhouse, cottagecore, shabby-chic, cabin-lodge, eclectic, retro-70s, warm-luxury, investor-premium, contemporary-dark, glam, penthouse-modern, hotel-suite, maximalist, quiet-luxury, coastal, desert-modern, hacienda, pacific-northwest, caribbean-resort, hamptons, moroccan, tuscan, southwestern, asian-zen, coastal-grandmother, cape-cod, california-casual, mountain-modern. When the user has no preference, "modern-minimal" or "scandinavian" suit most listings. | |
| r2Path | No | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. | |
| imageUrl | No | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. | |
| roomType | No | Room type hint; omit to let vision infer it from the photo | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. | |
| numImages | No | Ignored — staging always returns one image. Call again for another take. | |
| stagingQuality | No | Ignored — the Pro tier is retired. Every staging costs 1 credit. | |
| customInstructions | No | Optional: ONLY a wish the user stated beyond the style and room, in their words (e.g. "add a reading chair", "no rug"). Leave it out otherwise — Pixly writes the staging prompt itself (keeps walls, windows and camera angle, furnishes to scale); never restate the request or list furniture here. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (non-read-only, non-destructive, non-idempotent, open-world), and the description adds genuinely new behavioral context: HD and watermark-free output, and that the call consumes credits from the user's Pixly balance. It does not disclose latency, permission requirements, or what happens to an existing photo already in a folder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then scenario aliases, then output and cost facts; each fragment earns its place. The 'also the tool for...' clause is slightly redundant with the opening but carries routing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a credit-consuming, high-complexity generation tool, the description covers purpose, trigger scenarios, output quality, and cost, and the rich schema covers sourcing and routing parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (style enum guidance, r2Path/imageUrl sourcing, deprecated numImages/stagingQuality, customInstructions caveats) is already documented in the schema. The description adds no parameter meaning beyond that, so baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'furnish and style an empty (or badly furnished) room photo in a chosen interior design style', and adds routing phrases ('redesign this room', 'show this room in another style'). It is clear on its own, but it never names the sibling it is not — restyle_room and edit_staged_photo plausibly overlap with those phrasings, so an agent cannot fully disambiguate from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: use for empty or badly furnished rooms, and for redesign/restyle-in-another-style requests. However it offers no exclusions or named alternatives, so a request like 'restyle the staged room' leaves the agent guessing between this and restyle_room.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watermark_photosWatermark PhotosAInspect
Free (no credits): put the agent's or agency's mark on listing photos — text (name, phone) and/or the logo saved on their Pixly account — in a corner or the middle, up to 10 photos per call. Returns every marked photo at once.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | medium | |
| text | No | The text, e.g. "Smith Realty · 555-0100". Optional when the account has a saved logo. | |
| photos | Yes | The photos to mark, 1–10. Each item takes imageUrl or r2Path. | |
| useLogo | No | Add the logo saved on the account (Pixly floor plan settings), when there is one. | |
| position | No | bottom-right | |
| listingId | No | A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results |
| note | No | |
| type | No | |
| error | No | |
| jobId | Yes | Pass to get_job to poll |
| quote | No | Present when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm |
| status | Yes | pending | processing | completed | failed — anything not completed/failed is still running |
| createdAt | No | |
| resultUrls | No | Present when completed; valid 7 days |
| completedAt | No | |
| resultPaths | No | Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-read-only, non-destructive, non-idempotent, open-world), so the bar is lower. The description adds cost behavior ('Free (no credits)') and batching behavior ('Returns every marked photo at once'), which are not derivable from annotations. It still omits whether originals are modified versus a new copy produced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly constructed sentence with the cost signal front-loaded ahead of the functional detail. Every clause carries information — mark content, placement, per-call limit, and return behavior — with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, though the description still notes batch return. For a 6-parameter tool with a nested photo array, it covers the core interaction well but leaves gaps around source-photo handling, size parameter intent, and auth requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, above the 50% floor but well below the 80% baseline, so the schema does much of the work on r2Path/imageUrl/useLogo/listingId. The description only adds natural-language reinforcement for text (name, phone), position (corner or middle), and the 10-photo cap, without elaborating on defaults or the size/logos interplay.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('put the agent's or agency's mark on listing photos') and enumerates the mark types (text name/phone, saved logo), so an agent immediately understands this overlays branding. It is clearly distinct from other image siblings like blur_faces_plates or plot_sign, which redact or add physical signage rather than apply an ownership watermark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a decision-relevant cue — 'Free (no credits)' — which helps an agent prefer this over credit-consuming siblings, and the 'up to 10 photos per call' hints at batching. However, it never states when to use this instead of alternatives, nor any prerequisites or exclusions, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
30 tool updates
- Changed
before_after_image2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
before_after_reel2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
blur_faces_plates2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
cinematic_motion2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Added
create_listing - Changed
day_to_night2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
declutter_photo2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
draw_floor_plan2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
edit_staged_photo2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
enhance_photo2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
flythrough_video2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
get_job3 fields changed- added
Input schema / properties / jobIdsAdded value: +{ + "description": "Several job ids at once (a plan's steps): answers when all are done, or with where each one is", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "jobId" -] - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
list_library1 field changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "Only this property folder's results and photos (from list_listings)", + "type": "string" +}
- Added
list_listings - Changed
makeover_exterior2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
photo_to_video2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Added
plan_photos - Changed
plot_sign2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
remove_furniture2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
render_floor_plan2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
replace_lawn2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
replace_sky2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
reset_season2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
restyle_room2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
straighten_photo2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
touch_up_exterior2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Added
update_listing - Changed
upscale_hd2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
virtual_staging2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
watermark_photos2 fields changed- added
Input schema / properties / listingIdAdded value: +{ + "description": "A property folder (from list_listings or create_listing) to put the result in. Results of a photo that is already in a folder go there by themselves.", + "type": "string" +} - added
Output schema / properties / jobsAdded value: +{ + "description": "Several jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results", + "items": { + "type": "object" + }, + "type": "array" +}
1 tool update
- Changed
virtual_staging1 field changed- changed
Input schema / properties / customInstructions / descriptionPrevious value: -"Optional extra instructions blended into the staging prompt"New value: +"Optional: ONLY a wish the user stated beyond the style and room, in their words (e.g. \"add a reading chair\", \"no rug\"). Leave it out otherwise — Pixly writes the staging prompt itself (keeps walls, windows and camera angle, furnishes to scale); never restate the request or list furniture here."
3 tool updates
- Changed
before_after_reel3 fields changed- changed
Input schema / properties / format / defaultPrevious value: -"9:16"New value: +"original" - added
Input schema / properties / format / descriptionAdded value: +"Video shape. original (default) keeps the photos' own shape; 9:16, 16:9 or 1:1 crop both photos, centred, to that shape first." - changed
Input schema / properties / format / enumPrevious value: -[ - "9:16", - "16:9", - "1:1" -]New value: +[ + "original", + "9:16", + "16:9", + "1:1" +]
- Changed
cinematic_motion3 fields changed- changed
Input schema / properties / format / defaultPrevious value: -"9:16"New value: +"original" - changed
Input schema / properties / format / descriptionPrevious value: -"Aspect ratio"New value: +"Video shape. original (default) keeps the photo's own shape; 9:16 or 16:9 crop the photo, centred, to that shape before it is animated." - changed
Input schema / properties / format / enumPrevious value: -[ - "9:16", - "16:9" -]New value: +[ + "original", + "9:16", + "16:9" +]
- Changed
photo_to_video3 fields changed- changed
Input schema / properties / format / defaultPrevious value: -"16:9"New value: +"original" - changed
Input schema / properties / format / descriptionPrevious value: -"Label for the clip's shape; the video follows the start photo's own shape."New value: +"Video shape. original (default) keeps the start photo's own shape; 16:9, 9:16 or 1:1 crop the photos, centred, to that shape before they are animated." - changed
Input schema / properties / format / enumPrevious value: -[ - "16:9", - "9:16", - "1:1" -]New value: +[ + "original", + "16:9", + "9:16", + "1:1" +]
25 tool updates
- Changed
before_after_image1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
before_after_reel1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
blur_faces_plates1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
cinematic_motion2 fields changed- changed
Input schema / properties / durationSeconds / descriptionPrevious value: -"Clip length; the routed model validates its supported tiers"New value: +"Clip length in seconds. Leave out for the default 5 s; 10 s costs about twice as much — use it only when the user asks for a longer video." - added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
day_to_night1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
declutter_photo1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
draw_floor_plan1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
edit_staged_photo1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
enhance_photo1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
flythrough_video1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
get_job1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
makeover_exterior1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
photo_to_video1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
plot_sign1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
remove_furniture1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
render_floor_plan1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
replace_lawn1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
replace_sky1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
reset_season1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
restyle_room1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
straighten_photo1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
touch_up_exterior1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
upscale_hd1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
virtual_staging1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
- Changed
watermark_photos1 field changed- added
Output schema / properties / quoteAdded value: +{ + "description": "Present when status is \"awaiting_confirmation\": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm", + "type": "object" +}
1 tool update
- Changed
restyle_room2 fields changed- changed
Input schema / properties / looks / descriptionPrevious value: -"The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, 'own_colour' (walls, cabinets, furniture) with a hex colour in `colours`, or 'material_photo' with a photo of the material in `references`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles: white_metro, marble_large, terrazzo, matt_black_hex, travertine. furniture: light_neutral, warm_wood, dark_wood, black_leather."New value: +"The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, 'own_colour' (walls, cabinets, furniture) with a hex colour in `colours`, or 'material_photo' with a photo of the material in `references`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles (wall tiles only; a bathroom floor is 'floor'): white_metro, zellige_white, marble_large, travertine, green_gloss. floor also takes terrazzo, encaustic_pattern, matt_black_hex. furniture: light_neutral, warm_wood, dark_wood, black_leather." - changed
Input schema / properties / surfaces / descriptionPrevious value: -"Which surfaces get a new finish: 'walls', 'floor', 'cabinets' (fitted joinery plus its worktop and splashback), 'bathroom_tiles' or 'furniture' (upholstery and wood finishes). Omit for walls. The room's layout, fittings and camera never change."New value: +"Which surfaces get a new finish: 'walls', 'floor', 'cabinets' (fitted joinery plus its worktop and splashback), 'bathroom_tiles' (the tiled walls; a bathroom floor is 'floor') or 'furniture' (upholstery and wood finishes). Omit for walls. The room's layout, fittings and camera never change."
1 tool update
- Changed
restyle_room4 fields changed- changed
Input schema / properties / colours / descriptionPrevious value: -"Walls only: any paint colour as a hex code (e.g. {\"walls\": \"#7A8B6F\"}), used when the walls look is \"own_colour\". The result matches it closely as that paint would look in the room's light."New value: +"Any colour as a hex code for walls, cabinets or furniture (e.g. {\"walls\": \"#7A8B6F\"}), used when that surface's look is \"own_colour\". The result matches it closely as it would look in the room's light." - changed
Input schema / properties / looks / additionalProperties / enumPrevious value: -[ - "auto", - "custom", - "own_colour", - "warm_white", - "crisp_white", - "soft_grey", - "greige", - "warm_beige", - "clay_pink", - "sage", - "soft_blue", - "olive_green", - "graphite", - "deep_navy", - "terracotta_walls", - "panelling", - "wallpaper_textured", - "limewash", - "microcement", - "exposed_brick", - "timber_slats", - "light_oak", - "mid_oak", - "wide_ash", - "walnut", - "herringbone_oak", - "grey_plank", - "polished_concrete", - "stone_tile", - "terracotta_floor", - "slate_tile", - "checker_tile", - "carpet_neutral", - "white_shaker", - "cream_shaker", - "handleless_white", - "handleless_grey", - "charcoal", - "matt_black_cabinets", - "natural_oak", - "walnut_cabinets", - "sage_cabinets", - "forest_green", - "navy_cabinets", - "two_tone", - "gloss_white", - "white_metro", - "zellige_white", - "white_large", - "grey_porcelain", - "marble_large", - "travertine", - "terrazzo", - "encaustic_pattern", - "matt_black_hex", - "slate_dark", - "wood_effect_tile", - "green_gloss", - "light_neutral", - "mid_grey_wool", - "warm_greige", - "cream_boucle", - "tan_leather", - "black_leather", - "green_velvet", - "navy_velvet", - "rust_velvet", - "warm_wood", - "dark_wood", - "black_metal" -]New value: +[ + "auto", + "custom", + "own_colour", + "material_photo", + "warm_white", + "crisp_white", + "soft_grey", + "greige", + "warm_beige", + "clay_pink", + "sage", + "soft_blue", + "olive_green", + "graphite", + "deep_navy", + "terracotta_walls", + "panelling", + "wallpaper_textured", + "limewash", + "microcement", + "exposed_brick", + "timber_slats", + "light_oak", + "mid_oak", + "wide_ash", + "walnut", + "herringbone_oak", + "grey_plank", + "polished_concrete", + "stone_tile", + "terracotta_floor", + "slate_tile", + "checker_tile", + "carpet_neutral", + "white_shaker", + "cream_shaker", + "handleless_white", + "handleless_grey", + "charcoal", + "matt_black_cabinets", + "natural_oak", + "walnut_cabinets", + "sage_cabinets", + "forest_green", + "navy_cabinets", + "two_tone", + "gloss_white", + "white_metro", + "zellige_white", + "white_large", + "grey_porcelain", + "marble_large", + "travertine", + "terrazzo", + "encaustic_pattern", + "matt_black_hex", + "slate_dark", + "wood_effect_tile", + "green_gloss", + "light_neutral", + "mid_grey_wool", + "warm_greige", + "cream_boucle", + "tan_leather", + "black_leather", + "green_velvet", + "navy_velvet", + "rust_velvet", + "warm_wood", + "dark_wood", + "black_metal" +] - changed
Input schema / properties / looks / descriptionPrevious value: -"The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, or (walls only) 'own_colour' with a hex paint colour in `colours`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles: white_metro, marble_large, terrazzo, matt_black_hex, travertine. furniture: light_neutral, warm_wood, dark_wood, black_leather."New value: +"The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, 'own_colour' (walls, cabinets, furniture) with a hex colour in `colours`, or 'material_photo' with a photo of the material in `references`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles: white_metro, marble_large, terrazzo, matt_black_hex, travertine. furniture: light_neutral, warm_wood, dark_wood, black_leather." - added
Input schema / properties / referencesAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "A photo of the material itself — a floor plank, a tile, a fabric swatch, a wallpaper sample — for ONE surface, as the r2Path from create_upload_ticket or list_library (e.g. {\"floor\": \"users/…/oak.jpg\"}). Set that surface's look to \"material_photo\". One photo per run; a close, straight-on photo of the sample works best.", + "propertyNames": { + "enum": [ + "walls", + "floor", + "cabinets", + "bathroom_tiles", + "furniture" + ], + "type": "string" + }, + "type": "object" +}
1 tool update
- Changed
edit_staged_photo10 fields changed- changed
Input schema / properties / customInstructions / descriptionPrevious value: -"The concrete edit to apply, e.g. \"change the sofa to grey\""New value: +"The change to make, in the user's words, e.g. \"make the sofa dark green\", \"remove the car from the driveway\", \"change the sign to SOLD\"." - changed
Input schema / properties / imageUrl / descriptionPrevious value: -"URL of the PREVIOUS staged result to edit (the resultUrls entry from its job). Either imageUrl or r2Path is required."New value: +"The photo to edit: a Pixly result (a resultUrls entry), the user's own photo, or any public image URL / data:image URI. Either imageUrl or r2Path is required." - added
Input schema / properties / maskAdded value: +{ + "description": "Optional area to change: a PNG as a data:image/png;base64 URI or an https URL, the photo's shape, WHITE where the photo may change and BLACK (or transparent) everywhere else. Leave it out to let the request alone decide — that already keeps the rest of the photo.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / maskR2PathAdded value: +{ + "description": "Storage path of a mask — the alternative to mask.", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / r2Path / descriptionPrevious value: -"R2 path of the previous staged result — the alternative to imageUrl."New value: +"Storage path of the photo to edit (a resultPaths entry, or an upload) — the alternative to imageUrl." - changed
Input schema / properties / sourceJobId / descriptionPrevious value: -"Job the edited result came from (lineage)"New value: +"Job the photo came from, when it is a Pixly result (lineage)" - changed
Input schema / properties / sourceResultIndex / descriptionPrevious value: -"Which variation was edited"New value: +"Which of that job's results was edited" - changed
Input schema / properties / style / descriptionPrevious value: -"Style id of the staging being edited (the same ids virtual_staging takes), used as context to match new elements"New value: +"Optional. Style id of the staging being edited (the ids virtual_staging takes). Left out, it is read from the photo's history; a photo that was never staged needs none." - removed
Input schema / properties / style / minLengthRemoved value: -1 - changed
Input schema / requiredPrevious value: -[ - "style", - "customInstructions" -]New value: +[ + "customInstructions" +]
1 tool update
- Changed
restyle_room3 fields changed- added
Input schema / properties / coloursAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Walls only: any paint colour as a hex code (e.g. {\"walls\": \"#7A8B6F\"}), used when the walls look is \"own_colour\". The result matches it closely as that paint would look in the room's light.", + "propertyNames": { + "enum": [ + "walls", + "floor", + "cabinets", + "bathroom_tiles", + "furniture" + ], + "type": "string" + }, + "type": "object" +} - changed
Input schema / properties / looks / additionalProperties / enumPrevious value: -[ - "auto", - "custom", - "warm_white", - "crisp_white", - "soft_grey", - "greige", - "warm_beige", - "clay_pink", - "sage", - "soft_blue", - "olive_green", - "graphite", - "deep_navy", - "terracotta_walls", - "panelling", - "wallpaper_textured", - "limewash", - "microcement", - "exposed_brick", - "timber_slats", - "light_oak", - "mid_oak", - "wide_ash", - "walnut", - "herringbone_oak", - "grey_plank", - "polished_concrete", - "stone_tile", - "terracotta_floor", - "slate_tile", - "checker_tile", - "carpet_neutral", - "white_shaker", - "cream_shaker", - "handleless_white", - "handleless_grey", - "charcoal", - "matt_black_cabinets", - "natural_oak", - "walnut_cabinets", - "sage_cabinets", - "forest_green", - "navy_cabinets", - "two_tone", - "gloss_white", - "white_metro", - "zellige_white", - "white_large", - "grey_porcelain", - "marble_large", - "travertine", - "terrazzo", - "encaustic_pattern", - "matt_black_hex", - "slate_dark", - "wood_effect_tile", - "green_gloss", - "light_neutral", - "mid_grey_wool", - "warm_greige", - "cream_boucle", - "tan_leather", - "black_leather", - "green_velvet", - "navy_velvet", - "rust_velvet", - "warm_wood", - "dark_wood", - "black_metal" -]New value: +[ + "auto", + "custom", + "own_colour", + "warm_white", + "crisp_white", + "soft_grey", + "greige", + "warm_beige", + "clay_pink", + "sage", + "soft_blue", + "olive_green", + "graphite", + "deep_navy", + "terracotta_walls", + "panelling", + "wallpaper_textured", + "limewash", + "microcement", + "exposed_brick", + "timber_slats", + "light_oak", + "mid_oak", + "wide_ash", + "walnut", + "herringbone_oak", + "grey_plank", + "polished_concrete", + "stone_tile", + "terracotta_floor", + "slate_tile", + "checker_tile", + "carpet_neutral", + "white_shaker", + "cream_shaker", + "handleless_white", + "handleless_grey", + "charcoal", + "matt_black_cabinets", + "natural_oak", + "walnut_cabinets", + "sage_cabinets", + "forest_green", + "navy_cabinets", + "two_tone", + "gloss_white", + "white_metro", + "zellige_white", + "white_large", + "grey_porcelain", + "marble_large", + "travertine", + "terrazzo", + "encaustic_pattern", + "matt_black_hex", + "slate_dark", + "wood_effect_tile", + "green_gloss", + "light_neutral", + "mid_grey_wool", + "warm_greige", + "cream_boucle", + "tan_leather", + "black_leather", + "green_velvet", + "navy_velvet", + "rust_velvet", + "warm_wood", + "dark_wood", + "black_metal" +] - changed
Input schema / properties / looks / descriptionPrevious value: -"The finish per surface: 'auto', one of the presets below, or 'custom' with your own words in `notes`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles: white_metro, marble_large, terrazzo, matt_black_hex, travertine. furniture: light_neutral, warm_wood, dark_wood, black_leather."New value: +"The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, or (walls only) 'own_colour' with a hex paint colour in `colours`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles: white_metro, marble_large, terrazzo, matt_black_hex, travertine. furniture: light_neutral, warm_wood, dark_wood, black_leather."
1 tool update
- Changed
virtual_staging1 field changed- changed
Input schema / properties / stagingQuality / descriptionPrevious value: -"Ignored — the Pro tier is retired. Every staging costs 1 credit and may render a second version on another model for free."New value: +"Ignored — the Pro tier is retired. Every staging costs 1 credit."
1 tool update
- Changed
draw_floor_plan1 field changed- changed
Input schema / properties / planId / descriptionPrevious value: -"To CHANGE a plan you drew before: its planId from that result, with the whole updated layout. Omit for a new plan."New value: +"To CHANGE a plan you drew before: its planId from that result, with the whole updated layout — saved as a new plan beside it (nothing is overwritten). Omit for a new plan."
25 tool updates
- Changed
before_after_image1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
before_after_reel1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
blur_faces_plates1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
cinematic_motion1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
day_to_night1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
declutter_photo1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
draw_floor_plan1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
edit_staged_photo1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
enhance_photo1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
flythrough_video1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
get_job1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
makeover_exterior1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
photo_to_video1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
plot_sign1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
remove_furniture1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
render_floor_plan1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
replace_lawn1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
replace_sky1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
reset_season1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
restyle_room1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
straighten_photo1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
touch_up_exterior1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
upscale_hd1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
virtual_staging1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
watermark_photos1 field changed- added
Output schema / properties / resultPathsAdded value: +{ + "description": "Storage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result", + "items": { + "type": "string" + }, + "type": "array" +}
1 tool update
- Changed
draw_floor_plan11 fields changed- removed
Input schema / properties / doors / items / properties / width / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / doors / items / properties / width / minimumAdded value: +0.1 - removed
Input schema / properties / planId / formatRemoved value: -"uuid" - added
Input schema / properties / planId / maxLengthAdded value: +40 - removed
Input schema / properties / planId / patternRemoved value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - removed
Input schema / properties / rooms / items / properties / depth / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / rooms / items / properties / depth / minimumAdded value: +0.1 - removed
Input schema / properties / rooms / items / properties / width / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / rooms / items / properties / width / minimumAdded value: +0.1 - removed
Input schema / properties / windows / items / properties / width / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / windows / items / properties / width / minimumAdded value: +0.1
1 tool update
- Added
blur_faces_plates
1 tool update
- Added
watermark_photos
3 tool updates
- Added
draw_floor_plan - Added
straighten_photo - Added
view_pixly_photo
1 tool update
- Added
before_after_image
1 tool update
- Added
flythrough_video
Related MCP Connectors
Enhance, virtually stage and turn real estate listing photos into video with AI.
AI virtual staging for real estate — stage rooms, beautify floor plans, classify images.
AI virtual staging and architectural rendering: stage rooms, render interiors, exteriors, sketches.
AI virtual staging that doesn't change the house.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAI-powered virtual staging for real estate professionals: stage empty rooms with photorealistic furniture, beautify floor plans into 3D renders, classify rooms, generate German property descriptions, and get style recommendations.4MIT
- AlicenseNot gradedqualityBmaintenanceProvides AI assistants with real-estate visual tools including virtual staging, photo enhancement, decluttering, day-to-night conversion, plot signs, and cinematic property videos via the Pixly API.20 npmMIT

Luw MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI-driven interior, exterior, and landscape design, photoreal rendering, image editing, video generation, and 3D model creation directly inside Claude, Cursor, VS Code, and other MCP clients. It also supports virtual staging, sketching to render, texture and pattern generation, background removal, and architectural consultation through natural language.24149 npmMIT
Hermosoofficial
AlicenseAqualityAmaintenanceAI marketing agent and AI ad generator, 1,088 tools. Works as a Google Ads MCP, Meta Ads MCP, LinkedIn MCP, TikTok MCP, Instagram MCP and YouTube MCP in one server. Research competitors' winning ads, make on-brand image and video ads with your real product, publish and schedule to your own accounts, and run paid ads (new campaigns start paused). Free to start, no markup on models.2077,249 npm3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.