Skip to main content
Glama

Server Details

Every visual AI tool for property listings — staging, enhancement, decluttering, cinematic video.

Ownership verified
Status
Healthy
Uptime
99.8% over 76 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.9/5.0

Scored across 35 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness4/5

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 tools
before_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.

NameRequiredDescriptionDefault
aspectNoShape of the image: original (follows the photos), 1:1 square, 4:5 Instagram post, 9:16 Stories/Reels.original
labelsNoShow the Before / After labels.
layoutNoside = next to each other, stack = one above the other, vsplit = one frame split by a vertical line, diagonal = split by a slanted line.side
listingIdNoA 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.
afterLabelNoLabel text for the after photo, in the user's language (default "After").
afterR2PathNoStorage path of the after photo — the alternative to afterImageUrl.
beforeLabelNoLabel text for the before photo, in the user's language (default "Before").
beforeR2PathNoStorage path of the before photo — the alternative to beforeImageUrl. For a Pixly result, its original photo is the job's source.
afterImageUrlNoThe AFTER photo (e.g. the staged room, the dusk version). Public https URL or data: URI; or afterR2Path.
beforeImageUrlNoThe BEFORE photo (e.g. the empty room, the daylight shot). Public https URL or data: URI; or beforeR2Path.

Output Schema

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
formatNoVideo shape. original (default) keeps the photos' own shape; 9:16, 16:9 or 1:1 crop both photos, centred, to that shape first.original
listingIdNoA 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.
afterR2PathNoR2 path of the end frame — the alternative to afterImageUrl.
revealStyleNoHow the transformation is revealedsmooth
videoIntentNostaging_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
beforeR2PathNoR2 path of the start frame — the alternative to beforeImageUrl.
afterImageUrlNoEnd frame (e.g. the staged result) — https URL or data: URI
beforeImageUrlNoStart frame (e.g. the empty room photo) — https URL or data: URI
durationSecondsNo

Output Schema

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
facesNo
styleNoblur
photosYesThe photos, 1–5. Each item takes imageUrl or r2Path.
platesNo
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
formatNoVideo 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
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
directionNoThe 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.
listingIdNoA 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.
cameraMoveNoCamera-move presetzoom
durationSecondsNoClip 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
titleNoThe property in the user's words, e.g. "12 Oak St" — leave out if they skipped the question

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
filenameYesOriginal filename, used for the extension
sizeBytesNoExact byte size of the file. Recommended: when given it is signed into the URL, so the upload is bounded server-side.
contentTypeYesMIME type the PUT request will send

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
doorsNo
roomsYesEvery 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.
titleNoAddress or listing name for the plan's title block.
unitsNoUnits of every number below, and of the labels on the plan.m
planIdNoTo 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.
windowsNo
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
maskNoOptional 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.
styleNoOptional. 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.
r2PathNoStorage path of the photo to edit (a resultPaths entry, or an upload) — the alternative to imageUrl.
imageUrlNoThe 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.
listingIdNoA 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.
maskR2PathNoStorage path of a mask — the alternative to mask.
sourceJobIdNoJob the photo came from, when it is a Pixly result (lineage)
sourceResultIndexNoWhich of that job's results was edited
customInstructionsYesThe 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
titleNoOptional name for the tour, e.g. the street address.
formatNoFilm shape. Omit to follow the photos (landscape photos → 16:9).
photosYesThe 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.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_credit_balanceCredit BalanceA
Read-onlyIdempotent
Inspect

The user's current Pixly credit balance and plan.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 StatusA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
jobIdNoJob id returned by a generation tool
jobIdsNoSeveral job ids at once (a plan's steps): answers when all are done, or with where each one is

Output Schema

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 LibraryA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
typeNoFilter 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.
limitNo
listingIdNoOnly this property folder's results and photos (from list_listings)

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 FoldersA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
noteNoYour 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.
scopeNo'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.
styleNoThe 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).
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
includeNoWhich 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.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
modelNokling-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
soundNoAdd ambient sound (kling-v3 only; kling-2.6 is always silent).
formatNoVideo 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
promptNoYour own description of the video, in any language. Replaces cameraMove when set.
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoStart frame — where the video begins. Public https URL or data: URI; either imageUrl or r2Path is required.
endR2PathNoR2 path of the end frame — the alternative to endImageUrl.
listingIdNoA 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.
cameraMoveNoReady-made camera move used when no prompt is given.smooth
endImageUrlNoOptional 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.
durationSecondsNoClip length. kling-v3 takes 3, 5, 8, 10 or 15; kling-2.6 takes 5 or 10.

Output Schema

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
stepsNoWhat to do, step by step
photosNoEvery photo of the set, in order; steps refer to them by number (from 1)
listingIdNoA 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.
confirmationCodeNoThe 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
lookNoSign material/style; defaults server-side
textYesSign label, verbatim — a price ("$1,200,000"), area ("800 m²"), or short word ("SOLD")
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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.
orientationNoLetter orientation (letter looks only); defaults server-side

Output Schema

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
modeNoHow 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.
extrasNoExtra 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.
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
lookNoWhich 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.
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
lawnNoLawn style. 'auto' lets the tool pick a healthy lawn that suits the photo.auto
shadeNoHow green; only used with a chosen lawn style.medium
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
stripesNoMowing stripes: auto (stripes for fresh_mown and golf, none otherwise), on, off.auto
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
skyNoSky style. 'auto' lets the tool pick what suits the photo's light.auto
sunNoSun glow: auto (a glow for sunset/sunrise styles, none otherwise), on (place it with sunX/sunY), off.auto
sunXNoWith sun=on: glow position from the left edge, 0..1.
sunYNoWith sun=on: glow position from the top edge, 0..1 (kept in the top 60%).
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
seasonNoThe 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.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
looksNoThe 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.
notesNoYour 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.
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
coloursNoAny 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.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
surfacesNoWhich 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.
listingIdNoA 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.
referencesNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fixNoWhich 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.
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FolderA
DestructiveIdempotent
Inspect

Rename one of the user's property folders, only when they ask.

NameRequiredDescriptionDefault
titleYesIts new name
listingIdYesThe folder (from list_listings)

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
urlYesPublicly reachable image URL (JPG/PNG/WebP, max 10 MB) to import into Pixly

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 PhotoA
Read-onlyIdempotent
Inspect

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

NameRequiredDescriptionDefault
idYesThe library item: a job id (from a Pixly tool result, get_job or list_library), or "upload:<r2Path>" for an uploaded photo.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
styleYesInterior 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.
r2PathNoStorage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl.
imageUrlNoPublic https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required.
roomTypeNoRoom type hint; omit to let vision infer it from the photo
listingIdNoA 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.
numImagesNoIgnored — staging always returns one image. Call again for another take.
stagingQualityNoIgnored — the Pro tier is retired. Every staging costs 1 credit.
customInstructionsNoOptional: 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
sizeNomedium
textNoThe text, e.g. "Smith Realty · 555-0100". Optional when the account has a saved logo.
photosYesThe photos to mark, 1–10. Each item takes imageUrl or r2Path.
useLogoNoAdd the logo saved on the account (Pixly floor plan settings), when there is one.
positionNobottom-right
listingIdNoA 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

NameRequiredDescription
jobsNoSeveral jobs at once (get_job with jobIds, or a plan's steps): each one's jobId, status and results
noteNo
typeNo
errorNo
jobIdYesPass to get_job to poll
quoteNoPresent when status is "awaiting_confirmation": nothing ran and nothing was charged yet — the price and settings the user is asked to confirm
statusYespending | processing | completed | failed — anything not completed/failed is still running
createdAtNo
resultUrlsNoPresent when completed; valid 7 days
completedAtNo
resultPathsNoStorage path of each result — pass one as r2Path (or beforeR2Path, a photos[] item) to run another tool on this result
creditsChargedNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 30 tool updates
    • Changedbefore_after_image2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedbefore_after_reel2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedblur_faces_plates2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedcinematic_motion2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Addedcreate_listing
    • Changedday_to_night2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changeddeclutter_photo2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changeddraw_floor_plan2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changededit_staged_photo2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedenhance_photo2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedflythrough_video2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedget_job3 fields changed
      • addedInput schema / properties / jobIds
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "jobId"
        -]
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedlist_library1 field changed
      • addedInput schema / properties / listingId
        Added value: +{
        +  "description": "Only this property folder's results and photos (from list_listings)",
        +  "type": "string"
        +}
    • Addedlist_listings
    • Changedmakeover_exterior2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedphoto_to_video2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Addedplan_photos
    • Changedplot_sign2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedremove_furniture2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedrender_floor_plan2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedreplace_lawn2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedreplace_sky2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedreset_season2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedrestyle_room2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedstraighten_photo2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedtouch_up_exterior2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Addedupdate_listing
    • Changedupscale_hd2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedvirtual_staging2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
    • Changedwatermark_photos2 fields changed
      • addedInput schema / properties / listingId
        Added 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"
        +}
      • addedOutput schema / properties / jobs
        Added 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"
        +}
  2. 1 tool update
    • Changedvirtual_staging1 field changed
      • changedInput schema / properties / customInstructions / description
        Previous 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. 3 tool updates
    • Changedbefore_after_reel3 fields changed
      • changedInput schema / properties / format / default
        Previous value: -"9:16"New value: +"original"
      • addedInput schema / properties / format / description
        Added 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."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "9:16",
        -  "16:9",
        -  "1:1"
        -]New value: +[
        +  "original",
        +  "9:16",
        +  "16:9",
        +  "1:1"
        +]
    • Changedcinematic_motion3 fields changed
      • changedInput schema / properties / format / default
        Previous value: -"9:16"New value: +"original"
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "9:16",
        -  "16:9"
        -]New value: +[
        +  "original",
        +  "9:16",
        +  "16:9"
        +]
    • Changedphoto_to_video3 fields changed
      • changedInput schema / properties / format / default
        Previous value: -"16:9"New value: +"original"
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "16:9",
        -  "9:16",
        -  "1:1"
        -]New value: +[
        +  "original",
        +  "16:9",
        +  "9:16",
        +  "1:1"
        +]
  4. 25 tool updates
    • Changedbefore_after_image1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedbefore_after_reel1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedblur_faces_plates1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedcinematic_motion2 fields changed
      • changedInput schema / properties / durationSeconds / description
        Previous 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."
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedday_to_night1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changeddeclutter_photo1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changeddraw_floor_plan1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changededit_staged_photo1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedenhance_photo1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedflythrough_video1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedget_job1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedmakeover_exterior1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedphoto_to_video1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedplot_sign1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedremove_furniture1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedrender_floor_plan1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedreplace_lawn1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedreplace_sky1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedreset_season1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedrestyle_room1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedstraighten_photo1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedtouch_up_exterior1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedupscale_hd1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedvirtual_staging1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
    • Changedwatermark_photos1 field changed
      • addedOutput schema / properties / quote
        Added 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"
        +}
  5. 1 tool update
    • Changedrestyle_room2 fields changed
      • changedInput schema / properties / looks / description
        Previous 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."
      • changedInput schema / properties / surfaces / description
        Previous 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."
  6. 1 tool update
    • Changedrestyle_room4 fields changed
      • changedInput schema / properties / colours / description
        Previous 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."
      • changedInput schema / properties / looks / additionalProperties / enum
        Previous 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"
        +]
      • changedInput schema / properties / looks / description
        Previous 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."
      • addedInput schema / properties / references
        Added 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"
        +}
  7. 1 tool update
    • Changededit_staged_photo10 fields changed
      • changedInput schema / properties / customInstructions / description
        Previous 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\"."
      • changedInput schema / properties / imageUrl / description
        Previous 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."
      • addedInput schema / properties / mask
        Added 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"
        +}
      • addedInput schema / properties / maskR2Path
        Added value: +{
        +  "description": "Storage path of a mask — the alternative to mask.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / r2Path / description
        Previous 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."
      • changedInput schema / properties / sourceJobId / description
        Previous value: -"Job the edited result came from (lineage)"New value: +"Job the photo came from, when it is a Pixly result (lineage)"
      • changedInput schema / properties / sourceResultIndex / description
        Previous value: -"Which variation was edited"New value: +"Which of that job's results was edited"
      • changedInput schema / properties / style / description
        Previous 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."
      • removedInput schema / properties / style / minLength
        Removed value: -1
      • changedInput schema / required
        Previous value: -[
        -  "style",
        -  "customInstructions"
        -]New value: +[
        +  "customInstructions"
        +]
  8. 1 tool update
    • Changedrestyle_room3 fields changed
      • addedInput schema / properties / colours
        Added 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"
        +}
      • changedInput schema / properties / looks / additionalProperties / enum
        Previous 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"
        +]
      • changedInput schema / properties / looks / description
        Previous 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."
  9. 1 tool update
    • Changedvirtual_staging1 field changed
      • changedInput schema / properties / stagingQuality / description
        Previous 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."
  10. 1 tool update
    • Changeddraw_floor_plan1 field changed
      • changedInput schema / properties / planId / description
        Previous 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."
  11. 25 tool updates
    • Changedbefore_after_image1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedbefore_after_reel1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedblur_faces_plates1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedcinematic_motion1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedday_to_night1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changeddeclutter_photo1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changeddraw_floor_plan1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changededit_staged_photo1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedenhance_photo1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedflythrough_video1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedget_job1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedmakeover_exterior1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedphoto_to_video1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedplot_sign1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedremove_furniture1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedrender_floor_plan1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedreplace_lawn1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedreplace_sky1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedreset_season1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedrestyle_room1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedstraighten_photo1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedtouch_up_exterior1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedupscale_hd1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedvirtual_staging1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
    • Changedwatermark_photos1 field changed
      • addedOutput schema / properties / resultPaths
        Added 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"
        +}
  12. 1 tool update
    • Changeddraw_floor_plan11 fields changed
      • removedInput schema / properties / doors / items / properties / width / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / doors / items / properties / width / minimum
        Added value: +0.1
      • removedInput schema / properties / planId / format
        Removed value: -"uuid"
      • addedInput schema / properties / planId / maxLength
        Added value: +40
      • removedInput schema / properties / planId / pattern
        Removed 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)$"
      • removedInput schema / properties / rooms / items / properties / depth / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / rooms / items / properties / depth / minimum
        Added value: +0.1
      • removedInput schema / properties / rooms / items / properties / width / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / rooms / items / properties / width / minimum
        Added value: +0.1
      • removedInput schema / properties / windows / items / properties / width / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / windows / items / properties / width / minimum
        Added value: +0.1
  13. 1 tool update
    • Addedblur_faces_plates
  14. 1 tool update
    • Addedwatermark_photos
  15. 3 tool updates
    • Addeddraw_floor_plan
    • Addedstraighten_photo
    • Addedview_pixly_photo
  16. 1 tool update
    • Addedbefore_after_image
  17. 1 tool update
    • Addedflythrough_video

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides 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 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    24
    149 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    AI 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.
    207
    7,249 npm
    3
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources