Zovo Seating Chart
Make a classroom seating chart or a wedding seating chart that follows your rules, then print it.
Sollte ich dies verwenden
Qualität und Sicherheit
Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.
Kontextkosten
Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.
Installieren
Installation mit einem Klick
Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:
{
"mcpServers": {
"seating-chart": {
"url": "https://seating-chart.zovo.one/mcp"
}
}
}Remote-Endpunkte
https://seating-chart.zovo.one/mcpstreamable-httpWas es kann
Tool-Inventar
Tools (2)
🟡generate_seating_chart(mode, title, people, roster_file, layout, ...)
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.
Eingabe-Schema
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"classroom",
"event"
],
"description": "classroom for a teacher's seating chart of desks; event for a wedding, party, banquet or gala with tables."
},
"title": {
"description": "Title printed on the chart, e.g. Period 3 - Room 114, or Lee & Park Wedding.",
"type": "string",
"maxLength": 80
},
"people": {
"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.",
"maxItems": 600,
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"description": "Name as it should print, e.g. Ava Martinez."
},
"party": {
"description": "Events only: household or party. Everyone in the same party sits at the same table, e.g. Martinez family.",
"type": "string",
"maxLength": 80
},
"label": {
"description": "Optional group label to mix or group by, e.g. B (reading level), Bride's side, or Team Red.",
"type": "string",
"maxLength": 40
},
"needs_front_seat": {
"description": "Classroom only: true if the student needs a front seat. Do not ask for or pass a reason.",
"type": "boolean"
},
"vip": {
"description": "Events only: true to seat this guest at the head table, e.g. the couple and the wedding party.",
"type": "boolean"
},
"child": {
"description": "Events only: true for a child who sits at the kids table when there is one.",
"type": "boolean"
}
},
"required": [
"name"
]
}
]
}
},
"roster_file": {
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
},
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"mime_type": {
"description": "Media type if known, e.g. application/pdf.",
"type": "string"
},
"file_name": {
"description": "Original file name if known, e.g. statement.pdf.",
"type": "string"
}
},
"required": [
"download_url",
"file_id"
],
"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."
},
"layout": {
"description": "Classroom desk layout: rows (single desks, default), pairs (desks in twos), or groups (pods/tables of group_size).",
"type": "string",
"enum": [
"rows",
"pairs",
"groups"
]
},
"rows": {
"description": "Classroom rows/pairs: number of rows from the front, e.g. 5.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"columns": {
"description": "Classroom: desks per row (rows), desk pairs per row (pairs), or groups per row (groups), e.g. 6.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"group_size": {
"description": "Classroom groups layout: students per group, e.g. 4 (default).",
"type": "integer",
"minimum": 2,
"maximum": 10
},
"group_count": {
"description": "Classroom groups layout: number of groups, e.g. 7. Default: just enough for everyone.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"aisle_breaks_adjacency": {
"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).",
"type": "boolean"
},
"front_rows": {
"description": "Classroom: how many rows count as the front for needs_front_seat, e.g. 1 (default).",
"type": "integer",
"minimum": 1,
"maximum": 5
},
"tables": {
"description": "Events: table setup, e.g. [{\"count\":1,\"seats\":10,\"type\":\"head\",\"shape\":\"long\"},{\"count\":12,\"seats\":8}].",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "How many tables of this kind, e.g. 10."
},
"seats": {
"type": "integer",
"minimum": 1,
"maximum": 40,
"description": "Seats at each of these tables, e.g. 8."
},
"shape": {
"description": "round (default) or long (rectangular banquet table).",
"type": "string",
"enum": [
"round",
"long"
]
},
"type": {
"description": "guest (default), head (for VIP guests only) or kids (for children only).",
"type": "string",
"enum": [
"guest",
"head",
"kids"
]
}
},
"required": [
"count",
"seats"
]
}
},
"table_count": {
"description": "Events shorthand: number of regular guest tables, e.g. 12. Default: just enough.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"seats_per_table": {
"description": "Events shorthand: seats per regular table, e.g. 8 (default) or 10.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"head_table_seats": {
"description": "Events shorthand: add a long head table with this many seats for VIP guests, e.g. 10.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"kids_table_seats": {
"description": "Events shorthand: add a kids table with this many seats for guests marked child, e.g. 8.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"keep_apart": {
"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\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"keep_together": {
"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\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"prefer_apart": {
"description": "Soft preference: try to keep these people apart; scored, not forced. Each inner list is one rule, e.g. [[\"Uncle Joe\",\"Aunt Sue\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"prefer_together": {
"description": "Soft preference: try to seat these people together; scored, not forced. Each inner list is one rule, e.g. [[\"Mia\",\"Zoe\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"label_rule": {
"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.",
"type": "string",
"enum": [
"mix",
"group",
"ignore"
]
},
"escort_sort": {
"description": "Events: sort the alphabetical escort card list by last_name (default) or first_name.",
"type": "string",
"enum": [
"last_name",
"first_name"
]
},
"previous_seat_order": {
"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.",
"maxItems": 400,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
},
"seed": {
"description": "Shuffle number, e.g. 1 (default). The same inputs and seed give the same chart; use another number to reshuffle.",
"type": "integer",
"minimum": 1,
"maximum": 999999999
}
},
"required": [
"mode"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Ausgabe-Schema
{
"type": "object",
"properties": {
"mode": {
"type": "string"
},
"layout": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"room": {
"type": "string"
},
"people": {
"type": "number"
},
"seats": {
"type": "number"
},
"hard_rules": {
"type": "number"
},
"hard_rules_broken": {
"type": "number"
},
"seating_problems": {
"type": "number"
},
"soft_score": {
"type": [
"number",
"null"
]
},
"soft": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"satisfied": {
"type": "number"
},
"total": {
"type": "number"
}
},
"required": [
"name",
"satisfied",
"total"
],
"additionalProperties": false
}
},
"chart": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"seats": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"name",
"seats"
],
"additionalProperties": false
}
},
"chart_truncated": {
"type": "boolean"
},
"seat_order": {
"type": "array",
"items": {
"type": "string"
}
},
"conflicts": {
"type": "array",
"items": {
"type": "string"
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"seed": {
"type": [
"number",
"null"
]
},
"downloads": {
"anyOf": [
{
"type": "object",
"properties": {
"pdf": {
"type": "string"
},
"place_cards": {
"type": "string"
},
"xlsx": {
"type": "string"
}
},
"required": [
"pdf",
"place_cards",
"xlsx"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"mode",
"layout",
"title",
"status",
"room",
"people",
"seats",
"hard_rules",
"hard_rules_broken",
"seating_problems",
"soft_score",
"soft",
"chart",
"conflicts",
"warnings",
"seed",
"downloads"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢check_seating_chart(mode, title, people, roster_file, layout, ...)
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.
Eingabe-Schema
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"classroom",
"event"
],
"description": "classroom for a teacher's seating chart of desks; event for a wedding, party, banquet or gala with tables."
},
"title": {
"description": "Title printed on the chart, e.g. Period 3 - Room 114, or Lee & Park Wedding.",
"type": "string",
"maxLength": 80
},
"people": {
"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.",
"maxItems": 600,
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"description": "Name as it should print, e.g. Ava Martinez."
},
"party": {
"description": "Events only: household or party. Everyone in the same party sits at the same table, e.g. Martinez family.",
"type": "string",
"maxLength": 80
},
"label": {
"description": "Optional group label to mix or group by, e.g. B (reading level), Bride's side, or Team Red.",
"type": "string",
"maxLength": 40
},
"needs_front_seat": {
"description": "Classroom only: true if the student needs a front seat. Do not ask for or pass a reason.",
"type": "boolean"
},
"vip": {
"description": "Events only: true to seat this guest at the head table, e.g. the couple and the wedding party.",
"type": "boolean"
},
"child": {
"description": "Events only: true for a child who sits at the kids table when there is one.",
"type": "boolean"
}
},
"required": [
"name"
]
}
]
}
},
"roster_file": {
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
},
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"mime_type": {
"description": "Media type if known, e.g. application/pdf.",
"type": "string"
},
"file_name": {
"description": "Original file name if known, e.g. statement.pdf.",
"type": "string"
}
},
"required": [
"download_url",
"file_id"
],
"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."
},
"layout": {
"description": "Classroom desk layout: rows (single desks, default), pairs (desks in twos), or groups (pods/tables of group_size).",
"type": "string",
"enum": [
"rows",
"pairs",
"groups"
]
},
"rows": {
"description": "Classroom rows/pairs: number of rows from the front, e.g. 5.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"columns": {
"description": "Classroom: desks per row (rows), desk pairs per row (pairs), or groups per row (groups), e.g. 6.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"group_size": {
"description": "Classroom groups layout: students per group, e.g. 4 (default).",
"type": "integer",
"minimum": 2,
"maximum": 10
},
"group_count": {
"description": "Classroom groups layout: number of groups, e.g. 7. Default: just enough for everyone.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"aisle_breaks_adjacency": {
"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).",
"type": "boolean"
},
"front_rows": {
"description": "Classroom: how many rows count as the front for needs_front_seat, e.g. 1 (default).",
"type": "integer",
"minimum": 1,
"maximum": 5
},
"tables": {
"description": "Events: table setup, e.g. [{\"count\":1,\"seats\":10,\"type\":\"head\",\"shape\":\"long\"},{\"count\":12,\"seats\":8}].",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "How many tables of this kind, e.g. 10."
},
"seats": {
"type": "integer",
"minimum": 1,
"maximum": 40,
"description": "Seats at each of these tables, e.g. 8."
},
"shape": {
"description": "round (default) or long (rectangular banquet table).",
"type": "string",
"enum": [
"round",
"long"
]
},
"type": {
"description": "guest (default), head (for VIP guests only) or kids (for children only).",
"type": "string",
"enum": [
"guest",
"head",
"kids"
]
}
},
"required": [
"count",
"seats"
]
}
},
"table_count": {
"description": "Events shorthand: number of regular guest tables, e.g. 12. Default: just enough.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"seats_per_table": {
"description": "Events shorthand: seats per regular table, e.g. 8 (default) or 10.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"head_table_seats": {
"description": "Events shorthand: add a long head table with this many seats for VIP guests, e.g. 10.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"kids_table_seats": {
"description": "Events shorthand: add a kids table with this many seats for guests marked child, e.g. 8.",
"type": "integer",
"minimum": 1,
"maximum": 40
},
"keep_apart": {
"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\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"keep_together": {
"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\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"prefer_apart": {
"description": "Soft preference: try to keep these people apart; scored, not forced. Each inner list is one rule, e.g. [[\"Uncle Joe\",\"Aunt Sue\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"prefer_together": {
"description": "Soft preference: try to seat these people together; scored, not forced. Each inner list is one rule, e.g. [[\"Mia\",\"Zoe\"]].",
"maxItems": 200,
"type": "array",
"items": {
"minItems": 2,
"maxItems": 12,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
}
},
"label_rule": {
"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.",
"type": "string",
"enum": [
"mix",
"group",
"ignore"
]
},
"escort_sort": {
"description": "Events: sort the alphabetical escort card list by last_name (default) or first_name.",
"type": "string",
"enum": [
"last_name",
"first_name"
]
},
"chart": {
"description": "The existing chart to check. Classroom rows/pairs: one entry per row, front row first. Groups/events: one entry per group or table.",
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 60,
"description": "Row, group or table name, e.g. Row 1 (front) or Table 3 or Head table."
},
"type": {
"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).",
"type": "string",
"enum": [
"guest",
"head",
"kids"
]
},
"seats": {
"maxItems": 40,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
},
"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\",\"\"]."
}
},
"required": [
"name",
"seats"
]
}
}
},
"required": [
"mode"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Ausgabe-Schema
{
"type": "object",
"properties": {
"mode": {
"type": "string"
},
"layout": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"room": {
"type": "string"
},
"people": {
"type": "number"
},
"seats": {
"type": "number"
},
"hard_rules": {
"type": "number"
},
"hard_rules_broken": {
"type": "number"
},
"seating_problems": {
"type": "number"
},
"soft_score": {
"type": [
"number",
"null"
]
},
"soft": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"satisfied": {
"type": "number"
},
"total": {
"type": "number"
}
},
"required": [
"name",
"satisfied",
"total"
],
"additionalProperties": false
}
},
"chart": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"seats": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"name",
"seats"
],
"additionalProperties": false
}
},
"chart_truncated": {
"type": "boolean"
},
"seat_order": {
"type": "array",
"items": {
"type": "string"
}
},
"conflicts": {
"type": "array",
"items": {
"type": "string"
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"seed": {
"type": [
"number",
"null"
]
},
"downloads": {
"anyOf": [
{
"type": "object",
"properties": {
"pdf": {
"type": "string"
},
"place_cards": {
"type": "string"
},
"xlsx": {
"type": "string"
}
},
"required": [
"pdf",
"place_cards",
"xlsx"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"mode",
"layout",
"title",
"status",
"room",
"people",
"seats",
"hard_rules",
"hard_rules_broken",
"seating_problems",
"soft_score",
"soft",
"chart",
"conflicts",
"warnings",
"seed",
"downloads"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Community
Nachweis