{"ok":true,"site":{"host":"floortris.floortris.workers.dev","url":"https://floortris.floortris.workers.dev/?room=original","type":"live","desc":"A room planner people and agents share through native WebMCP. Agents create proposals; humans review and Apply.","tools":[{"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.","title":"Generate a room proposal","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Read the room","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"which":{"enum":["current","proposal"]},"revision":{"type":"integer","minimum":1,"maximum":10000}},"required":["which"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"List furniture","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Browse furniture and fixtures","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Start a draft","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Set room outline","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Set a door or window","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Set planning rules","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Place a piece or fixture","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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}]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Create measured custom furniture","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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}]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Move or change a piece","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Remove a piece","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Find checked placements","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Plan a layout","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Change a finish","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"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}]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"},{"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.","title":"Check the layout","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?room=original"}],"category":"AI & Agents","apiSurface":"spec","toolCount":16}}