← WebMCP Directory

Tool tree

floortris.floortris.workers.dev

AI & AgentsTools verified
Website
A room planner people and agents share through native WebMCP. Agents create proposals; humans review and Apply.
Explore capabilities
    generateRoomAction

    Create a separate furnished room proposal in centimetres. For an L-shape or nook, pass floorPlan as 4–24 ordered rectilinear corner points; width/depth are its bounding box. Points define wall-1, wall-2, etc. in order, and openings on a custom plan name segmentId plus its outward wall direction. When interpreting a drawing, include measurementContext with labelled/provider/confirmed/inferred/estimated provenance and assumptions. The human alone applies it. Check the returned validation, brief and omissions. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "generateRoom",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a separate furnished room proposal in centimetres. For an L-shape or nook, pass floorPlan as 4–24 ordered rectilinear corner points; width/depth are its bounding box. Points define wall-1, wall-2, etc. in order, and openings on a custom plan name segmentId plus its outward wall direction. When interpreting a drawing, include measurementContext with labelled/provider/confirmed/inferred/estimated provenance and assumptions. The human alone applies it. Check the returned validation, brief and omissions. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "widthCm": {
            "type": "number",
            "minimum": 240,
            "maximum": 1000
          },
          "depthCm": {
            "type": "number",
            "minimum": 240,
            "maximum": 1000
          },
          "floorPlan": {
            "type": "object",
            "properties": {
              "kind": {
                "enum": [
                  "rectilinear"
                ]
              },
              "points": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "xCm": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1000
                    },
                    "yCm": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1000
                    }
                  },
                  "required": [
                    "xCm",
                    "yCm"
                  ],
                  "additionalProperties": false
                },
                "minItems": 4,
                "maxItems": 24
              }
            },
            "required": [
              "kind",
              "points"
            ],
            "additionalProperties": false
          },
          "profile": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "kind": {
                    "enum": [
                      "lounge"
                    ]
                  }
                },
                "required": [
                  "kind"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "kind": {
                    "enum": [
                      "bedroom"
                    ]
                  },
                  "sleeping": {
                    "enum": [
                      "single",
                      "double",
                      "king"
                    ]
                  },
                  "workspace": {
                    "type": "boolean"
                  },
                  "storage": {
                    "type": "boolean"
                  },
                  "bedsideQuantity": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 2
                  }
                },
                "required": [
                  "kind",
                  "sleeping",
                  "workspace",
                  "storage"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "kind": {
                    "enum": [
                      "home_office"
                    ]
                  },
                  "seating": {
                    "type": "boolean"
                  },
                  "storage": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "kind",
                  "seating",
                  "storage"
                ],
                "additionalProperties": false
              }
            ]
          },
          "openings": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "wall": {
                      "type": "string",
                      "enum": [
                        "north",
                        "east",
                        "south",
                        "west"
                      ]
                    },
                    "segmentId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "offsetCm": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1000
                    },
                    "widthCm": {
                      "type": "number",
                      "minimum": 20,
                      "maximum": 400
                    },
                    "kind": {
                      "enum": [
                        "door"
                      ]
                    },
                    "hinge": {
                      "enum": [
                        "start",
                        "end"
                      ]
                    },
                    "swing": {
                      "enum": [
                        "in",
                        "out"
                      ]
                    },
                    "angle": {
                      "enum": [
                        90
                      ]
                    },
                    "mechanism": {
                      "enum": [
                        "hinged",
                        "pocket",
                        "bifold",
                        "sliding"
                      ]
                    },
                    "entrance": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "kind",
                    "wall",
                    "offsetCm",
                    "widthCm",
                    "hinge",
                    "swing",
                    "angle",
                    "mechanism",
                    "entrance"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "wall": {
                      "type": "string",
                      "enum": [
                        "north",
                        "east",
                        "south",
                        "west"
                      ]
                    },
                    "segmentId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "offsetCm": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1000
                    },
                    "widthCm": {
                      "type": "number",
                      "minimum": 20,
                      "maximum": 400
                    },
                    "kind": {
                      "enum": [
                        "window"
                      ]
                    },
                    "sillCm": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 500
                    },
                    "headCm": {
                      "type": "number",
                      "minimum": 1,
                      "maximum": 500
                    },
                    "type": {
                      "enum": [
                        "fixed",
                        "side_hinge",
                        "sash",
                        "unknown"
                      ]
                    },
                    "windowAccess": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "kind",
                    "wall",
                    "offsetCm",
                    "widthCm",
                    "sillCm",
                    "headCm",
                    "type",
                    "windowAccess"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "maxItems": 12
          },
          "measurementContext": {
            "type": "object",
            "properties": {
              "records": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "source": {
                      "enum": [
                        "labelled",
                        "provider",
                        "human_confirmed",
                        "inferred",
                        "estimated"
                      ]
                    },
                    "confidence": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1
                    },
                    "note": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 300
                    }
                  },
                  "required": [
                    "target",
                    "source",
                    "confidence"
                  ],
                  "additionalProperties": false
                },
                "maxItems": 60
              },
              "assumptions": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300
                },
                "maxItems": 30
              }
            },
            "required": [
              "records",
              "assumptions"
            ],
            "additionalProperties": false
          },
          "appearance": {
            "type": "object",
            "properties": {
              "wall": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "floor": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "furniture": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "variantIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "maxItems": 8
          },
          "quantities": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "variantId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "quantity": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 4
                }
              },
              "required": [
                "variantId",
                "quantity"
              ],
              "additionalProperties": false
            },
            "maxItems": 8
          },
          "idempotencyKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "name",
          "widthCm",
          "depthCm",
          "profile",
          "openings",
          "idempotencyKey"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    getRoomStateAnswer

    Read accepted room, rules, authoritative ownership, revision and brief. Coordinates are centimetres, grid origin top-left; x east and y south. Never changes the selected view. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "getRoomState",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read accepted room, rules, authoritative ownership, revision and brief. Coordinates are centimetres, grid origin top-left; x east and y south. Never changes the selected view. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "which": {
            "enum": [
              "current",
              "proposal"
            ]
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          }
        },
        "required": [
          "which"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    listFurnitureAnswer

    List placed pieces and authoritative owned inventory with measured sizes and locks. Read only. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "listFurniture",
      "kind": "answer",
      "impl": "imperative",
      "description": "List placed pieces and authoritative owned inventory with measured sizes and locks. Read only. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "which": {
            "enum": [
              "current",
              "proposal"
            ]
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "which"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    listCatalogueAnswer

    List named furniture, made-to-window treatments and lighting variants plus local wall/floor palettes. Window treatments require attachedOpeningId; wall lights require wallAnchor; table lamps require supportObjectId. Results page via offset/limit; check hasMore. Read only. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "listCatalogue",
      "kind": "answer",
      "impl": "imperative",
      "description": "List named furniture, made-to-window treatments and lighting variants plus local wall/floor palettes. Window treatments require attachedOpeningId; wall lights require wallAnchor; table lamps require supportObjectId. Results page via offset/limit; check hasMore. Read only. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "sofa",
              "chair",
              "table",
              "coffee_table",
              "desk",
              "storage",
              "bed",
              "tv",
              "rug",
              "plant",
              "window_treatment",
              "ceiling_light",
              "wall_light",
              "floor_lamp",
              "table_lamp",
              "other"
            ]
          },
          "profile": {
            "type": "string",
            "enum": [
              "lounge",
              "bedroom",
              "home_office",
              "bathroom_concept"
            ]
          },
          "tag": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    createProposalAction

    Create a layout draft copied from Current, or a setup draft for human confirmation. Never overwrites an active draft. Requires accepted current/rule revisions and an idempotency key. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "createProposal",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a layout draft copied from Current, or a setup draft for human confirmation. Never overwrites an active draft. Requires accepted current/rule revisions and an idempotency key. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "enum": [
              "layout",
              "setup"
            ]
          },
          "expectedCurrentRevision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "expectedRuleRevision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "idempotencyKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "kind",
          "expectedCurrentRevision",
          "expectedRuleRevision",
          "idempotencyKey"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    setRoomGeometryAction

    Stage room bounding dimensions, name, or a measured rectilinear floorPlan. Custom points define wall-1, wall-2, etc. in order; pass null to return to the rectangular bounding box. Human Confirm room inputs is required. Existing fixed fixtures and openings are revalidated against the new outline. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "setRoomGeometry",
      "kind": "act",
      "impl": "imperative",
      "description": "Stage room bounding dimensions, name, or a measured rectilinear floorPlan. Custom points define wall-1, wall-2, etc. in order; pass null to return to the rectangular bounding box. Human Confirm room inputs is required. Existing fixed fixtures and openings are revalidated against the new outline. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "widthCm": {
            "type": "number",
            "minimum": 240,
            "maximum": 1000
          },
          "depthCm": {
            "type": "number",
            "minimum": 240,
            "maximum": 1000
          },
          "floorPlan": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "kind": {
                    "enum": [
                      "rectilinear"
                    ]
                  },
                  "points": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "xCm": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1000
                        },
                        "yCm": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1000
                        }
                      },
                      "required": [
                        "xCm",
                        "yCm"
                      ],
                      "additionalProperties": false
                    },
                    "minItems": 4,
                    "maxItems": 24
                  }
                },
                "required": [
                  "kind",
                  "points"
                ],
                "additionalProperties": false
              },
              {
                "enum": [
                  null
                ]
              }
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "proposalId",
          "revision"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    setOpeningAction

    Stage a complete door or window record in a setup proposal. On custom plans, segmentId names wall-1, wall-2, etc.; offset runs from that segment’s top/left endpoint and wall is its outward direction. Accepted openingLocks are human-only pins and cannot be overridden. Hinged doors use an open 90 degree pose; unsupported mechanisms are explicitly blocked. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "setOpening",
      "kind": "act",
      "impl": "imperative",
      "description": "Stage a complete door or window record in a setup proposal. On custom plans, segmentId names wall-1, wall-2, etc.; offset runs from that segment’s top/left endpoint and wall is its outward direction. Accepted openingLocks are human-only pins and cannot be overridden. Hinged doors use an open 90 degree pose; unsupported mechanisms are explicitly blocked. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "opening": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "wall": {
                    "type": "string",
                    "enum": [
                      "north",
                      "east",
                      "south",
                      "west"
                    ]
                  },
                  "segmentId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "offsetCm": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1000
                  },
                  "widthCm": {
                    "type": "number",
                    "minimum": 20,
                    "maximum": 400
                  },
                  "kind": {
                    "enum": [
                      "door"
                    ]
                  },
                  "hinge": {
                    "enum": [
                      "start",
                      "end"
                    ]
                  },
                  "swing": {
                    "enum": [
                      "in",
                      "out"
                    ]
                  },
                  "angle": {
                    "enum": [
                      90
                    ]
                  },
                  "mechanism": {
                    "enum": [
                      "hinged",
                      "pocket",
                      "bifold",
                      "sliding"
                    ]
                  },
                  "entrance": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "id",
                  "kind",
                  "wall",
                  "offsetCm",
                  "widthCm",
                  "hinge",
                  "swing",
                  "angle",
                  "mechanism",
                  "entrance"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "wall": {
                    "type": "string",
                    "enum": [
                      "north",
                      "east",
                      "south",
                      "west"
                    ]
                  },
                  "segmentId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "offsetCm": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1000
                  },
                  "widthCm": {
                    "type": "number",
                    "minimum": 20,
                    "maximum": 400
                  },
                  "kind": {
                    "enum": [
                      "window"
                    ]
                  },
                  "sillCm": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 500
                  },
                  "headCm": {
                    "type": "number",
                    "minimum": 1,
                    "maximum": 500
                  },
                  "type": {
                    "enum": [
                      "fixed",
                      "side_hinge",
                      "sash",
                      "unknown"
                    ]
                  },
                  "windowAccess": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "id",
                  "kind",
                  "wall",
                  "offsetCm",
                  "widthCm",
                  "sillCm",
                  "headCm",
                  "type",
                  "windowAccess"
                ],
                "additionalProperties": false
              }
            ]
          }
        },
        "required": [
          "proposalId",
          "revision",
          "opening"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    setConstraintsAction

    Stage rule assumptions, required kinds and an optional accessibility planning pack. Accessibility results are advisory planning assistance, never certification. Cannot modify accepted rules without human confirmation. Cell size remains 20 cm. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "setConstraints",
      "kind": "act",
      "impl": "imperative",
      "description": "Stage rule assumptions, required kinds and an optional accessibility planning pack. Accessibility results are advisory planning assistance, never certification. Cannot modify accepted rules without human confirmation. Cell size remains 20 cm. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "constraints": {
            "type": "object",
            "properties": {
              "H_lowCm": {
                "type": "number",
                "minimum": 0,
                "maximum": 300
              },
              "walkHardCm": {
                "type": "number",
                "minimum": 20,
                "maximum": 200
              },
              "walkPreferredCm": {
                "type": "number",
                "minimum": 20,
                "maximum": 200
              },
              "storageFrontCm": {
                "type": "number",
                "minimum": 20,
                "maximum": 200
              },
              "chairPullCm": {
                "type": "number",
                "minimum": 20,
                "maximum": 200
              },
              "bedLongSideAccessCm": {
                "type": "number",
                "minimum": 20,
                "maximum": 200
              },
              "radiatorFrontCm": {
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "windowFrontCm": {
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "ceilingCm": {
                "type": "number",
                "minimum": 100,
                "maximum": 500
              },
              "requiredKinds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "sofa",
                    "chair",
                    "table",
                    "coffee_table",
                    "desk",
                    "storage",
                    "bed",
                    "tv",
                    "rug",
                    "plant",
                    "window_treatment",
                    "ceiling_light",
                    "wall_light",
                    "floor_lamp",
                    "table_lamp",
                    "other"
                  ]
                },
                "maxItems": 12
              },
              "deskNearWindow": {
                "type": "boolean"
              },
              "openFloorM2": {
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "accessibility": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "turningCircleCm": {
                    "type": "number",
                    "minimum": 100,
                    "maximum": 250
                  },
                  "routeWidthCm": {
                    "type": "number",
                    "minimum": 60,
                    "maximum": 200
                  },
                  "doorApproachDepthCm": {
                    "type": "number",
                    "minimum": 60,
                    "maximum": 200
                  },
                  "bedTransferCm": {
                    "type": "number",
                    "minimum": 60,
                    "maximum": 200
                  },
                  "deskApproachCm": {
                    "type": "number",
                    "minimum": 60,
                    "maximum": 200
                  },
                  "reachableStorageMaxCm": {
                    "type": "number",
                    "minimum": 80,
                    "maximum": 200
                  },
                  "maxProjectionCm": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 50
                  }
                },
                "required": [
                  "id",
                  "enabled",
                  "turningCircleCm",
                  "routeWidthCm",
                  "doorApproachDepthCm",
                  "bedTransferCm",
                  "deskApproachCm",
                  "reachableStorageMaxCm",
                  "maxProjectionCm"
                ],
                "additionalProperties": false
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "proposalId",
          "revision",
          "constraints"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    placeFurnitureAction

    Place one catalogue variant, one owned instance, or one checked candidate in a layout proposal. For fixtures, use attachedOpeningId for a curtain/blind, explicit wallAnchor for a wall light, and supportObjectId for a table lamp. Ceiling fixtures use originCell and the actual ceiling outline. Owned sizes and locks remain authoritative. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "placeFurniture",
      "kind": "act",
      "impl": "imperative",
      "description": "Place one catalogue variant, one owned instance, or one checked candidate in a layout proposal. For fixtures, use attachedOpeningId for a curtain/blind, explicit wallAnchor for a wall light, and supportObjectId for a table lamp. Ceiling fixtures use originCell and the actual ceiling outline. Owned sizes and locks remain authoritative. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "candidateId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "idempotencyKey": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "candidateId",
              "idempotencyKey"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "variantId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "originCell": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number",
                    "minimum": -50,
                    "maximum": 50
                  },
                  "y": {
                    "type": "number",
                    "minimum": -50,
                    "maximum": 50
                  }
                },
                "required": [
                  "x",
                  "y"
                ],
                "additionalProperties": false
              },
              "rotation": {
                "type": "integer",
                "enum": [
                  0,
                  90,
                  180,
                  270
                ]
              },
              "targetSofaId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "linkedDeskId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "attachedOpeningId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "supportObjectId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "lightingZone": {
                "enum": [
                  "ambient",
                  "seating",
                  "reading",
                  "circulation"
                ]
              },
              "wallAnchor": {
                "type": "object",
                "properties": {
                  "wall": {
                    "type": "string",
                    "enum": [
                      "north",
                      "east",
                      "south",
                      "west"
                    ]
                  },
                  "segmentId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "offsetCm": {
                    "type": "number",
                    "minimum": -1000,
                    "maximum": 1000
                  }
                },
                "required": [
                  "wall",
                  "offsetCm"
                ],
                "additionalProperties": false
              },
              "elevationCm": {
                "type": "number",
                "minimum": 0,
                "maximum": 500
              },
              "idempotencyKey": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "variantId",
              "idempotencyKey"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "ownedId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "originCell": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number",
                    "minimum": -50,
                    "maximum": 50
                  },
                  "y": {
                    "type": "number",
                    "minimum": -50,
                    "maximum": 50
                  }
                },
                "required": [
                  "x",
                  "y"
                ],
                "additionalProperties": false
              },
              "rotation": {
                "type": "integer",
                "enum": [
                  0,
                  90,
                  180,
                  270
                ]
              },
              "targetSofaId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "linkedDeskId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "attachedOpeningId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "supportObjectId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "lightingZone": {
                "enum": [
                  "ambient",
                  "seating",
                  "reading",
                  "circulation"
                ]
              },
              "wallAnchor": {
                "type": "object",
                "properties": {
                  "wall": {
                    "type": "string",
                    "enum": [
                      "north",
                      "east",
                      "south",
                      "west"
                    ]
                  },
                  "segmentId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "offsetCm": {
                    "type": "number",
                    "minimum": -1000,
                    "maximum": 1000
                  }
                },
                "required": [
                  "wall",
                  "offsetCm"
                ],
                "additionalProperties": false
              },
              "elevationCm": {
                "type": "number",
                "minimum": 0,
                "maximum": 500
              },
              "idempotencyKey": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "ownedId",
              "idempotencyKey"
            ],
            "additionalProperties": false
          }
        ]
      },
      "page": "/?room=original"
    }
    createCustomFurnitureAction

    Create one agent-authored measured floor object in an active proposal. The legacy rectangle contract is unchanged. A custom sofa may instead add strict declarative sectional geometry: 2–12 connected, edge-sharing seat/corner/chaise modules with exact local centimetre rectangles, height and facing. Parent dimensions must exactly equal the module envelope; primaryFacing alone controls TV/coffee-table relationships while every exposed module front is checked for access. No arbitrary tags, shapes, rule overrides, code, markup, URLs, remote assets or mounts. Placement must introduce no blocking rule failures and requires human Apply. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "createCustomFurniture",
      "kind": "act",
      "impl": "imperative",
      "description": "Create one agent-authored measured floor object in an active proposal. The legacy rectangle contract is unchanged. A custom sofa may instead add strict declarative sectional geometry: 2–12 connected, edge-sharing seat/corner/chaise modules with exact local centimetre rectangles, height and facing. Parent dimensions must exactly equal the module envelope; primaryFacing alone controls TV/coffee-table relationships while every exposed module front is checked for access. No arbitrary tags, shapes, rule overrides, code, markup, URLs, remote assets or mounts. Placement must introduce no blocking rule failures and requires human Apply. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "label": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "kind": {
                "type": "string",
                "enum": [
                  "sofa",
                  "chair",
                  "table",
                  "coffee_table",
                  "desk",
                  "storage",
                  "bed",
                  "plant"
                ]
              },
              "widthCm": {
                "type": "number",
                "minimum": 1,
                "maximum": 600
              },
              "depthCm": {
                "type": "number",
                "minimum": 1,
                "maximum": 600
              },
              "heightCm": {
                "type": "number",
                "minimum": 1,
                "maximum": 500
              },
              "positionCm": {
                "type": "object",
                "properties": {
                  "xCm": {
                    "type": "number",
                    "minimum": -1000,
                    "maximum": 1000
                  },
                  "yCm": {
                    "type": "number",
                    "minimum": -1000,
                    "maximum": 1000
                  }
                },
                "required": [
                  "xCm",
                  "yCm"
                ],
                "additionalProperties": false
              },
              "rotation": {
                "type": "integer",
                "enum": [
                  0,
                  90,
                  180,
                  270
                ]
              },
              "appearance": {
                "type": "string",
                "enum": [
                  "moss",
                  "oat",
                  "clay",
                  "graphite",
                  "oak"
                ]
              },
              "linkedDeskId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "idempotencyKey": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "label",
              "kind",
              "widthCm",
              "depthCm",
              "heightCm",
              "positionCm",
              "rotation",
              "appearance",
              "idempotencyKey"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "label": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "kind": {
                "enum": [
                  "sofa"
                ]
              },
              "widthCm": {
                "type": "number",
                "minimum": 1,
                "maximum": 600
              },
              "depthCm": {
                "type": "number",
                "minimum": 1,
                "maximum": 600
              },
              "heightCm": {
                "type": "number",
                "minimum": 1,
                "maximum": 500
              },
              "positionCm": {
                "type": "object",
                "properties": {
                  "xCm": {
                    "type": "number",
                    "minimum": -1000,
                    "maximum": 1000
                  },
                  "yCm": {
                    "type": "number",
                    "minimum": -1000,
                    "maximum": 1000
                  }
                },
                "required": [
                  "xCm",
                  "yCm"
                ],
                "additionalProperties": false
              },
              "rotation": {
                "type": "integer",
                "enum": [
                  0,
                  90,
                  180,
                  270
                ]
              },
              "appearance": {
                "type": "string",
                "enum": [
                  "moss",
                  "oat",
                  "clay",
                  "graphite",
                  "oak"
                ]
              },
              "geometry": {
                "type": "object",
                "properties": {
                  "type": {
                    "enum": [
                      "sectional"
                    ]
                  },
                  "primaryFacing": {
                    "type": "string",
                    "enum": [
                      "north",
                      "east",
                      "south",
                      "west"
                    ]
                  },
                  "modules": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 32
                        },
                        "type": {
                          "enum": [
                            "seat",
                            "corner",
                            "chaise"
                          ]
                        },
                        "xCm": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 600
                        },
                        "yCm": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 600
                        },
                        "widthCm": {
                          "type": "number",
                          "minimum": 20,
                          "maximum": 300
                        },
                        "depthCm": {
                          "type": "number",
                          "minimum": 20,
                          "maximum": 300
                        },
                        "heightCm": {
                          "type": "number",
                          "minimum": 20,
                          "maximum": 150
                        },
                        "facing": {
                          "type": "string",
                          "enum": [
                            "north",
                            "east",
                            "south",
                            "west"
                          ]
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "xCm",
                        "yCm",
                        "widthCm",
                        "depthCm",
                        "heightCm",
                        "facing"
                      ],
                      "additionalProperties": false
                    },
                    "minItems": 2,
                    "maxItems": 12
                  }
                },
                "required": [
                  "type",
                  "primaryFacing",
                  "modules"
                ],
                "additionalProperties": false
              },
              "idempotencyKey": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "label",
              "kind",
              "widthCm",
              "depthCm",
              "heightCm",
              "positionCm",
              "rotation",
              "appearance",
              "geometry",
              "idempotencyKey"
            ],
            "additionalProperties": false
          }
        ]
      },
      "page": "/?room=original"
    }
    updateFurnitureAction

    Move, quarter-turn, choose a named variant, change TV/wall-light anchors, attach window treatments, link table-lamp supports or desk chairs, and assign lightingZone. Semantic fixture dimensions/mount heights are normalized from their named window, ceiling or support. Cannot set size, ownership, locks or required status. Candidate references must be current. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "updateFurniture",
      "kind": "act",
      "impl": "imperative",
      "description": "Move, quarter-turn, choose a named variant, change TV/wall-light anchors, attach window treatments, link table-lamp supports or desk chairs, and assign lightingZone. Semantic fixture dimensions/mount heights are normalized from their named window, ceiling or support. Cannot set size, ownership, locks or required status. Candidate references must be current. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "originCell": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number",
                "minimum": -50,
                "maximum": 50
              },
              "y": {
                "type": "number",
                "minimum": -50,
                "maximum": 50
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "rotation": {
            "type": "integer",
            "enum": [
              0,
              90,
              180,
              270
            ]
          },
          "variantId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "targetSofaId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "linkedDeskId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "attachedOpeningId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "supportObjectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "lightingZone": {
            "enum": [
              "ambient",
              "seating",
              "reading",
              "circulation"
            ]
          },
          "wallAnchor": {
            "type": "object",
            "properties": {
              "wall": {
                "type": "string",
                "enum": [
                  "north",
                  "east",
                  "south",
                  "west"
                ]
              },
              "segmentId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "offsetCm": {
                "type": "number",
                "minimum": -1000,
                "maximum": 1000
              }
            },
            "required": [
              "wall",
              "offsetCm"
            ],
            "additionalProperties": false
          },
          "elevationCm": {
            "type": "number",
            "minimum": 0,
            "maximum": 500
          },
          "objectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "candidateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "proposalId",
          "revision",
          "objectId"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    removeFurnitureAction

    Remove an unprotected piece from a layout proposal. Fixed, locked and required owned pieces cannot be removed. Optional owned omissions are reported. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "removeFurniture",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove an unprotected piece from a layout proposal. Fixed, locked and required owned pieces cannot be removed. Optional owned omissions are reported. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "objectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "proposalId",
          "revision",
          "objectId"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    findPlacementsAnswer

    Search checked placements for an object or variant without changing the draft. For relationship fixtures, place once with attachedOpeningId or supportObjectId first. Results are ranked by furniture-function rules before decorative preferences. Bounded results are not proof of infeasibility. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "findPlacements",
      "kind": "answer",
      "impl": "imperative",
      "description": "Search checked placements for an object or variant without changing the draft. For relationship fixtures, place once with attachedOpeningId or supportObjectId first. Results are ranked by furniture-function rules before decorative preferences. Bounded results are not proof of infeasibility. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "objectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "variantId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "linkedDeskId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "attachedOpeningId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "supportObjectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "lightingZone": {
            "enum": [
              "ambient",
              "seating",
              "reading",
              "circulation"
            ]
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8
          },
          "avoidFlags": {
            "type": "array",
            "items": {
              "enum": [
                "door_swing_reserved",
                "window_envelope",
                "radiator_keepout",
                "curtain_projection",
                "tv_blocked",
                "tv_unknown"
              ]
            },
            "maxItems": 6
          }
        },
        "required": [
          "proposalId",
          "revision"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    proposeLayoutAction

    Run the bounded local planner in an existing layout proposal. It preserves owned locks and may return partial results. An optional strategy changes only the ranking and default optional pieces; every result still passes the same rule engine. Supply an idempotency key to safely replay a completed request. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "proposeLayout",
      "kind": "act",
      "impl": "imperative",
      "description": "Run the bounded local planner in an existing layout proposal. It preserves owned locks and may return partial results. An optional strategy changes only the ranking and default optional pieces; every result still passes the same rule engine. Supply an idempotency key to safely replay a completed request. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "strategy": {
            "enum": [
              "maximum_open_floor",
              "social_conversation",
              "tv_focused"
            ]
          },
          "variantIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "maxItems": 8
          },
          "quantities": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "variantId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "quantity": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 4
                }
              },
              "required": [
                "variantId",
                "quantity"
              ],
              "additionalProperties": false
            },
            "maxItems": 8
          },
          "idempotencyKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "proposalId",
          "revision"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }
    setAppearanceAction

    Change a proposal wall, floor, or furniture finish from listCatalogue. Geometry and rule flags stay unchanged; Apply remains human-only. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "setAppearance",
      "kind": "act",
      "impl": "imperative",
      "description": "Change a proposal wall, floor, or furniture finish from listCatalogue. Geometry and rule flags stay unchanged; Apply remains human-only. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "target": {
                "enum": [
                  "wall",
                  "floor"
                ]
              },
              "paletteId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "target",
              "paletteId"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "proposalId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "revision": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              },
              "target": {
                "enum": [
                  "furniture"
                ]
              },
              "paletteId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "objectId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "proposalId",
              "revision",
              "target",
              "paletteId",
              "objectId"
            ],
            "additionalProperties": false
          }
        ]
      },
      "page": "/?room=original"
    }
    checkLayoutAnswer

    Read the shared engine report without changing draft readiness or view. Supports rule-code, object and region filters, and paginated issues or cells. Full-layout status and brief remain explicit even for focused reports. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.

    View tool JSON
    {
      "name": "checkLayout",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the shared engine report without changing draft readiness or view. Supports rule-code, object and region filters, and paginated issues or cells. Full-layout status and brief remain explicit even for focused reports. Use native WebMCP for agent room edits. Leave Apply, Discard, Unlock and room-input confirmation to the human; do not click those controls on their behalf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "which": {
            "enum": [
              "current",
              "proposal"
            ]
          },
          "revision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          },
          "candidateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "detail": {
            "enum": [
              "issues",
              "flags"
            ]
          },
          "ruleCode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "objectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "region": {
            "type": "object",
            "properties": {
              "x": {
                "type": "integer",
                "minimum": 0,
                "maximum": 50
              },
              "y": {
                "type": "integer",
                "minimum": 0,
                "maximum": 50
              },
              "w": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "d": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              }
            },
            "required": [
              "x",
              "y",
              "w",
              "d"
            ],
            "additionalProperties": false
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        },
        "required": [
          "which"
        ],
        "additionalProperties": false
      },
      "page": "/?room=original"
    }