← WebMCP Directory

Tool tree

aisle-three.vercel.app

Travel & EventsTools verified
Website
A wedding seating chart that you and your AI agent arrange together, live on the same canvas. Built on WebMCP.
Explore capabilities
    share_planAction

    Tell the human what you are about to do, before you start a multi-step change — one or two plain-language sentences, e.g. "I'll seat both families first, then sort out the two feuds." It appears as a speech bubble on your cursor and in the shared activity feed. Use it at the start of a task and again whenever the plan changes; it makes your work much easier to follow.

    View tool JSON
    {
      "name": "share_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Tell the human what you are about to do, before you start a multi-step change — one or two plain-language sentences, e.g. \"I'll seat both families first, then sort out the two feuds.\" It appears as a speech bubble on your cursor and in the shared activity feed. Use it at the start of a task and again whenever the plan changes; it makes your work much easier to follow.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "plan": {
            "type": "string",
            "description": "What you are about to do, in one or two short sentences"
          }
        },
        "required": [
          "plan"
        ],
        "additionalProperties": false
      }
    }
    ask_humanAction

    Ask the human a question and WAIT for their answer. The question appears as a card on the chart with your suggested options as buttons (and, unless you say otherwise, a box for a reply in their own words); their answer comes back in this tool's result. Use it when a seating decision is theirs to make — which side Grandma sits on, whether the kids get their own table, which of two trade-offs they prefer — rather than guessing. One short question at a time, with 2–4 concrete options. Waits up to ~90 seconds; if they have not answered by then the reply says so and the card stays up.

    View tool JSON
    {
      "name": "ask_human",
      "kind": "act",
      "impl": "imperative",
      "description": "Ask the human a question and WAIT for their answer. The question appears as a card on the chart with your suggested options as buttons (and, unless you say otherwise, a box for a reply in their own words); their answer comes back in this tool's result. Use it when a seating decision is theirs to make — which side Grandma sits on, whether the kids get their own table, which of two trade-offs they prefer — rather than guessing. One short question at a time, with 2–4 concrete options. Waits up to ~90 seconds; if they have not answered by then the reply says so and the card stays up.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "description": "The question, in one or two plain sentences"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 5,
            "description": "Suggested answers shown as buttons — 2 to 4 is ideal"
          },
          "allow_free_text": {
            "type": "boolean",
            "description": "Also offer a box for an answer in their own words (default true)"
          }
        },
        "required": [
          "question"
        ],
        "additionalProperties": false
      }
    }
    point_atAction

    Direct the human's eye without changing anything: your cursor flies to each named guest, table, or amenity in turn and hovers there, with your note in its speech bubble; each one glows for a moment. Use it while explaining — "this is the table under the speakers", "these two are the exes". Up to three targets per call.

    View tool JSON
    {
      "name": "point_at",
      "kind": "act",
      "impl": "imperative",
      "description": "Direct the human's eye without changing anything: your cursor flies to each named guest, table, or amenity in turn and hovers there, with your note in its speech bubble; each one glows for a moment. Use it while explaining — \"this is the table under the speakers\", \"these two are the exes\". Up to three targets per call.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "targets": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 3,
            "description": "Guest names, table names, or amenities (entrance, dance_floor, band, bathroom, photo_booth, bar, buffet, cake_table, gift_table)"
          },
          "note": {
            "type": "string",
            "description": "What to say while pointing — one short sentence"
          }
        },
        "required": [
          "targets"
        ],
        "additionalProperties": false
      }
    }
    get_recent_activityAnswer

    What has happened on the chart lately — the shared activity feed, newest first, each entry marked "human" (done by hand) or "agent" (done by you). Call it at the start of a turn to learn what the human did since you last looked: dragged someone, added a rule, pinned a seat, answered a question. Filter to their actions with who "human".

    View tool JSON
    {
      "name": "get_recent_activity",
      "kind": "answer",
      "impl": "imperative",
      "description": "What has happened on the chart lately — the shared activity feed, newest first, each entry marked \"human\" (done by hand) or \"agent\" (done by you). Call it at the start of a turn to learn what the human did since you last looked: dragged someone, added a rule, pinned a seat, answered a question. Filter to their actions with who \"human\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 40,
            "description": "How many entries to return (default 12)"
          },
          "who": {
            "type": "string",
            "description": "Whose actions to include",
            "enum": [
              "all",
              "human",
              "agent"
            ]
          },
          "since_seconds": {
            "type": "integer",
            "minimum": 1,
            "maximum": 86400,
            "description": "Only entries from the last N seconds"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    update_venueAction

    Configure the shared venue floor plan. Show, hide, place, resize, and rotate the entrance, dance floor, band & speakers, restrooms, photo booth, bar, buffet & catering, cake table, or gifts & cards table. Prefer the real-world *_ft fields, measured from the room’s top-left; legacy x/y/width/height floor-plan units remain supported. The reply warns if the amenity now overlaps a table or another amenity. The human sees the same saved layout and can adjust it afterward.

    View tool JSON
    {
      "name": "update_venue",
      "kind": "act",
      "impl": "imperative",
      "description": "Configure the shared venue floor plan. Show, hide, place, resize, and rotate the entrance, dance floor, band & speakers, restrooms, photo booth, bar, buffet & catering, cake table, or gifts & cards table. Prefer the real-world *_ft fields, measured from the room’s top-left; legacy x/y/width/height floor-plan units remain supported. The reply warns if the amenity now overlaps a table or another amenity. The human sees the same saved layout and can adjust it afterward.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "feature": {
            "type": "string",
            "description": "Venue amenity to change",
            "enum": [
              "entrance",
              "dance_floor",
              "band",
              "bathroom",
              "photo_booth",
              "bar",
              "buffet",
              "cake_table",
              "gift_table"
            ]
          },
          "enabled": {
            "type": "boolean",
            "description": "Whether this amenity is present and visible"
          },
          "location": {
            "type": "string",
            "description": "Named part of the room",
            "enum": [
              "top_left",
              "top_center",
              "top_right",
              "center_left",
              "center",
              "center_right",
              "bottom_left",
              "bottom_center",
              "bottom_right"
            ]
          },
          "x_ft": {
            "type": "number",
            "minimum": 0,
            "maximum": 300,
            "description": "Amenity left edge in feet from the room’s left wall (preferred)"
          },
          "y_ft": {
            "type": "number",
            "minimum": 0,
            "maximum": 200,
            "description": "Amenity top edge in feet from the room’s top wall (preferred)"
          },
          "width_ft": {
            "type": "number",
            "minimum": 1,
            "maximum": 300,
            "description": "Amenity width in feet (preferred)"
          },
          "height_ft": {
            "type": "number",
            "minimum": 1,
            "maximum": 200,
            "description": "Amenity height in feet (preferred)"
          },
          "rotation": {
            "type": "number",
            "minimum": -360,
            "maximum": 360,
            "description": "Clockwise rotation in degrees"
          },
          "x": {
            "type": "number",
            "minimum": 0,
            "maximum": 1200,
            "description": "Legacy horizontal floor-plan position from the room’s left edge"
          },
          "y": {
            "type": "number",
            "minimum": 0,
            "maximum": 660,
            "description": "Legacy vertical floor-plan position from the room’s top edge"
          },
          "width": {
            "type": "number",
            "minimum": 1,
            "maximum": 1200,
            "description": "Legacy amenity width in floor-plan units"
          },
          "height": {
            "type": "number",
            "minimum": 1,
            "maximum": 660,
            "description": "Legacy amenity height in floor-plan units"
          }
        },
        "required": [
          "feature"
        ],
        "additionalProperties": false
      }
    }
    update_venue_dimensionsAction

    Set the real-world venue room width and length in feet, plus the movement snap grid. The floor plan is drawn to a fixed scale, so growing the room adds floor space around the existing furniture (which stays put); shrinking it nudges anything stranded outside back inside the walls.

    View tool JSON
    {
      "name": "update_venue_dimensions",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the real-world venue room width and length in feet, plus the movement snap grid. The floor plan is drawn to a fixed scale, so growing the room adds floor space around the existing furniture (which stays put); shrinking it nudges anything stranded outside back inside the walls.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "width_ft": {
            "type": "number",
            "minimum": 20,
            "maximum": 300,
            "description": "Inside room width in feet"
          },
          "length_ft": {
            "type": "number",
            "minimum": 15,
            "maximum": 200,
            "description": "Inside room length in feet"
          },
          "snap_ft": {
            "type": "number",
            "minimum": 0,
            "maximum": 10,
            "description": "Grid spacing in feet; use 0 to turn grid snapping off"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    get_seating_chartAnswer

    Read the full current state of the wedding seating chart: every table with its occupants, unseated guests, all constraints with their status, current violations, and the drama score. Call this before making changes so you are working from the latest state — the human may have dragged guests around since your last call.

    View tool JSON
    {
      "name": "get_seating_chart",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the full current state of the wedding seating chart: every table with its occupants, unseated guests, all constraints with their status, current violations, and the drama score. Call this before making changes so you are working from the latest state — the human may have dragged guests around since your last call.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    list_guestsAnswer

    List guests on the wedding guest list with their group, RSVP status, dietary needs, notes, and where they are seated. Optionally filter to only unseated guests, a specific group/party, or an RSVP status.

    View tool JSON
    {
      "name": "list_guests",
      "kind": "answer",
      "impl": "imperative",
      "description": "List guests on the wedding guest list with their group, RSVP status, dietary needs, notes, and where they are seated. Optionally filter to only unseated guests, a specific group/party, or an RSVP status.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "filter": {
            "type": "string",
            "description": "Optional filter",
            "enum": [
              "all",
              "unseated",
              "seated",
              "pending_rsvp",
              "declined"
            ]
          },
          "group": {
            "type": "string",
            "description": "Only guests in this group/party, e.g. \"College friends\""
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    explain_seatingAction

    Explain one guest’s seating in full: where they sit and with whom, every rule involving them with its live status (including how near or far their table actually is from the dance floor, band, or entrance), their group context, dietary needs, and notes. For an unseated guest: what to honor when choosing their seat, where their group sits, and which tables have space. Use it before moving someone — or when the human asks "why is she there?"

    View tool JSON
    {
      "name": "explain_seating",
      "kind": "act",
      "impl": "imperative",
      "description": "Explain one guest’s seating in full: where they sit and with whom, every rule involving them with its live status (including how near or far their table actually is from the dance floor, band, or entrance), their group context, dietary needs, and notes. For an unseated guest: what to honor when choosing their seat, where their group sits, and which tables have space. Use it before moving someone — or when the human asks \"why is she there?\"",
      "inputSchema": {
        "type": "object",
        "properties": {
          "guest": {
            "type": "string",
            "description": "The guest to explain"
          }
        },
        "required": [
          "guest"
        ],
        "additionalProperties": false
      }
    }
    add_guestAction

    Add one guest to the wedding guest list. Give their name, and optionally their group/party (e.g. "Bride's family", "College friends"), dietary needs, RSVP status, and a free-form note (relationships, quirks, warnings).

    View tool JSON
    {
      "name": "add_guest",
      "kind": "act",
      "impl": "imperative",
      "description": "Add one guest to the wedding guest list. Give their name, and optionally their group/party (e.g. \"Bride's family\", \"College friends\"), dietary needs, RSVP status, and a free-form note (relationships, quirks, warnings).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Full name of the guest"
          },
          "group": {
            "type": "string",
            "description": "Group or party they belong to; defaults to \"Guests\""
          },
          "dietary": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Dietary needs, e.g. [\"vegetarian\"]"
          },
          "rsvp": {
            "type": "string",
            "description": "RSVP status",
            "enum": [
              "yes",
              "no",
              "pending"
            ]
          },
          "notes": {
            "type": "string",
            "description": "Free-form note about this guest"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    }
    update_guestAction

    Update a guest's details: name, group, dietary needs, RSVP status, or notes. Identify the guest by name (fuzzy match is fine). Setting RSVP to "no" frees up their seat.

    View tool JSON
    {
      "name": "update_guest",
      "kind": "act",
      "impl": "imperative",
      "description": "Update a guest's details: name, group, dietary needs, RSVP status, or notes. Identify the guest by name (fuzzy match is fine). Setting RSVP to \"no\" frees up their seat.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "guest": {
            "type": "string",
            "description": "Name of the guest to update"
          },
          "name": {
            "type": "string",
            "description": "New name"
          },
          "group": {
            "type": "string",
            "description": "New group/party"
          },
          "dietary": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Replacement list of dietary needs"
          },
          "rsvp": {
            "type": "string",
            "description": "New RSVP status",
            "enum": [
              "yes",
              "no",
              "pending"
            ]
          },
          "notes": {
            "type": "string",
            "description": "Replacement note"
          }
        },
        "required": [
          "guest"
        ],
        "additionalProperties": false
      }
    }
    remove_guestAction

    Remove a guest from the wedding entirely. Their seat is freed and any constraints involving them are dropped.

    View tool JSON
    {
      "name": "remove_guest",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove a guest from the wedding entirely. Their seat is freed and any constraints involving them are dropped.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "guest": {
            "type": "string",
            "description": "Name of the guest to remove"
          }
        },
        "required": [
          "guest"
        ],
        "additionalProperties": false
      }
    }
    import_guestsAction

    Bulk-import guests from pasted text. Rows copied out of a spreadsheet work as-is — CSV, TSV, or semicolon-separated, with or without a header row; a header (Name / Group or Side / RSVP / Dietary / Notes, in any order, and First + Last name as separate columns) is read and its columns mapped. So does one guest per line with fields separated by " — ", " | " or tabs: name, then group, dietary needs, RSVP (yes/no/pending) — e.g. "Nora Flynn — Childhood friends — vegetarian". A JSON array of {name, group, dietary, rsvp, notes} objects also works. Duplicate names are skipped. (To load an .xlsx file, ask the human to use "Import a Spreadsheet…" under Guests, or paste its rows here.)

    View tool JSON
    {
      "name": "import_guests",
      "kind": "act",
      "impl": "imperative",
      "description": "Bulk-import guests from pasted text. Rows copied out of a spreadsheet work as-is — CSV, TSV, or semicolon-separated, with or without a header row; a header (Name / Group or Side / RSVP / Dietary / Notes, in any order, and First + Last name as separate columns) is read and its columns mapped. So does one guest per line with fields separated by \" — \", \" | \" or tabs: name, then group, dietary needs, RSVP (yes/no/pending) — e.g. \"Nora Flynn — Childhood friends — vegetarian\". A JSON array of {name, group, dietary, rsvp, notes} objects also works. Duplicate names are skipped. (To load an .xlsx file, ask the human to use \"Import a Spreadsheet…\" under Guests, or paste its rows here.)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "The pasted guest list"
          },
          "default_group": {
            "type": "string",
            "description": "Group to assign when a line does not specify one"
          }
        },
        "required": [
          "text"
        ],
        "additionalProperties": false
      }
    }
    add_tableAction

    Add one or more tables to the room. Choose a seat count (2–16), shape (round or rect), and optionally count to add a whole row at once — "ten rounds of eight" is one call, and one thing for the human to undo. A single table can be given a name and a position in real-world feet from the room’s top-left, plus a rotation; extras are auto-numbered and each lands in its own open spot. The reply warns if a placement overlaps other furniture.

    View tool JSON
    {
      "name": "add_table",
      "kind": "act",
      "impl": "imperative",
      "description": "Add one or more tables to the room. Choose a seat count (2–16), shape (round or rect), and optionally count to add a whole row at once — \"ten rounds of eight\" is one call, and one thing for the human to undo. A single table can be given a name and a position in real-world feet from the room’s top-left, plus a rotation; extras are auto-numbered and each lands in its own open spot. The reply warns if a placement overlaps other furniture.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name for the table, e.g. \"Head table\"; auto-numbered if omitted, and ignored when count is above 1"
          },
          "seats": {
            "type": "integer",
            "minimum": 2,
            "maximum": 16,
            "description": "Seats per table (default 8)"
          },
          "shape": {
            "type": "string",
            "description": "Table shape",
            "enum": [
              "round",
              "rect"
            ]
          },
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 40,
            "description": "How many identical tables to add (default 1)"
          },
          "x_ft": {
            "type": "number",
            "minimum": 0,
            "maximum": 300,
            "description": "Table center in feet from the room’s left wall; single table only"
          },
          "y_ft": {
            "type": "number",
            "minimum": 0,
            "maximum": 200,
            "description": "Table center in feet from the room’s top wall; single table only"
          },
          "rotation": {
            "type": "number",
            "minimum": -360,
            "maximum": 360,
            "description": "Clockwise rotation in degrees"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    add_groupAction

    Create a guest group (a party or side, e.g. "Sailing club") before anyone is in it — useful when you are about to import or add several guests and want the group to exist first. Adding a guest with a new group name creates it too, so only reach for this when you want the empty group itself. Returns the existing name if one already matches, case-insensitively.

    View tool JSON
    {
      "name": "add_group",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a guest group (a party or side, e.g. \"Sailing club\") before anyone is in it — useful when you are about to import or add several guests and want the group to exist first. Adding a guest with a new group name creates it too, so only reach for this when you want the empty group itself. Returns the existing name if one already matches, case-insensitively.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Group name"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    }
    remove_groupAction

    Remove an empty group from the guest list. Groups with guests in them are kept — move or remove those guests first (update_guest changes someone’s group).

    View tool JSON
    {
      "name": "remove_group",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove an empty group from the guest list. Groups with guests in them are kept — move or remove those guests first (update_guest changes someone’s group).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Group name to remove"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    }
    add_constraintAction

    Add a seating rule. Pair rules: must_sit_together / must_sit_apart between guest_a and guest_b (same table vs. different tables). Zone rules for a single guest: near_dance_floor, far_from_dance_floor, near_band, far_from_band, near_entrance, far_from_entrance — "near" means one of the closest tables to that spot, "far" one of the farthest. Rules are enforced by auto_arrange and any breach shows up as a violation on the chart.

    View tool JSON
    {
      "name": "add_constraint",
      "kind": "act",
      "impl": "imperative",
      "description": "Add a seating rule. Pair rules: must_sit_together / must_sit_apart between guest_a and guest_b (same table vs. different tables). Zone rules for a single guest: near_dance_floor, far_from_dance_floor, near_band, far_from_band, near_entrance, far_from_entrance — \"near\" means one of the closest tables to that spot, \"far\" one of the farthest. Rules are enforced by auto_arrange and any breach shows up as a violation on the chart.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Kind of rule",
            "enum": [
              "must_sit_together",
              "must_sit_apart",
              "near_dance_floor",
              "far_from_dance_floor",
              "near_band",
              "far_from_band",
              "near_entrance",
              "far_from_entrance"
            ]
          },
          "guest_a": {
            "type": "string",
            "description": "First guest (pair rules) or the guest (zone rules)"
          },
          "guest_b": {
            "type": "string",
            "description": "Second guest — pair rules only"
          },
          "note": {
            "type": "string",
            "description": "Why this rule exists, e.g. \"recently divorced\""
          }
        },
        "required": [
          "type",
          "guest_a"
        ],
        "additionalProperties": false
      }
    }
    remove_constraintAction

    Remove a seating rule by its id (see list_constraints or get_seating_chart), or remove every rule involving a named guest.

    View tool JSON
    {
      "name": "remove_constraint",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove a seating rule by its id (see list_constraints or get_seating_chart), or remove every rule involving a named guest.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "constraint_id": {
            "type": "string",
            "description": "The rule id, e.g. \"c7\""
          },
          "guest": {
            "type": "string",
            "description": "Alternatively: remove all rules involving this guest"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    list_constraintsAnswer

    List every seating rule with its id and current status: ok, violated, or pending (someone involved is not seated yet).

    View tool JSON
    {
      "name": "list_constraints",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every seating rule with its id and current status: ok, violated, or pending (someone involved is not seated yet).",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    undoAction

    Step the whole chart back one change — the same Undo the human has in the header (⌘Z), and it undoes their edits as well as yours. Use it to take back something you just did that the human did not like; the reply names the change that was undone. For a bigger jump back, save_checkpoint / restore_checkpoint are the better tools. Note: undoing while one of your proposals is on screen counts as rejecting it.

    View tool JSON
    {
      "name": "undo",
      "kind": "act",
      "impl": "imperative",
      "description": "Step the whole chart back one change — the same Undo the human has in the header (⌘Z), and it undoes their edits as well as yours. Use it to take back something you just did that the human did not like; the reply names the change that was undone. For a bigger jump back, save_checkpoint / restore_checkpoint are the better tools. Note: undoing while one of your proposals is on screen counts as rejecting it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "description": "How many changes to step back (default 1)"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    redoAction

    Put back a change that undo took away — the same Redo the human has in the header. Only available until the next edit, which clears the redo history.

    View tool JSON
    {
      "name": "redo",
      "kind": "act",
      "impl": "imperative",
      "description": "Put back a change that undo took away — the same Redo the human has in the header. Only available until the next edit, which clears the redo history.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "description": "How many changes to step forward (default 1)"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    reset_chartAction

    Clear the whole chart back to an empty room — every guest, table, and rule, exactly as the human’s Reset button does. This throws away their work, so only call it when the human has asked for it in as many words, and pass confirm true to say that they did. It is a single undo away, and save_checkpoint first if you want a way back.

    View tool JSON
    {
      "name": "reset_chart",
      "kind": "act",
      "impl": "imperative",
      "description": "Clear the whole chart back to an empty room — every guest, table, and rule, exactly as the human’s Reset button does. This throws away their work, so only call it when the human has asked for it in as many words, and pass confirm true to say that they did. It is a single undo away, and save_checkpoint first if you want a way back.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "confirm": {
            "type": "boolean",
            "description": "Must be true. Set it only when the human has explicitly asked to clear the chart."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    save_checkpointAction

    Save a named snapshot of the entire chart — guests, tables, seating, rules, venue — that restore_checkpoint can return to. Session-only (it does not survive a page reload). Use it before trying something bold: checkpoint, propose a daring layout, and if the human hates it, restore. Saving an existing name overwrites it.

    View tool JSON
    {
      "name": "save_checkpoint",
      "kind": "act",
      "impl": "imperative",
      "description": "Save a named snapshot of the entire chart — guests, tables, seating, rules, venue — that restore_checkpoint can return to. Session-only (it does not survive a page reload). Use it before trying something bold: checkpoint, propose a daring layout, and if the human hates it, restore. Saving an existing name overwrites it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Checkpoint name, e.g. \"before-bold-layout\"; defaults to \"checkpoint\""
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    restore_checkpointAction

    Restore the chart to a previously saved checkpoint — everything comes back: guests, tables, seating, rules, venue. The restore itself is undoable, and the checkpoint stays saved so you can return again. With no name given and exactly one checkpoint saved, that one is restored.

    View tool JSON
    {
      "name": "restore_checkpoint",
      "kind": "act",
      "impl": "imperative",
      "description": "Restore the chart to a previously saved checkpoint — everything comes back: guests, tables, seating, rules, venue. The restore itself is undoable, and the checkpoint stays saved so you can return again. With no name given and exactly one checkpoint saved, that one is restored.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Checkpoint name to restore"
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    load_sample_weddingAction

    Replace the current chart with the built-in sample wedding: 72 named guests in 8 groups, 10 tables, and 17 seating rules including divorced relatives, exes, and a grandmother who hates loud speakers. Great for a demo. Everyone starts unseated; the previous chart can be restored with undo.

    View tool JSON
    {
      "name": "load_sample_wedding",
      "kind": "act",
      "impl": "imperative",
      "description": "Replace the current chart with the built-in sample wedding: 72 named guests in 8 groups, 10 tables, and 17 seating rules including divorced relatives, exes, and a grandmother who hates loud speakers. Great for a demo. Everyone starts unseated; the previous chart can be restored with undo.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    wrap_upAction

    Call once you have finished the human's request. Give a one-or-two-sentence closing summary of what changed, e.g. "Everyone is seated and both feuds are resolved." Your cursor announces it and steps off the canvas until the next request. Optional — the cursor also retires on its own after a quiet minute — but it gives the session a clean ending.

    View tool JSON
    {
      "name": "wrap_up",
      "kind": "act",
      "impl": "imperative",
      "description": "Call once you have finished the human's request. Give a one-or-two-sentence closing summary of what changed, e.g. \"Everyone is seated and both feuds are resolved.\" Your cursor announces it and steps off the canvas until the next request. Optional — the cursor also retires on its own after a quiet minute — but it gives the session a clean ending.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string",
            "description": "What you accomplished, in one or two short sentences"
          }
        },
        "required": [
          "summary"
        ],
        "additionalProperties": false
      }
    }