Koskamo

Zovo Seating Chart MCP

Generates classroom and wedding seating charts that follow hard and soft rules, providing printable PDFs, place cards, and Excel files. It handles constraints like keeping specific people apart or together, seating VIPs, and managing group rotations.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Zovo Seating Chart MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://seating-chart.zovo.one/mcp
Vendor documentation

What you can do with it

  • Create classroom seating charts with specific desk arrangements
  • Generate wedding seating charts respecting household and VIP rules
  • Produce printable PDF charts and tent-fold place cards
  • Resolve and report conflicting seating constraints

Source and maintenance

Community listingRegistry 1.0.1

Protocol and capabilities

Server
seating-chart 1.0.1
MCP protocol
2025-06-18
Tools
2 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Zovo Seating Chart makes classroom seating charts (rows, pairs, groups; keep-apart, front-seat, mixed groups, weekly rotation) and wedding or event seating charts (round or long tables, parties kept together, keep-apart pairs, head table, kids table), with a printable PDF, place cards and Excel. Call generate_seating_chart to make a chart and check_seating_chart to check one the user already has.

Tools

2 advertised

generate_seating_chart — Generate seating chart
Advertised by the server during the last successful anonymous check.

Use this when the user wants a seating chart or seating plan: a classroom seating chart for students (rows, pairs or groups of 4; keep two students apart; seat some students near the front; mixed groups; a new random seating chart each week that avoids last week's neighbours) or a wedding, party or banquet seating chart (round or long tables of N, keep couples and households together, keep two guests apart, head table, kids table). Accepts typed names or an uploaded roster or guest list (CSV/Excel). It checks each hard rule and reports any conflict, naming the rules that cannot all hold together. Returns the chart, a soft-preference score, and links to a printable PDF, place cards and Excel. Same seed gives the same chart; change seed to reshuffle. Each call saves new PDF and Excel files (which include the names) on the plugin server for 1 hour (private download links), then deletes them. Rosters are not saved. Does not seat stadiums, theaters or airplanes.

generate_seating_chart input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "mode"
  ],
  "properties": {
    "mode": {
      "enum": [
        "classroom",
        "event"
      ],
      "type": "string",
      "description": "classroom for a teacher's seating chart of desks; event for a wedding, party, banquet or gala with tables."
    },
    "rows": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "Classroom rows/pairs: number of rows from the front, e.g. 5."
    },
    "seed": {
      "type": "integer",
      "maximum": 999999999,
      "minimum": 1,
      "description": "Shuffle number, e.g. 1 (default). The same inputs and seed give the same chart; use another number to reshuffle."
    },
    "title": {
      "type": "string",
      "maxLength": 80,
      "description": "Title printed on the chart, e.g. Period 3 - Room 114, or Lee & Park Wedding."
    },
    "layout": {
      "enum": [
        "rows",
        "pairs",
        "groups"
      ],
      "type": "string",
      "description": "Classroom desk layout: rows (single desks, default), pairs (desks in twos), or groups (pods/tables of group_size)."
    },
    "people": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 80
          },
          {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "vip": {
                "type": "boolean",
                "description": "Events only: true to seat this guest at the head table, e.g. the couple and the wedding party."
              },
              "name": {
                "type": "string",
                "maxLength": 80,
                "description": "Name as it should print, e.g. Ava Martinez."
              },
              "child": {
                "type": "boolean",
                "description": "Events only: true for a child who sits at the kids table when there is one."
              },
              "label": {
                "type": "string",
                "maxLength": 40,
                "description": "Optional group label to mix or group by, e.g. B (reading level), Bride's side, or Team Red."
              },
              "party": {
                "type": "string",
                "maxLength": 80,
                "description": "Events only: household or party. Everyone in the same party sits at the same table, e.g. Martinez family."
              },
              "needs_front_seat": {
                "type": "boolean",
                "description": "Classroom only: true if the student needs a front seat. Do not ask for or pass a reason."
              }
            }
          }
        ]
      },
      "maxItems": 600,
      "description": "The students or guests: plain names (\"Ava Martinez\") or objects with flags, e.g. {\"name\":\"Cara Diaz\",\"needs_front_seat\":true}. Leave out when a roster file is attached."
    },
    "tables": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "count",
          "seats"
        ],
        "properties": {
          "type": {
            "enum": [
              "guest",
              "head",
              "kids"
            ],
            "type": "string",
            "description": "guest (default), head (for VIP guests only) or kids (for children only)."
          },
          "count": {
            "type": "integer",
            "maximum": 100,
            "minimum": 1,
            "description": "How many tables of this kind, e.g. 10."
          },
          "seats": {
            "type": "integer",
            "maximum": 40,
            "minimum": 1,
            "description": "Seats at each of these tables, e.g. 8."
          },
          "shape": {
            "enum": [
              "round",
              "long"
            ],
            "type": "string",
            "description": "round (default) or long (rectangular banquet table)."
          }
        }
      },
      "maxItems": 10,
      "description": "Events: table setup, e.g. [{\"count\":1,\"seats\":10,\"type\":\"head\",\"shape\":\"long\"},{\"count\":12,\"seats\":8}]."
    },
    "columns": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "Classroom: desks per row (rows), desk pairs per row (pairs), or groups per row (groups), e.g. 6."
    },
    "front_rows": {
      "type": "integer",
      "maximum": 5,
      "minimum": 1,
      "description": "Classroom: how many rows count as the front for needs_front_seat, e.g. 1 (default)."
    },
    "group_size": {
      "type": "integer",
      "maximum": 10,
      "minimum": 2,
      "description": "Classroom groups layout: students per group, e.g. 4 (default)."
    },
    "keep_apart": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Hard rule: people who must not sit next to each other (classroom: not beside, in front, behind or diagonal, nor in the same group; in pairs the seat across the aisle counts as beside unless aisle_breaks_adjacency is true; events: not at the same table). Each inner list is one rule, e.g. [[\"Ben\",\"Eli\"]]."
    },
    "label_rule": {
      "enum": [
        "mix",
        "group",
        "ignore"
      ],
      "type": "string",
      "description": "How to use labels: mix (spread each label across groups and neighbours; the classroom default), group (seat the same label together, e.g. college friends; the event default), or ignore."
    },
    "escort_sort": {
      "enum": [
        "last_name",
        "first_name"
      ],
      "type": "string",
      "description": "Events: sort the alphabetical escort card list by last_name (default) or first_name."
    },
    "group_count": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Classroom groups layout: number of groups, e.g. 7. Default: just enough for everyone."
    },
    "roster_file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "ChatGPT file id, e.g. file_abc123."
        },
        "file_name": {
          "type": "string",
          "description": "Original file name if known, e.g. statement.pdf."
        },
        "mime_type": {
          "type": "string",
          "description": "Media type if known, e.g. application/pdf."
        },
        "download_url": {
          "type": "string",
          "description": "Temporary download link for the file, supplied by ChatGPT."
        }
      },
      "description": "Optional class roster or guest list as CSV, TSV or Excel .xlsx with a header row: a Name column (or First/Last), and optional Party/Household, Group/Label, Front seat, VIP, Child, RSVP, Keep apart (names) and Table columns, e.g. guests.xlsx."
    },
    "table_count": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Events shorthand: number of regular guest tables, e.g. 12. Default: just enough."
    },
    "prefer_apart": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Soft preference: try to keep these people apart; scored, not forced. Each inner list is one rule, e.g. [[\"Uncle Joe\",\"Aunt Sue\"]]."
    },
    "keep_together": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Hard rule: people who must sit next to each other (classroom) or at the same table (events). Each inner list is one rule, e.g. [[\"Ann Lee\",\"Bob Lee\"]]."
    },
    "prefer_together": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Soft preference: try to seat these people together; scored, not forced. Each inner list is one rule, e.g. [[\"Mia\",\"Zoe\"]]."
    },
    "seats_per_table": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Events shorthand: seats per regular table, e.g. 8 (default) or 10."
    },
    "head_table_seats": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Events shorthand: add a long head table with this many seats for VIP guests, e.g. 10."
    },
    "kids_table_seats": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Events shorthand: add a kids table with this many seats for guests marked child, e.g. 8."
    },
    "previous_seat_order": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 80
      },
      "maxItems": 400,
      "description": "Classroom rotation: last chart's seat_order from this tool (names by seat number, \"\" for empty desks). The new chart avoids last time's neighbours and desks."
    },
    "aisle_breaks_adjacency": {
      "type": "boolean",
      "description": "Classroom pairs: true if the aisle between desk pairs separates students, so the seat across the aisle does not count as beside. Default false (across the aisle counts as beside)."
    }
  }
}
generate_seating_chart output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "mode",
    "layout",
    "title",
    "status",
    "room",
    "people",
    "seats",
    "hard_rules",
    "hard_rules_broken",
    "seating_problems",
    "soft_score",
    "soft",
    "chart",
    "conflicts",
    "warnings",
    "seed",
    "downloads"
  ],
  "properties": {
    "mode": {
      "type": "string"
    },
    "room": {
      "type": "string"
    },
    "seed": {
      "type": [
        "number",
        "null"
      ]
    },
    "soft": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "satisfied",
          "total"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "total": {
            "type": "number"
          },
          "satisfied": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "chart": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "seats"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "seats": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      }
    },
    "seats": {
      "type": "number"
    },
    "title": {
      "type": "string"
    },
    "layout": {
      "type": "string"
    },
    "people": {
      "type": "number"
    },
    "status": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "conflicts": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "pdf",
            "place_cards",
            "xlsx"
          ],
          "properties": {
            "pdf": {
              "type": "string"
            },
            "xlsx": {
              "type": "string"
            },
            "place_cards": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "hard_rules": {
      "type": "number"
    },
    "seat_order": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "soft_score": {
      "type": [
        "number",
        "null"
      ]
    },
    "chart_truncated": {
      "type": "boolean"
    },
    "seating_problems": {
      "type": "number"
    },
    "hard_rules_broken": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
generate_seating_chart annotations
{
  "title": "Generate seating chart",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
check_seating_chart — Check seating chart
Advertised by the server during the last successful anonymous check.

Use this when the user already has a seating chart (typed rows or tables, or a file with Name and Table columns) and wants to check it against rules: who must be kept apart, kept together, needs a front seat, households together, head table and kids table, table capacities. Returns each broken rule with the people involved, the soft-preference score, and the same printable PDF, place cards and Excel for that chart. Does not move anyone; to make a new chart use generate_seating_chart. Each call saves new PDF and Excel files (which include the names) on the plugin server for 1 hour (private download links), then deletes them. Not for stadium or airline seat maps.

check_seating_chart input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "mode"
  ],
  "properties": {
    "mode": {
      "enum": [
        "classroom",
        "event"
      ],
      "type": "string",
      "description": "classroom for a teacher's seating chart of desks; event for a wedding, party, banquet or gala with tables."
    },
    "rows": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "Classroom rows/pairs: number of rows from the front, e.g. 5."
    },
    "chart": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "seats"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 60,
            "description": "Row, group or table name, e.g. Row 1 (front) or Table 3 or Head table."
          },
          "type": {
            "enum": [
              "guest",
              "head",
              "kids"
            ],
            "type": "string",
            "description": "Events: table type if it is a head table or kids table, e.g. head. Default: guest (read from a name such as Head table or Kids table)."
          },
          "seats": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 80
            },
            "maxItems": 40,
            "description": "Names in seat order; classroom rows go left to right as the students face the board, \"\" for an empty desk, e.g. [\"Ava\",\"Ben\",\"\"]."
          }
        }
      },
      "maxItems": 100,
      "description": "The existing chart to check. Classroom rows/pairs: one entry per row, front row first. Groups/events: one entry per group or table."
    },
    "title": {
      "type": "string",
      "maxLength": 80,
      "description": "Title printed on the chart, e.g. Period 3 - Room 114, or Lee & Park Wedding."
    },
    "layout": {
      "enum": [
        "rows",
        "pairs",
        "groups"
      ],
      "type": "string",
      "description": "Classroom desk layout: rows (single desks, default), pairs (desks in twos), or groups (pods/tables of group_size)."
    },
    "people": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 80
          },
          {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "vip": {
                "type": "boolean",
                "description": "Events only: true to seat this guest at the head table, e.g. the couple and the wedding party."
              },
              "name": {
                "type": "string",
                "maxLength": 80,
                "description": "Name as it should print, e.g. Ava Martinez."
              },
              "child": {
                "type": "boolean",
                "description": "Events only: true for a child who sits at the kids table when there is one."
              },
              "label": {
                "type": "string",
                "maxLength": 40,
                "description": "Optional group label to mix or group by, e.g. B (reading level), Bride's side, or Team Red."
              },
              "party": {
                "type": "string",
                "maxLength": 80,
                "description": "Events only: household or party. Everyone in the same party sits at the same table, e.g. Martinez family."
              },
              "needs_front_seat": {
                "type": "boolean",
                "description": "Classroom only: true if the student needs a front seat. Do not ask for or pass a reason."
              }
            }
          }
        ]
      },
      "maxItems": 600,
      "description": "The students or guests: plain names (\"Ava Martinez\") or objects with flags, e.g. {\"name\":\"Cara Diaz\",\"needs_front_seat\":true}. Leave out when a roster file is attached."
    },
    "tables": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "count",
          "seats"
        ],
        "properties": {
          "type": {
            "enum": [
              "guest",
              "head",
              "kids"
            ],
            "type": "string",
            "description": "guest (default), head (for VIP guests only) or kids (for children only)."
          },
          "count": {
            "type": "integer",
            "maximum": 100,
            "minimum": 1,
            "description": "How many tables of this kind, e.g. 10."
          },
          "seats": {
            "type": "integer",
            "maximum": 40,
            "minimum": 1,
            "description": "Seats at each of these tables, e.g. 8."
          },
          "shape": {
            "enum": [
              "round",
              "long"
            ],
            "type": "string",
            "description": "round (default) or long (rectangular banquet table)."
          }
        }
      },
      "maxItems": 10,
      "description": "Events: table setup, e.g. [{\"count\":1,\"seats\":10,\"type\":\"head\",\"shape\":\"long\"},{\"count\":12,\"seats\":8}]."
    },
    "columns": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "Classroom: desks per row (rows), desk pairs per row (pairs), or groups per row (groups), e.g. 6."
    },
    "front_rows": {
      "type": "integer",
      "maximum": 5,
      "minimum": 1,
      "description": "Classroom: how many rows count as the front for needs_front_seat, e.g. 1 (default)."
    },
    "group_size": {
      "type": "integer",
      "maximum": 10,
      "minimum": 2,
      "description": "Classroom groups layout: students per group, e.g. 4 (default)."
    },
    "keep_apart": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Hard rule: people who must not sit next to each other (classroom: not beside, in front, behind or diagonal, nor in the same group; in pairs the seat across the aisle counts as beside unless aisle_breaks_adjacency is true; events: not at the same table). Each inner list is one rule, e.g. [[\"Ben\",\"Eli\"]]."
    },
    "label_rule": {
      "enum": [
        "mix",
        "group",
        "ignore"
      ],
      "type": "string",
      "description": "How to use labels: mix (spread each label across groups and neighbours; the classroom default), group (seat the same label together, e.g. college friends; the event default), or ignore."
    },
    "escort_sort": {
      "enum": [
        "last_name",
        "first_name"
      ],
      "type": "string",
      "description": "Events: sort the alphabetical escort card list by last_name (default) or first_name."
    },
    "group_count": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Classroom groups layout: number of groups, e.g. 7. Default: just enough for everyone."
    },
    "roster_file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "ChatGPT file id, e.g. file_abc123."
        },
        "file_name": {
          "type": "string",
          "description": "Original file name if known, e.g. statement.pdf."
        },
        "mime_type": {
          "type": "string",
          "description": "Media type if known, e.g. application/pdf."
        },
        "download_url": {
          "type": "string",
          "description": "Temporary download link for the file, supplied by ChatGPT."
        }
      },
      "description": "Optional class roster or guest list as CSV, TSV or Excel .xlsx with a header row: a Name column (or First/Last), and optional Party/Household, Group/Label, Front seat, VIP, Child, RSVP, Keep apart (names) and Table columns, e.g. guests.xlsx."
    },
    "table_count": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Events shorthand: number of regular guest tables, e.g. 12. Default: just enough."
    },
    "prefer_apart": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Soft preference: try to keep these people apart; scored, not forced. Each inner list is one rule, e.g. [[\"Uncle Joe\",\"Aunt Sue\"]]."
    },
    "keep_together": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Hard rule: people who must sit next to each other (classroom) or at the same table (events). Each inner list is one rule, e.g. [[\"Ann Lee\",\"Bob Lee\"]]."
    },
    "prefer_together": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 80
        },
        "maxItems": 12,
        "minItems": 2
      },
      "maxItems": 200,
      "description": "Soft preference: try to seat these people together; scored, not forced. Each inner list is one rule, e.g. [[\"Mia\",\"Zoe\"]]."
    },
    "seats_per_table": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Events shorthand: seats per regular table, e.g. 8 (default) or 10."
    },
    "head_table_seats": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Events shorthand: add a long head table with this many seats for VIP guests, e.g. 10."
    },
    "kids_table_seats": {
      "type": "integer",
      "maximum": 40,
      "minimum": 1,
      "description": "Events shorthand: add a kids table with this many seats for guests marked child, e.g. 8."
    },
    "aisle_breaks_adjacency": {
      "type": "boolean",
      "description": "Classroom pairs: true if the aisle between desk pairs separates students, so the seat across the aisle does not count as beside. Default false (across the aisle counts as beside)."
    }
  }
}
check_seating_chart output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "mode",
    "layout",
    "title",
    "status",
    "room",
    "people",
    "seats",
    "hard_rules",
    "hard_rules_broken",
    "seating_problems",
    "soft_score",
    "soft",
    "chart",
    "conflicts",
    "warnings",
    "seed",
    "downloads"
  ],
  "properties": {
    "mode": {
      "type": "string"
    },
    "room": {
      "type": "string"
    },
    "seed": {
      "type": [
        "number",
        "null"
      ]
    },
    "soft": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "satisfied",
          "total"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "total": {
            "type": "number"
          },
          "satisfied": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "chart": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "seats"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "seats": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      }
    },
    "seats": {
      "type": "number"
    },
    "title": {
      "type": "string"
    },
    "layout": {
      "type": "string"
    },
    "people": {
      "type": "number"
    },
    "status": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "conflicts": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "pdf",
            "place_cards",
            "xlsx"
          ],
          "properties": {
            "pdf": {
              "type": "string"
            },
            "xlsx": {
              "type": "string"
            },
            "place_cards": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "hard_rules": {
      "type": "number"
    },
    "seat_order": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "soft_score": {
      "type": [
        "number",
        "null"
      ]
    },
    "chart_truncated": {
      "type": "boolean"
    },
    "seating_problems": {
      "type": "number"
    },
    "hard_rules_broken": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
check_seating_chart annotations
{
  "title": "Check seating chart",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

seating-chart-widget — Zovo Seating Chart view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo Seating Chart.

seating-chart-widget URI
ui://widget/seating-chart-v3-1.0.1-57fb541a34432e8030332cef35a7618ae23e17840635b26b68a068853131e407.html

MIME type: text/html;profile=mcp-app

seating-chart-widget-legacy — Zovo Seating Chart view (previous versions)

Advertised by the server during the last successful anonymous check.

seating-chart-widget-legacy URI template
ui://widget/seating-chart-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1209 ms
95th percentile latency
1209 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1209 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zovo-seating-chart-mcp https://seating-chart.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zovo-seating-chart-mcp --url https://seating-chart.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-seating-chart-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-seating-chart-mcp": {
      "url": "https://seating-chart.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-seating-chart-mcp": {
      "type": "streamableHttp",
      "url": "https://seating-chart.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-seating-chart-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-seating-chart-mcp": {
      "type": "http",
      "url": "https://seating-chart.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zovo-seating-chart-mcp https://seating-chart.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "zovo-seating-chart-mcp": {
      "url": "https://seating-chart.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "zovo-seating-chart-mcp": {
      "serverUrl": "https://seating-chart.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Zovo Seating Chart MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.