resOS MCP by usefulapi
Read bookings, guests and availability; create, update or cancel bookings in resOS.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"resos": {
"url": "https://resos.usefulapi.io/mcp"
}
}
}リモートエンドポイント
https://resos.usefulapi.io/mcpstreamable-httpできること
ツール一覧
ツール(19)
🟢resos_list_bookings(from_date_time, to_date_time, status, only_confirmed, people, ...)
List bookings, newest or oldest first as you sort, with date, time, party size, status, the guest's name, e-mail and phone, assigned tables and custom-field answers. Filter by date range, status, party size or guest name. The comment thread and sent-message log are not included (use resos_get_booking for the thread). Pages of at most 100; pass next_skip to read on. GET /bookings.
入力スキーマ
{
"type": "object",
"properties": {
"from_date_time": {
"description": "Start of the range, inclusive: ISO 8601 with a timezone, e.g. 2026-10-01T00:00:00Z.",
"type": "string"
},
"to_date_time": {
"description": "End of the range, inclusive: ISO 8601 with a timezone, e.g. 2026-10-31T23:59:59Z.",
"type": "string"
},
"status": {
"description": "Only bookings with this status.",
"type": "string",
"enum": [
"request",
"declined",
"approved",
"arrived",
"seated",
"left",
"no_show",
"canceled",
"deleted",
"waitlist",
"confirm",
"closed"
]
},
"only_confirmed": {
"description": "Only approved, arrived, seated or left bookings.",
"type": "boolean"
},
"people": {
"description": "Only bookings for exactly this many guests.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"guest_name_contains": {
"description": "Only bookings whose guest name contains this text.",
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[\\p{L}\\p{N} '-]+$"
},
"sort": {
"description": "Sort, `field:direction[,field2:direction]`, direction 1 ascending or -1 descending, e.g. `dateTime:-1`.",
"type": "string",
"pattern": "^[A-Za-z0-9_.]+:-?1(,[A-Za-z0-9_.]+:-?1)*$"
},
"custom_query": {
"description": "Extra filter, comma-separated `field<op>value`: `:` equals, `>` greater, `<` less, `;` contains. Example: `guest.phone:+15550100001`.",
"type": "string",
"minLength": 1,
"maxLength": 500
},
"skip": {
"description": "Records to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"limit": {
"description": "Records to return, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_booking(booking_id)
One booking by id, with the guest's contact data, tables, custom fields, payment, the comment thread (guest and restaurant messages) and the internal restaurant notes. GET /bookings/{id}.
入力スキーマ
{
"type": "object",
"properties": {
"booking_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS booking id (the _id of a booking)."
}
},
"required": [
"booking_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_list_customers(name_contains, custom_query, skip, limit)
List the restaurant's customers (guest profiles): name, e-mails, phones, city and country, tags, notes, flags, booking count and newsletter consent. The street address is not returned. Filter by name. Pages of at most 100. GET /customers.
入力スキーマ
{
"type": "object",
"properties": {
"name_contains": {
"description": "Only customers whose name contains this text.",
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[\\p{L}\\p{N} '-]+$"
},
"custom_query": {
"description": "Extra filter, comma-separated `field<op>value`: `:` equals, `>` greater, `<` less, `;` contains. Example: `guest.phone:+15550100001`.",
"type": "string",
"minLength": 1,
"maxLength": 500
},
"skip": {
"description": "Records to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"limit": {
"description": "Records to return, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_customer(customer_id)
One customer (guest profile) by id: contact data, tags, notes, flags, booking count and latest booking. GET /customers/{id}.
入力スキーマ
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS customer id."
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_list_guest_feedback(from_date_time, to_date_time, only_submitted, sort, custom_query, ...)
List guest feedback (ratings for food, service, value and atmosphere, whether they recommend, and the message). Filter by date range, or only submitted feedback. Pages of at most 100. GET /guestFeedback.
入力スキーマ
{
"type": "object",
"properties": {
"from_date_time": {
"description": "Start of the range, inclusive: ISO 8601 with a timezone.",
"type": "string"
},
"to_date_time": {
"description": "End of the range, inclusive: ISO 8601 with a timezone.",
"type": "string"
},
"only_submitted": {
"description": "Only feedback the guest has submitted.",
"type": "boolean"
},
"sort": {
"description": "Sort, `field:direction[,field2:direction]`, direction 1 ascending or -1 descending, e.g. `dateTime:-1`.",
"type": "string",
"pattern": "^[A-Za-z0-9_.]+:-?1(,[A-Za-z0-9_.]+:-?1)*$"
},
"custom_query": {
"description": "Extra filter, comma-separated `field<op>value`: `:` equals, `>` greater, `<` less, `;` contains. Example: `guest.phone:+15550100001`.",
"type": "string",
"minLength": 1,
"maxLength": 500
},
"skip": {
"description": "Records to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"limit": {
"description": "Records to return, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_guest_feedback(feedback_id)
One guest feedback entry by id. GET /guestFeedback/{id}.
入力スキーマ
{
"type": "object",
"properties": {
"feedback_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS guest feedback id."
}
},
"required": [
"feedback_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_list_seating_areas
List the seating areas with their tables (id, name, minimum and maximum seats) and table combinations. Use the ids for bookings and availability. GET /tables.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_list_opening_hours(type, only_special, show_deleted, sort)
List the opening hours: regular weekly hours (day 1 Monday to 7 Sunday) and special date-specific hours, each with id, name, open and close times and whether the restaurant is open. GET /openingHours.
入力スキーマ
{
"type": "object",
"properties": {
"type": {
"description": "Opening-hour mode, e.g. `restaurant` or `shop`.",
"type": "string",
"minLength": 1,
"maxLength": 50,
"pattern": "^[A-Za-z0-9_-]+$"
},
"only_special": {
"description": "Only special (date-specific) hours.",
"type": "boolean"
},
"show_deleted": {
"description": "Include deleted hours.",
"type": "boolean"
},
"sort": {
"description": "Sort, `field:direction[,field2:direction]`, direction 1 ascending or -1 descending, e.g. `dateTime:-1`.",
"type": "string",
"pattern": "^[A-Za-z0-9_.]+:-?1(,[A-Za-z0-9_.]+:-?1)*$"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_opening_hour(opening_hour_id)
One opening-hour entry by id. GET /openingHours/{id}.
入力スキーマ
{
"type": "object",
"properties": {
"opening_hour_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS opening hour id."
}
},
"required": [
"opening_hour_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_list_custom_fields
List the custom booking fields (name, label, type, required, choices). Use the ids to read or set custom-field answers. GET /customFields.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_custom_field(custom_field_id)
One custom booking field by id. GET /customFields/{id}.
入力スキーマ
{
"type": "object",
"properties": {
"custom_field_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS custom field id."
}
},
"required": [
"custom_field_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_available_dates(from_date, to_date)
Dates in a range on which the restaurant is open for bookings (default: the next 30 days). GET /bookingFlow/dates.
入力スキーマ
{
"type": "object",
"properties": {
"from_date": {
"description": "Start date, inclusive, yyyy-mm-dd (default today).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "End date, inclusive, yyyy-mm-dd (default 30 days after from_date).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_available_times(people, date, area_id, only_bookable_online)
Booking times that are free on a date for a party size, optionally for one seating area. GET /bookingFlow/times.
入力スキーマ
{
"type": "object",
"properties": {
"people": {
"type": "integer",
"minimum": 1,
"maximum": 1000,
"description": "Number of guests."
},
"date": {
"description": "Date, yyyy-mm-dd (default today).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"area_id": {
"description": "Only this seating area (id from resos_list_seating_areas).",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
},
"only_bookable_online": {
"description": "Only areas that guests can book online (resOS default true).",
"type": "boolean"
}
},
"required": [
"people"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢resos_get_available_tables(people, from_date_time, to_date_time, area_id, only_bookable_online, ...)
The tables and table combinations that are free for a party size in a time window (UTC). Use it before assigning tables to a booking. GET /bookingFlow/availableTables.
入力スキーマ
{
"type": "object",
"properties": {
"people": {
"type": "integer",
"minimum": 1,
"maximum": 1000,
"description": "Number of guests."
},
"from_date_time": {
"type": "string",
"description": "Start of the window: ISO 8601 with a timezone, e.g. 2026-10-15T18:00:00Z."
},
"to_date_time": {
"type": "string",
"description": "End of the window: ISO 8601 with a timezone."
},
"area_id": {
"description": "Only this seating area.",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
},
"only_bookable_online": {
"description": "Only areas that guests can book online (resOS default true).",
"type": "boolean"
},
"return_all_tables": {
"description": "Also list occupied tables.",
"type": "boolean"
},
"exclude_booking_id": {
"description": "Ignore this booking when counting what is taken (to re-assign its tables).",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
}
},
"required": [
"people",
"from_date_time",
"to_date_time"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴resos_create_booking(people, date, time, guest_name, guest_email, ...)
WRITE: create a booking for a guest. It is a real booking in the restaurant's book. If notify_email or notify_sms is true, resOS e-mails or texts the GUEST (a confirmation); both default to false. Date and time are in the restaurant's local timezone. Check resos_get_available_times first: resOS may refuse a slot that is full or closed. It is not retried: if the call times out, read the bookings before you try again, or you may book twice. resOS may silently throttle the same e-mail, phone or IP creating more than 10 bookings in 24 hours. POST /bookings.
入力スキーマ
{
"type": "object",
"properties": {
"people": {
"type": "integer",
"minimum": 1,
"maximum": 1000,
"description": "Number of guests."
},
"date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Local date, yyyy-mm-dd."
},
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "Local time, HH:mm, 24-hour."
},
"guest_name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The guest's name."
},
"guest_email": {
"description": "The guest's e-mail address.",
"type": "string",
"maxLength": 320
},
"guest_phone": {
"description": "The guest's phone number with the country code.",
"type": "string",
"minLength": 5,
"maxLength": 30,
"pattern": "^\\+?[0-9 ()./-]+$"
},
"notify_email": {
"description": "Send the guest an e-mail (needs guest_email). Default false.",
"type": "boolean"
},
"notify_sms": {
"description": "Send the guest a text message (needs guest_phone). Default false.",
"type": "boolean"
},
"status": {
"description": "Initial status (default: the resOS default for new bookings).",
"type": "string",
"enum": [
"request",
"approved",
"waitlist",
"confirm"
]
},
"language_code": {
"description": "Language of the guest's messages.",
"type": "string",
"enum": [
"da",
"de",
"el",
"en",
"es",
"fi",
"fr",
"it",
"nl",
"no",
"pl",
"pt",
"sq",
"sv",
"uk"
]
},
"comment": {
"description": "A comment from the guest, e.g. `Window seat preferred`.",
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"note": {
"description": "An internal restaurant note, not shown to the guest.",
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"duration": {
"description": "Duration in minutes.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"area_id": {
"description": "Seating area; resOS then picks tables from this area.",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
},
"table_ids": {
"description": "Specific table ids to assign.",
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
}
}
},
"required": [
"people",
"date",
"time",
"guest_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴resos_update_booking(booking_id, date, time, people, table_ids, ...)
WRITE: change fields of an existing booking: date, time, party size, tables, duration, status, or the guest's name, e-mail or phone. Only the fields you pass change. A status change or a new time can make resOS e-mail or text the GUEST (for example on approved or declined). To cancel use resos_cancel_booking. It is not retried: after a timeout read the booking again before you try again. PUT /bookings/{id}.
入力スキーマ
{
"type": "object",
"properties": {
"booking_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS booking id."
},
"date": {
"description": "New local date, yyyy-mm-dd (send with time).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"time": {
"description": "New local time, HH:mm (send with date).",
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"people": {
"description": "New number of guests.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"table_ids": {
"description": "Tables to assign (replaces the current ones).",
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
}
},
"duration": {
"description": "New duration in minutes.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"status": {
"description": "New status. Use resos_cancel_booking to cancel.",
"type": "string",
"enum": [
"request",
"declined",
"approved",
"arrived",
"seated",
"left",
"no_show",
"waitlist",
"confirm",
"closed"
]
},
"guest_name": {
"description": "New guest name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"guest_email": {
"description": "New guest e-mail.",
"type": "string",
"maxLength": 320
},
"guest_phone": {
"description": "New guest phone with the country code.",
"type": "string",
"minLength": 5,
"maxLength": 30,
"pattern": "^\\+?[0-9 ()./-]+$"
}
},
"required": [
"booking_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴resos_cancel_booking(booking_id)
WRITE: cancel a booking (status canceled, with a canceled-at time). resOS may e-mail or text the GUEST a cancellation notice. The booking stays in resOS and can be read afterwards. Not retried: after a timeout read the booking first. PUT /bookings/{id}/cancel.
入力スキーマ
{
"type": "object",
"properties": {
"booking_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS booking id."
}
},
"required": [
"booking_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴resos_add_booking_note(booking_id, text)
WRITE: add an internal restaurant note to a booking (for example `Birthday, bring a candle`). The guest does not see it and nothing is sent. At most 50 notes per booking; notes cannot be deleted through the API. Not retried: after a timeout read the booking first, or the note may be added twice. POST /bookings/{id}/restaurantNote.
入力スキーマ
{
"type": "object",
"properties": {
"booking_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS booking id."
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The note text, up to 2000 characters."
}
},
"required": [
"booking_id",
"text"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴resos_send_booking_comment(booking_id, text, send_notification)
WRITE: post a comment from the restaurant on a booking's guest thread. The guest can see it. If send_notification is true, resOS e-mails or texts the GUEST the message now: you must choose true or false. At most 25 comments per booking and 5 per minute. Cannot be deleted through the API. Not retried: after a timeout read the booking first, or the guest may get it twice. POST /bookings/{id}/comment.
入力スキーマ
{
"type": "object",
"properties": {
"booking_id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "resOS booking id."
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The message, up to 2000 characters."
},
"send_notification": {
"type": "boolean",
"description": "true = notify the guest by e-mail or text now; false = only add it to the thread."
}
},
"required": [
"booking_id",
"text",
"send_notification"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}コミュニティ
エビデンス