_ registry / mcp streamable-http · checked 2h ago

pixly

https://pixly.app

Registry code: 58b0185ee6f84a16

api record

Pixly turns real-estate listing photos into staged photos and cinematic videos. Typical flow: a generation tool (virtual_staging, enhance_photo, cinematic_motion, …) with imageUrl → get_job until status is completed → download the result URLs. Photos go in as imageUrl: a public https URL or a base64-encoded data URI. A chat attachment is neither — if the file is local and you cannot upload bytes yourself, ask the user to add it at https://pixly.app/app, then call list_library with type "uploads" to get its r2Path. Generation tools spend credits from the signed-in user's Pixly balance;…

endpoint
https://pixly.app/api/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is pixly live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is pixly free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does pixly have?
35 tools: cinematic_motion, photo_to_video, remove_furniture, restyle_room, virtual_staging, before_after_reel, flythrough_video, watermark_photos, ….
Is pixly safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99.7%

90 days 99.8%· all time 99.8%

latency
226ms

last good check

priced tools
0

of 35 tools

_ answered our checks, 90 days 655 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • virtually stage a room photo
  • enhance listing photos
  • turn a photo into a video
  • draw a floor plan
takes → gives
images, text → images, video
tools
9 reads16 changes data
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 35 tools
1 auth-required 34 never probed 1 of 35 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • list_library reads auth-required 41d ago

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "type": {
          "enum": [
            "images",
            "videos",
            "uploads"
          ],
          "type": "string",
          "description": "Filter by media type. \"uploads\" lists the user's own source photos instead of generations — use it when they refer to a photo they added but have not run a tool on yet."
        },
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1
        },
        "listingId": {
          "type": "string",
          "description": "Only this property folder's results and photos (from list_listings)"
        }
      }
    }
    arguments 25 lines
  • cinematic_motion changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "format": {
          "enum": [
            "original",
            "9:16",
            "16:9"
          ],
          "type": "string",
          "default": "original",
          "description": "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."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "direction": {
          "enum": [
            "left-to-right",
            "right-to-left"
          ],
          "type": "string",
          "description": "The direction the camera travels, for the moves that have one (orbit, pan, drone-orbit). 'left-to-right' sends the camera rightward, 'right-to-left' leftward. Ignored by every other move; omit to use the move's own default."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "cameraMove": {
          "enum": [
            "zoom",
            "fly-through",
            "orbit",
            "pan",
            "aerial",
            "pull-back",
            "crane-up",
            "tilt-up",
            "boom-down",
            "drone-orbit",
            "flyover",
            "pull-away",
            "handheld"
          ],
          "type": "string",
          "default": "zoom",
          "description": "Camera-move preset"
        },
        "durationSeconds": {
          "anyOf": [
            {
              "type": "number",
              "const": 5
            },
            {
              "type": "number",
              "const": 10
            }
          ],
          "default": 5,
          "description": "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."
        }
      }
    }
    arguments 72 lines
  • photo_to_video changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "model": {
          "enum": [
            "kling-v3",
            "kling-2.6"
          ],
          "type": "string",
          "default": "kling-v3",
          "description": "kling-v3: 3/5/8/10/15 s, optional sound, lands most precisely on the end frame. kling-2.6: 5/10 s, silent, cheaper."
        },
        "sound": {
          "type": "boolean",
          "default": false,
          "description": "Add ambient sound (kling-v3 only; kling-2.6 is always silent)."
        },
        "format": {
          "enum": [
            "original",
            "16:9",
            "9:16",
            "1:1"
          ],
          "type": "string",
          "default": "original",
          "description": "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."
        },
        "prompt": {
          "type": "string",
          "maxLength": 1000,
          "description": "Your own description of the video, in any language. Replaces cameraMove when set."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Start frame — where the video begins. Public https URL or data: URI; either imageUrl or r2Path is required."
        },
        "endR2Path": {
          "type": "string",
          "minLength": 1,
          "description": "R2 path of the end frame — the alternative to endImageUrl."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "cameraMove": {
          "enum": [
            "smooth",
            "walk",
            "orbitLeft",
            "orbitRight",
            "pushIn",
            "pullBack",
            "riseUp"
          ],
          "type": "string",
          "default": "smooth",
          "description": "Ready-made camera move used when no prompt is given."
        },
        "endImageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Optional end frame — the camera travels from the start photo and lands exactly on this one. Best when both photos show the same space from different spots."
        },
        "durationSeconds": {
          "type": "integer",
          "default": 5,
          "maximum": 15,
          "minimum": 3,
          "description": "Clip length. kling-v3 takes 3, 5, 8, 10 or 15; kling-2.6 takes 5 or 10."
        }
      }
    }
    arguments 81 lines
  • remove_furniture changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "mode": {
          "enum": [
            "movable",
            "fitted"
          ],
          "type": "string",
          "description": "How far to strip the room. 'fitted' (the default) removes the movable contents AND the room's own joinery — the fitted kitchen and its appliances, built-in wardrobes and shelving, and bathroom sanitaryware. 'movable' removes only furniture, rugs, curtains, art, plants and lamps, leaving the kitchen, built-ins, sanitaryware, floor and doors exactly as they are."
        },
        "extras": {
          "type": "array",
          "items": {
            "enum": [
              "floor"
            ],
            "type": "string"
          },
          "description": "Extra things to take out, for a full strip-back. Only applies with mode 'fitted' and is ignored otherwise: 'floor' takes the floor covering down to bare concrete screed. Omit to keep the floor. Doors always stay, as do walls, ceiling, windows, structural openings and the camera."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 38 lines
  • restyle_room changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "looks": {
          "type": "object",
          "description": "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.",
          "propertyNames": {
            "enum": [
              "walls",
              "floor",
              "cabinets",
              "bathroom_tiles",
              "furniture"
            ],
            "type": "string"
          },
          "additionalProperties": {
            "enum": [
              "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"
            ],
            "type": "string"
          }
        },
        "notes": {
          "type": "object",
          "description": "Your own description of the finish for a surface, used when that surface's look is \"custom\" (e.g. \"terracotta hex tiles with dark grout\"). Set look \"custom\" and the note together; \"custom\" with no note falls back to \"auto\". 120 characters max, and anything in it that is not a description of a finish is ignored.",
          "propertyNames": {
            "enum": [
              "walls",
              "floor",
              "cabinets",
              "bathroom_tiles",
              "furniture"
            ],
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "colours": {
          "type": "object",
          "description": "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.",
          "propertyNames": {
            "enum": [
              "walls",
              "floor",
              "cabinets",
              "bathroom_tiles",
              "furniture"
            ],
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "surfaces": {
          "type": "array",
          "items": {
            "enum": [
              "walls",
              "floor",
              "cabinets",
              "bathroom_tiles",
              "furniture"
            ],
            "type": "string"
          },
          "description": "Which surfaces get a new finish: 'walls', 'floor', 'cabinets' (fitted joinery plus its worktop and splashback), 'bathroom_tiles' (the tiled walls; a bathroom floor is 'floor') or 'furniture' (upholstery and wood finishes). Omit for walls. The room's layout, fittings and camera never change."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "references": {
          "type": "object",
          "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"
          },
          "additionalProperties": {
            "type": "string"
          }
        }
      }
    }
    arguments 175 lines
  • virtual_staging changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "style"
      ],
      "properties": {
        "style": {
          "type": "string",
          "examples": [
            "modern-minimal",
            "scandinavian",
            "industrial",
            "mid-century-modern",
            "japandi"
          ],
          "minLength": 1,
          "description": "Interior style id. One of: modern-minimal, scandinavian, industrial, mid-century-modern, japandi, contemporary, transitional, urban-chic, bauhaus, organic-modern, brutalist, italian-modern, traditional, art-deco, colonial, victorian, french-country, english-cottage, neoclassical, art-nouveau, grandmillennial, hollywood-regency, parisian-chic, modern-classic, craftsman, mediterranean, mediterranean-modern, rustic-farmhouse, bohemian, tropical, family-staging, hygge, wabi-sabi, modern-farmhouse, cottagecore, shabby-chic, cabin-lodge, eclectic, retro-70s, warm-luxury, investor-premium, contemporary-dark, glam, penthouse-modern, hotel-suite, maximalist, quiet-luxury, coastal, desert-modern, hacienda, pacific-northwest, caribbean-resort, hamptons, moroccan, tuscan, southwestern, asian-zen, coastal-grandmother, cape-cod, california-casual, mountain-modern. When the user has no preference, \"modern-minimal\" or \"scandinavian\" suit most listings."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "roomType": {
          "type": "string",
          "description": "Room type hint; omit to let vision infer it from the photo"
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "numImages": {
          "type": "integer",
          "default": 1,
          "maximum": 4,
          "minimum": 1,
          "deprecated": true,
          "description": "Ignored — staging always returns one image. Call again for another take."
        },
        "stagingQuality": {
          "enum": [
            "standard",
            "pro"
          ],
          "type": "string",
          "deprecated": true,
          "description": "Ignored — the Pro tier is retired. Every staging costs 1 credit."
        },
        "customInstructions": {
          "type": "string",
          "description": "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."
        }
      }
    }
    arguments 60 lines
  • before_after_reel changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "format": {
          "enum": [
            "original",
            "9:16",
            "16:9",
            "1:1"
          ],
          "type": "string",
          "default": "original",
          "description": "Video shape. original (default) keeps the photos' own shape; 9:16, 16:9 or 1:1 crop both photos, centred, to that shape first."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "afterR2Path": {
          "type": "string",
          "minLength": 1,
          "description": "R2 path of the end frame — the alternative to afterImageUrl."
        },
        "revealStyle": {
          "enum": [
            "smooth",
            "slideIn",
            "dropLand",
            "glowBuild",
            "movers"
          ],
          "type": "string",
          "default": "smooth",
          "description": "How the transformation is revealed"
        },
        "videoIntent": {
          "enum": [
            "staging_reveal",
            "staging_reveal_reverse",
            "construction_timelapse",
            "day_to_night"
          ],
          "type": "string",
          "default": "staging_reveal",
          "description": "staging_reveal: an empty room becoming a furnished one (or a renovation). day_to_night: Before is a daylight photo and After its dusk version (a Pixly Day to Night result and its original) — the video turns day into the lit evening; revealStyle does not apply."
        },
        "beforeR2Path": {
          "type": "string",
          "minLength": 1,
          "description": "R2 path of the start frame — the alternative to beforeImageUrl."
        },
        "afterImageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "End frame (e.g. the staged result) — https URL or data: URI"
        },
        "beforeImageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Start frame (e.g. the empty room photo) — https URL or data: URI"
        },
        "durationSeconds": {
          "anyOf": [
            {
              "type": "number",
              "const": 5
            },
            {
              "type": "number",
              "const": 10
            }
          ],
          "default": 5
        }
      }
    }
    arguments 77 lines
  • flythrough_video unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "photos"
      ],
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 80,
          "description": "Optional name for the tour, e.g. the street address."
        },
        "format": {
          "enum": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "type": "string",
          "description": "Film shape. Omit to follow the photos (landscape photos → 16:9)."
        },
        "photos": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "r2Path": {
                "type": "string",
                "minLength": 1,
                "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
              },
              "imageUrl": {
                "type": "string",
                "minLength": 1,
                "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
              }
            }
          },
          "maxItems": 4,
          "minItems": 2,
          "description": "The rooms in walking order, 2 to 4 photos (e.g. hallway → living room → kitchen). Each photo should show the doorway or opening into the next room — the camera flies through it. Each item takes imageUrl or r2Path."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 48 lines
  • watermark_photos unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "photos"
      ],
      "properties": {
        "size": {
          "enum": [
            "small",
            "medium",
            "large"
          ],
          "type": "string",
          "default": "medium"
        },
        "text": {
          "type": "string",
          "maxLength": 60,
          "description": "The text, e.g. \"Smith Realty · 555-0100\". Optional when the account has a saved logo."
        },
        "photos": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "r2Path": {
                "type": "string",
                "minLength": 1,
                "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
              },
              "imageUrl": {
                "type": "string",
                "minLength": 1,
                "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
              }
            }
          },
          "maxItems": 10,
          "minItems": 1,
          "description": "The photos to mark, 1–10. Each item takes imageUrl or r2Path."
        },
        "useLogo": {
          "type": "boolean",
          "default": true,
          "description": "Add the logo saved on the account (Pixly floor plan settings), when there is one."
        },
        "position": {
          "enum": [
            "bottom-right",
            "bottom-left",
            "top-right",
            "top-left",
            "center"
          ],
          "type": "string",
          "default": "bottom-right"
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 64 lines
  • blur_faces_plates reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "photos"
      ],
      "properties": {
        "faces": {
          "type": "boolean",
          "default": true
        },
        "style": {
          "enum": [
            "blur",
            "pixelate"
          ],
          "type": "string",
          "default": "blur"
        },
        "photos": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "r2Path": {
                "type": "string",
                "minLength": 1,
                "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
              },
              "imageUrl": {
                "type": "string",
                "minLength": 1,
                "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
              }
            }
          },
          "maxItems": 5,
          "minItems": 1,
          "description": "The photos, 1–5. Each item takes imageUrl or r2Path."
        },
        "plates": {
          "type": "boolean",
          "default": true
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 50 lines
  • straighten_photo reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 20 lines
  • draw_floor_plan reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "rooms"
      ],
      "properties": {
        "doors": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "to": {
                "type": "string",
                "description": "Another room id that shares a wall with it, or \"outside\"."
              },
              "from": {
                "type": "string",
                "description": "A room id."
              },
              "kind": {
                "enum": [
                  "door",
                  "doorway",
                  "sliding"
                ],
                "type": "string",
                "default": "door",
                "description": "door = hinged door, doorway = open gap with no door, sliding = sliding/patio door."
              },
              "side": {
                "enum": [
                  "top",
                  "right",
                  "bottom",
                  "left"
                ],
                "type": "string",
                "description": "Only for to = \"outside\": which wall of the room the entrance is on."
              },
              "width": {
                "type": "number",
                "minimum": 0.1
              }
            }
          },
          "default": [],
          "maxItems": 60
        },
        "rooms": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "type",
              "x",
              "y",
              "width",
              "depth"
            ],
            "properties": {
              "x": {
                "type": "number",
                "description": "Left edge. The plan's x runs to the right."
              },
              "y": {
                "type": "number",
                "description": "Top edge. The plan's y runs DOWN (the top of the drawing is 0)."
              },
              "id": {
                "type": "string",
                "maxLength": 30,
                "minLength": 1,
                "description": "Your own short handle for the room (\"kitchen\", \"bed1\"); doors and windows refer to it."
              },
              "name": {
                "type": "string",
                "maxLength": 40,
                "description": "Label on the plan when the type isn't enough (\"Bedroom 2\", \"Master bedroom\")."
              },
              "type": {
                "enum": [
                  "living",
                  "kitchen",
                  "dining",
                  "bedroom",
                  "bathroom",
                  "wc",
                  "hall",
                  "office",
                  "laundry",
                  "storage",
                  "garage",
                  "balcony",
                  "terrace",
                  "utility",
                  "other"
                ],
                "type": "string",
                "description": "What the room is; sets its colour and default label."
              },
              "depth": {
                "type": "number",
                "minimum": 0.1,
                "description": "Size along y."
              },
              "width": {
                "type": "number",
                "minimum": 0.1,
                "description": "Size along x."
              }
            }
          },
          "maxItems": 40,
          "minItems": 1,
          "description": "Every room as an axis-aligned rectangle. Neighbouring rooms must share the wall exactly (one's right edge = the other's left edge) and must not overlap. An L-shaped space = two rectangles joined by a doorway. Lay out a typical sensible plan when the user gives only rough sizes."
        },
        "title": {
          "type": "string",
          "maxLength": 80,
          "description": "Address or listing name for the plan's title block."
        },
        "units": {
          "enum": [
            "m",
            "ft"
          ],
          "type": "string",
          "default": "m",
          "description": "Units of every number below, and of the labels on the plan."
        },
        "planId": {
          "type": "string",
          "maxLength": 40,
          "description": "To CHANGE a plan you drew before: its planId from that result, with the whole updated layout — saved as a new plan beside it (nothing is overwritten). Omit for a new plan."
        },
        "windows": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "room",
              "side"
            ],
            "properties": {
              "full": {
                "type": "boolean",
                "default": false,
                "description": "Floor-to-ceiling glass (French window, balcony door)."
              },
              "room": {
                "type": "string",
                "description": "A room id."
              },
              "side": {
                "enum": [
                  "top",
                  "right",
                  "bottom",
                  "left"
                ],
                "type": "string",
                "description": "Which wall; it must be an outside wall (not shared with another room)."
              },
              "count": {
                "type": "integer",
                "default": 1,
                "maximum": 4,
                "minimum": 1
              },
              "width": {
                "type": "number",
                "minimum": 0.1
              }
            }
          },
          "default": [],
          "maxItems": 80
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 190 lines
  • enhance_photo changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 20 lines
  • declutter_photo changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 20 lines
  • replace_lawn unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "lawn": {
          "enum": [
            "auto",
            "fresh_mown",
            "lush",
            "natural",
            "golf",
            "warm_season"
          ],
          "type": "string",
          "default": "auto",
          "description": "Lawn style. 'auto' lets the tool pick a healthy lawn that suits the photo."
        },
        "shade": {
          "enum": [
            "light",
            "medium",
            "deep"
          ],
          "type": "string",
          "default": "medium",
          "description": "How green; only used with a chosen lawn style."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "stripes": {
          "enum": [
            "auto",
            "on",
            "off"
          ],
          "type": "string",
          "default": "auto",
          "description": "Mowing stripes: auto (stripes for fresh_mown and golf, none otherwise), on, off."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 53 lines
  • reset_season changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "season": {
          "enum": [
            "auto",
            "spring",
            "summer",
            "autumn",
            "winter"
          ],
          "type": "string",
          "description": "The season to show the property in: 'spring', 'summer', 'autumn', 'winter', or 'auto' (the default — the tool shows the property at its best, which for a snowy or dormant photo means high summer). Only the planting, the ground cover and the daylight change; the house, the driveway, the paths and the framing stay exactly as shot."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 31 lines
  • makeover_exterior unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "note": {
          "type": "string",
          "description": "Your own words about the garden you want (e.g. \"a small kidney-shaped pool with a stone surround and lavender everywhere\"). 160 characters max; anything in it that is not a description of the garden is ignored."
        },
        "scope": {
          "enum": [
            "add",
            "full"
          ],
          "type": "string",
          "description": "'full' (the default) redesigns the whole yard in the style; 'add' keeps the existing garden and builds the chosen elements into it. The house, the driveway and the neighbours never change either way."
        },
        "style": {
          "enum": [
            "auto",
            "modern_minimal",
            "mediterranean",
            "classic_english",
            "natural_lowwater",
            "tropical_resort",
            "farmhouse"
          ],
          "type": "string",
          "description": "The design language of the whole scheme: 'modern_minimal', 'mediterranean', 'classic_english', 'natural_lowwater', 'tropical_resort', 'farmhouse', or 'auto' (the default — chosen to suit the house's architecture and the climate in the photo)."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "include": {
          "type": "array",
          "items": {
            "enum": [
              "planting",
              "patio_dining",
              "deck_lounge",
              "pool",
              "pergola",
              "fire_pit",
              "fence_gate",
              "lighting"
            ],
            "type": "string"
          },
          "description": "Which elements the scheme includes, any number: 'planting' (beds, hedges, a feature tree), 'patio_dining' (a paved terrace with a dining set), 'deck_lounge' (a deck with loungers or a low sofa), 'pool', 'pergola', 'fire_pit', 'fence_gate' (a boundary treatment with a gate), 'lighting'. Omit or send an empty list (the default) to let the tool design what the lot wants. One run composes them all into one garden, each sized to the plot."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 62 lines
  • render_floor_plan changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "look": {
          "enum": [
            "furnished",
            "isometric"
          ],
          "type": "string",
          "description": "Which picture to make of the plan: 'furnished' (the default — a polished top-down 2D plan with real floors, furniture and room names) or 'isometric' (a 3D cutaway of the same layout, furnished, no text). The photo must show a floor plan: a hand sketch, a brochure page, a blueprint, a screenshot. The layout is kept exactly as drawn; written dimensions are left off."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 28 lines
  • touch_up_exterior unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "fix": {
          "type": "array",
          "items": {
            "enum": [
              "sky",
              "lawn",
              "hardscape",
              "clutter"
            ],
            "type": "string"
          },
          "description": "Which areas the tool may touch: 'sky', 'lawn', 'hardscape' (driveway, paths, patio), 'clutter' (bins, hoses, tools, a stray vehicle). Omit for all four; each is fixed only where the photo needs it."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 33 lines
  • upscale_hd changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 20 lines
  • plot_sign changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "text"
      ],
      "properties": {
        "look": {
          "enum": [
            "stone",
            "metal",
            "grass",
            "sign"
          ],
          "type": "string",
          "description": "Sign material/style; defaults server-side"
        },
        "text": {
          "type": "string",
          "maxLength": 24,
          "minLength": 1,
          "description": "Sign label, verbatim — a price (\"$1,200,000\"), area (\"800 m²\"), or short word (\"SOLD\")"
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "orientation": {
          "enum": [
            "standing",
            "lying"
          ],
          "type": "string",
          "description": "Letter orientation (letter looks only); defaults server-side"
        }
      }
    }
    arguments 47 lines
  • upload_image_from_url changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "description": "Publicly reachable image URL (JPG/PNG/WebP, max 10 MB) to import into Pixly"
        }
      }
    }
    arguments 14 lines
  • create_upload_ticket changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "filename",
        "contentType"
      ],
      "properties": {
        "filename": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Original filename, used for the extension"
        },
        "sizeBytes": {
          "type": "integer",
          "maximum": 10485760,
          "description": "Exact byte size of the file. Recommended: when given it is signed into the URL, so the upload is bounded server-side.",
          "exclusiveMinimum": 0
        },
        "contentType": {
          "enum": [
            "image/jpeg",
            "image/png",
            "image/webp",
            "image/heic",
            "image/heif",
            "image/tiff"
          ],
          "type": "string",
          "description": "MIME type the PUT request will send"
        }
      }
    }
    arguments 34 lines
  • view_pixly_photo reads unknown never probed

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

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The library item: a job id (from a Pixly tool result, get_job or list_library), or \"upload:<r2Path>\" for an uploaded photo."
        }
      }
    }
    arguments 14 lines
  • get_credit_balance reads unknown never probed

    The user's current Pixly credit balance and plan.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {}
    }
    arguments 5 lines
  • create_listing unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 120,
          "description": "The property in the user's words, e.g. \"12 Oak St\" — leave out if they skipped the question"
        }
      }
    }
    arguments 11 lines
  • update_listing unknown never probed

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

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "listingId",
        "title"
      ],
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Its new name"
        },
        "listingId": {
          "type": "string",
          "description": "The folder (from list_listings)"
        }
      }
    }
    arguments 20 lines
  • plan_photos unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "tool"
            ],
            "properties": {
              "tool": {
                "enum": [
                  "straighten_photo",
                  "enhance_photo",
                  "replace_sky",
                  "replace_lawn",
                  "touch_up_exterior",
                  "day_to_night",
                  "reset_season",
                  "virtual_staging",
                  "declutter_photo",
                  "remove_furniture",
                  "upscale_hd",
                  "blur_faces_plates"
                ],
                "type": "string",
                "description": "The tool for this step"
              },
              "after": {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 0,
                "description": "Instead of photo: the index (from 0) of an earlier step whose result this step works on"
              },
              "photo": {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 1,
                "description": "Which photo this step works on (from 1)"
              },
              "options": {
                "type": "object",
                "description": "The tool's own options, only what the user asked for (e.g. {\"style\": \"scandinavian\"})",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              }
            }
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "What to do, step by step"
        },
        "photos": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "r2Path": {
                "type": "string",
                "description": "A Pixly storage path (a resultPaths entry)"
              },
              "imageUrl": {
                "type": "string",
                "description": "Public URL of the photo"
              }
            }
          },
          "maxItems": 12,
          "minItems": 1,
          "description": "Every photo of the set, in order; steps refer to them by number (from 1)"
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "confirmationCode": {
          "type": "string",
          "description": "The plan's confirmationCode — only after the user agreed to the plan. Starts the steps whose photo is ready; call again with it later to start steps that work on earlier results."
        }
      }
    }
    arguments 85 lines
  • get_checkout_link reads unknown never probed

    Use when a tool fails for lack of credits or a plan. Returns a Stripe Checkout URL for the user to pay on — this never charges anything by itself, and you cannot pay for them. With no active plan it is a subscription (plans: starter (Starter: $5.99/week, 20 credits); agent (Agent: $19.99/month, 100 credits); pro_agent (Pro Agent: $49.99/month, 300 credits); team (Team: $149.99/month, 1000 credits)); with a plan it is a one-time credit top-up. After they pay, credits arrive in seconds: check get_credit_balance, then run the tool again.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "plan": {
          "enum": [
            "starter",
            "agent",
            "pro_agent",
            "team"
          ],
          "type": "string",
          "description": "Plan to subscribe to, for an account with no active plan. Defaults to \"starter\". Ignored for a top-up."
        },
        "topUpUsd": {
          "type": "number",
          "maximum": 500,
          "minimum": 10,
          "description": "For an account that already has a plan: one-time credit top-up amount in USD (10–500, default 10), priced at that plan's rate."
        }
      }
    }
    arguments 22 lines
  • edit_staged_photo changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customInstructions"
      ],
      "properties": {
        "mask": {
          "type": "string",
          "minLength": 1,
          "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."
        },
        "style": {
          "type": "string",
          "description": "Optional. Style id of the staging being edited (the ids virtual_staging takes). Left out, it is read from the photo's history; a photo that was never staged needs none."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of the photo to edit (a resultPaths entry, or an upload) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "The photo to edit: a Pixly result (a resultUrls entry), the user's own photo, or any public image URL / data:image URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "maskR2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a mask — the alternative to mask."
        },
        "sourceJobId": {
          "type": "string",
          "description": "Job the photo came from, when it is a Pixly result (lineage)"
        },
        "sourceResultIndex": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "Which of that job's results was edited"
        },
        "customInstructions": {
          "type": "string",
          "minLength": 1,
          "description": "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\"."
        }
      }
    }
    arguments 52 lines
  • before_after_image reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "aspect": {
          "enum": [
            "original",
            "1:1",
            "4:5",
            "9:16"
          ],
          "type": "string",
          "default": "original",
          "description": "Shape of the image: original (follows the photos), 1:1 square, 4:5 Instagram post, 9:16 Stories/Reels."
        },
        "labels": {
          "type": "boolean",
          "default": true,
          "description": "Show the Before / After labels."
        },
        "layout": {
          "enum": [
            "side",
            "stack",
            "vsplit",
            "diagonal"
          ],
          "type": "string",
          "default": "side",
          "description": "side = next to each other, stack = one above the other, vsplit = one frame split by a vertical line, diagonal = split by a slanted line."
        },
        "listingId": {
          "type": "string",
          "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."
        },
        "afterLabel": {
          "type": "string",
          "maxLength": 24,
          "description": "Label text for the after photo, in the user's language (default \"After\")."
        },
        "afterR2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of the after photo — the alternative to afterImageUrl."
        },
        "beforeLabel": {
          "type": "string",
          "maxLength": 24,
          "description": "Label text for the before photo, in the user's language (default \"Before\")."
        },
        "beforeR2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of the before photo — the alternative to beforeImageUrl. For a Pixly result, its original photo is the job's source."
        },
        "afterImageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "The AFTER photo (e.g. the staged room, the dusk version). Public https URL or data: URI; or afterR2Path."
        },
        "beforeImageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "The BEFORE photo (e.g. the empty room, the daylight shot). Public https URL or data: URI; or beforeR2Path."
        }
      }
    }
    arguments 67 lines
  • day_to_night unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 20 lines
  • replace_sky changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "sky": {
          "enum": [
            "auto",
            "clear",
            "light_clouds",
            "dramatic_clouds",
            "sunset",
            "pastel_sunrise",
            "winter_clear"
          ],
          "type": "string",
          "default": "auto",
          "description": "Sky style. 'auto' lets the tool pick what suits the photo's light."
        },
        "sun": {
          "enum": [
            "auto",
            "on",
            "off"
          ],
          "type": "string",
          "default": "auto",
          "description": "Sun glow: auto (a glow for sunset/sunrise styles, none otherwise), on (place it with sunX/sunY), off."
        },
        "sunX": {
          "type": "number",
          "maximum": 1,
          "minimum": 0,
          "description": "With sun=on: glow position from the left edge, 0..1."
        },
        "sunY": {
          "type": "number",
          "maximum": 1,
          "minimum": 0,
          "description": "With sun=on: glow position from the top edge, 0..1 (kept in the top 60%)."
        },
        "r2Path": {
          "type": "string",
          "minLength": 1,
          "description": "Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl."
        },
        "imageUrl": {
          "type": "string",
          "minLength": 1,
          "description": "Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required."
        },
        "listingId": {
          "type": "string",
          "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."
        }
      }
    }
    arguments 56 lines
  • get_job reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "jobId": {
          "type": "string",
          "minLength": 1,
          "description": "Job id returned by a generation tool"
        },
        "jobIds": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "Several job ids at once (a plan's steps): answers when all are done, or with where each one is"
        }
      }
    }
    arguments 21 lines
  • list_listings unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {}
    }
    arguments 5 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 58b0185ee6f84a16.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/58b0185ee6f84a16/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/58b0185ee6f84a16/badge.svg)](https://brick.blue/agent/58b0185ee6f84a16?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.