Taste Match

официальный

Легко бронируйте столики и находите рестораны — только в Швейцарии и её окрестностях.

Что можно делать с Taste Match MCP?

  • Сначала посчитайте совпадения — Узнайте, сколько заведений соответствует набору фильтров, прежде чем запрашивать записи, с помощью count_restaurants.
  • Фильтруйте по параметрам — Ищите заведения по местоположению, дню или времени работы, кухне, блюдам и напиткам в меню или возможности бронирования с помощью filter_restaurants.
  • Найдите конкретное блюдо — Ищите блюдо в меню, используя формулировку самого гостя, и узнайте, в каких заведениях его подают, с помощью search_dishes.
  • Найдите заведение по названию — Ищите рестораны по названию или тому, как их называют, при необходимости ограничив поиск регионом, с помощью search_restaurants.
  • Узнайте, что популярно — Получите список самых популярных заведений в указанном регионе с помощью list_popular_restaurants.
  • Найдите похожие места — Найдите заведения со схожими вкусами с тем, для которого у вас уже есть ключ, с помощью list_similar_restaurants.

Размещённый MCP-сервер

npx add-mcp 'https://mcp.tastematch.io/'

Устанавливается в Claude Code, Codex, Cursor и другие

Документация

URL общедоступного сервисаhttps://mcp.tastematch.io/
URL заявления о конфиденциальностиhttps://tastematch.io/mcp/privacy.html

Набор инструментов MCP на базе Streamable HTTP поможет найти рестораны, которые лучше всего вам подходят, в Швейцарии и за её пределами. Добавьте его в клиент MCP, используя URL выше. Обнаружение общедоступно.

АУТЕНТИФИКАЦИЯ

Чтобы получить доступ к нашему серверу MCP, вашему сервису необходимо самостоятельно зарегистрироваться с помощью DCR (динамической регистрации клиентов OAuth 2.0) на сервере авторизации, указанном под authorization_servers в /.well-known/oauth-protected-resource/mcp; в документе метаданных самого сервера содержится registration_endpoint.

Для поддержки аутентифицированных конечных точек вашим пользователям потребуется пройти аутентификацию на том же сервере авторизации с помощью OpenID Connect (поток кода авторизации с PKCE), запросив то, что перечислено в scopes_supported в /.well-known/oauth-protected-resource/mcp.

  • 🟢 Без входа: инструмент отвечает всем.
  • 🟡 Вход требуется для некоторых аргументов, например list_recommended_restaurants resolve_key. В остальных случаях вызовы общедоступны и допускают параметры, зависящие от пользователя; эти параметры работают только после входа. См. ниже сведения об ошибке входа.
  • 🔴 Требуется вход: инструмент действует от имени пользователя. Пользователи могут быть анонимными. При вызове без токена возвращается HTTP 401 с вызовом WWW-Authenticate, указывающим на /.well-known/oauth-protected-resource/mcp, после чего клиент выполняет вход пользователя через OAuth (поток кода авторизации с PKCE). Идентификацией служит вошедший пользователь.
  • Уровень: anonymous — любой вошедший пользователь. reservation добавляет имя, фамилию, один контакт и принятие условий, которые promote_identity собирает, когда они нужны для бронирования.
  • Ограничение частоты запросов: вызовы учитываются отдельно для каждого вошедшего пользователя, а все вызывающие без токена используют общий лимит. Превышение лимита приводит к отказу с кодом; подождите и отправляйте запросы реже.

ОБНАРУЖЕНИЕ

🟢 count_restaurants read Подсчитывает, скольким заведениям соответствует набор фасетов, не возвращая строки. Вызывайте перед filter_restaurants при исследовании пространства фильтров: инструмент отвечает на тот же вопрос, но без документов.

Подсчёт ресторанов

Подсчитывает, скольким заведениям соответствует набор фасетов, не возвращая строки. Вызывайте перед filter_restaurants при исследовании пространства фильтров: инструмент отвечает на тот же вопрос, но без документов.

ПараметрТипОписание
drinkOptionsobjectчто должно быть в списке напитков
drinkOptions.beerSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
drinkOptions.cocktailSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
drinkOptions.natureWineSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
drinkOptions.wineSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
kitchenobjectкакую кухню готовит заведение
kitchen.cuisinearray<string>слаги кухонь; достаточно любого из них. Список приведён в get_vocabulary
locationobjectобласть поиска: regionId или точка с радиусом
location.latnumberширота центра поиска, указывается вместе с lng
location.lngnumberдолгота центра поиска
location.radiusMetersintegerрадиус поиска вокруг точки
location.regionIdstringрегион поиска из list_regions или resolve_key
menuOptionsobjectчто должно быть в меню
menuOptions.fishDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.glutenFreeDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.halalDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.lactoseFreeDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.meatDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.veganDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.vegetarianDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
nutritionobjectобщие характеристики заведения
nutrition.veganRestaurantsbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
nutrition.vegetarianRestaurantsbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
openingobjectкогда заведение открыто
opening.daytimestringвремя обслуживания: обед или ужин
opening.openOnarray<integer>дни недели, когда заведение должно быть открыто; воскресенье — 0
reservationobjectспособы бронирования
reservation.hasWidgetbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
reservation.liveAvailabilitybooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Count restaurants"
  },
  "description": "How many venues a facet set matches, with no rows. Call this before filter_restaurants when exploring a filter space: it answers the same question without the documents.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "drinkOptions": {
        "additionalProperties": false,
        "description": "what the drinks list must carry",
        "properties": {
          "beerSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "cocktailSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "natureWineSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "wineSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "kitchen": {
        "additionalProperties": false,
        "description": "the kitchen it cooks",
        "properties": {
          "cuisine": {
            "description": "cuisine slugs, any one of which satisfies it; the list is in get_vocabulary",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "location": {
        "additionalProperties": false,
        "description": "where to search: a regionId, or a point with a radius",
        "properties": {
          "lat": {
            "description": "latitude of the search centre, paired with lng",
            "type": "number"
          },
          "lng": {
            "description": "longitude of the search centre",
            "type": "number"
          },
          "radiusMeters": {
            "description": "how far around the point to look",
            "type": "integer"
          },
          "regionId": {
            "description": "the region to search in, from list_regions or resolve_key",
            "type": "string"
          }
        },
        "type": "object"
      },
      "menuOptions": {
        "additionalProperties": false,
        "description": "what the menu must carry",
        "properties": {
          "fishDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "glutenFreeDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "halalDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "lactoseFreeDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "meatDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "veganDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "vegetarianDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "nutrition": {
        "additionalProperties": false,
        "description": "what the venue is as a whole",
        "properties": {
          "veganRestaurants": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "vegetarianRestaurants": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "opening": {
        "additionalProperties": false,
        "description": "when the venue is open",
        "properties": {
          "daytime": {
            "description": "the service to be open for: lunch or dinner",
            "type": "string"
          },
          "openOn": {
            "description": "weekdays it must be open on, Sunday is 0",
            "items": {
              "type": "integer"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "reservation": {
        "additionalProperties": false,
        "description": "how it can be booked",
        "properties": {
          "hasWidget": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "liveAvailability": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      }
    },
    "required": [],
    "type": "object"
  },
  "name": "count_restaurants",
  "title": "Count restaurants"
}

🟢 filter_restaurants read Поиск заведений по фасетам: где находятся, когда открыты, какую кухню готовят, что есть в меню и списке напитков, а также как можно забронировать столик. Каждый фасет сужает результаты до заведений, соответствующих ему, поэтому передавайте только то, о чём попросил гость. Значения характеристик и кухонь берутся из get_vocabulary — выдуманное значение будет отклонено, а не проигнорировано. Результаты ранжируются по популярности; вектор вкусов не применяется.

Фильтрация ресторанов

Поиск заведений по фасетам: где находятся, когда открыты, какую кухню готовят, что есть в меню и списке напитков, а также как можно забронировать столик. Каждый фасет сужает результаты до заведений, соответствующих ему, поэтому передавайте только то, о чём попросил гость. Значения характеристик и кухонь берутся из get_vocabulary — выдуманное значение будет отклонено, а не проигнорировано. Результаты ранжируются по популярности; вектор вкусов не применяется.

ПараметрТипОписание
drinkOptionsobjectчто должно быть в списке напитков
drinkOptions.beerSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
drinkOptions.cocktailSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
drinkOptions.natureWineSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
drinkOptions.wineSelectionbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
kitchenobjectкакую кухню готовит заведение
kitchen.cuisinearray<string>слаги кухонь; достаточно любого из них. Список приведён в get_vocabulary
limitintegerколичество возвращаемых строк, не более 50
locationobjectобласть поиска: regionId или точка с радиусом
location.latnumberширота центра поиска, указывается вместе с lng
location.lngnumberдолгота центра поиска
location.radiusMetersintegerрадиус поиска вокруг точки
location.regionIdstringрегион поиска из list_regions или resolve_key
menuOptionsobjectчто должно быть в меню
menuOptions.fishDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.glutenFreeDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.halalDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.lactoseFreeDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.meatDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.veganDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
menuOptions.vegetarianDishesbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
nutritionobjectобщие характеристики заведения
nutrition.veganRestaurantsbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
nutrition.vegetarianRestaurantsbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать страницы
openingobjectкогда заведение открыто
opening.daytimestringвремя обслуживания: обед или ужин
opening.openOnarray<integer>дни недели, когда заведение должно быть открыто; воскресенье — 0
reservationobjectспособы бронирования
reservation.hasWidgetbooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку
reservation.liveAvailabilitybooleantrue оставляет только заведения, где это есть; не указывайте, если не нужно фильтровать по этому признаку

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Filter restaurants"
  },
  "description": "Search venues by facet: where, when open, what kitchen, what the menu and the drinks list carry, and how it can be booked. Every facet narrows the result to the venues carrying it, so pass only what the guest asked for. Descriptor and cuisine values come from get_vocabulary — an invented one is refused rather than ignored. Ranked by popularity; no taste vector is applied.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "drinkOptions": {
        "additionalProperties": false,
        "description": "what the drinks list must carry",
        "properties": {
          "beerSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "cocktailSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "natureWineSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "wineSelection": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "kitchen": {
        "additionalProperties": false,
        "description": "the kitchen it cooks",
        "properties": {
          "cuisine": {
            "description": "cuisine slugs, any one of which satisfies it; the list is in get_vocabulary",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "location": {
        "additionalProperties": false,
        "description": "where to search: a regionId, or a point with a radius",
        "properties": {
          "lat": {
            "description": "latitude of the search centre, paired with lng",
            "type": "number"
          },
          "lng": {
            "description": "longitude of the search centre",
            "type": "number"
          },
          "radiusMeters": {
            "description": "how far around the point to look",
            "type": "integer"
          },
          "regionId": {
            "description": "the region to search in, from list_regions or resolve_key",
            "type": "string"
          }
        },
        "type": "object"
      },
      "menuOptions": {
        "additionalProperties": false,
        "description": "what the menu must carry",
        "properties": {
          "fishDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "glutenFreeDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "halalDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "lactoseFreeDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "meatDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "veganDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "vegetarianDishes": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "nutrition": {
        "additionalProperties": false,
        "description": "what the venue is as a whole",
        "properties": {
          "veganRestaurants": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "vegetarianRestaurants": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "opening": {
        "additionalProperties": false,
        "description": "when the venue is open",
        "properties": {
          "daytime": {
            "description": "the service to be open for: lunch or dinner",
            "type": "string"
          },
          "openOn": {
            "description": "weekdays it must be open on, Sunday is 0",
            "items": {
              "type": "integer"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "reservation": {
        "additionalProperties": false,
        "description": "how it can be booked",
        "properties": {
          "hasWidget": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          },
          "liveAvailability": {
            "description": "true narrows to venues carrying it; omit it to not narrow on it",
            "type": "boolean"
          }
        },
        "type": "object"
      }
    },
    "required": [],
    "type": "object"
  },
  "name": "filter_restaurants",
  "title": "Filter restaurants"
}

🟢 list_popular_restaurants read Самые популярные заведения одного региона. Регион обязателен: без него будут показаны все заведения из нашей базы.

Список популярных ресторанов

Самые популярные заведения одного региона. Регион обязателен: без него будут показаны все заведения из нашей базы.

ПараметрТипОписание
regionId requiredstringрегион для поиска из list_regions
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать страницы

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List popular restaurants"
  },
  "description": "The most-liked venues of one region. A region is required: without one this reads every venue we hold.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "regionId": {
        "description": "the region to read, from list_regions",
        "type": "string"
      }
    },
    "required": [
      "regionId"
    ],
    "type": "object"
  },
  "name": "list_popular_restaurants",
  "title": "List popular restaurants"
}

🟡 list_recommended_restaurants read Рекомендации заведений для вошедшего гостя, начиная с наиболее близких по вкусу; до входа рекомендации не персонализированы. bookableOnly\ оставляет только заведения со свободным столиком; таких заведений гораздо меньше, и для этого требуется вход.

Список рекомендованных ресторанов

Рекомендации заведений для вошедшего гостя, начиная с наиболее близких по вкусу; до входа рекомендации не персонализированы. bookableOnly\ оставляет только заведения со свободным столиком; таких заведений гораздо меньше, и для этого требуется вход.

ПараметрТипОписание
bookableOnlybooleanоставлять только заведения с актуальной доступностью
interDiemintegerпри bookableOnly — на сколько дней вперёд может быть доступен столик
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать страницы
regionIdstringрегион для рекомендаций; если не указан, используется регион пользователя

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List recommended restaurants"
  },
  "description": "Venues recommended for the signed-in guest, closest in taste first; before anyone signs in they are not personal. \`bookableOnly\` keeps only venues with a table free, which is a much smaller set and needs a sign-in.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "bookableOnly": {
        "description": "keep only venues with live availability",
        "type": "boolean"
      },
      "interDiem": {
        "description": "with bookableOnly, how many days ahead a free table may lie",
        "type": "integer"
      },
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "regionId": {
        "description": "the region to recommend in; the identity's own region when omitted",
        "type": "string"
      }
    },
    "required": [],
    "type": "object"
  },
  "name": "list_recommended_restaurants",
  "title": "List recommended restaurants"
}

🟢 list_similar_restaurants read Поиск заведений, похожих по вкусу на заведение, ключ которого у вас уже есть; сначала показываются наиболее близкие. sameCategory\ оставляет заведения из той же группы кухонь и включён по умолчанию.

Список похожих ресторанов

Поиск заведений, похожих по вкусу на заведение, ключ которого у вас уже есть; сначала показываются наиболее близкие. sameCategory\ оставляет заведения из той же группы кухонь и включён по умолчанию.

ПараметрТипОписание
restaurantKey requiredstringзаведение, для которого нужно найти похожие
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать страницы
sameCategorybooleanограничить поиск той же группой кухонь; true, если параметр не указан

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List similar restaurants"
  },
  "description": "Venues close in taste to one you already hold a key for, nearest first. \`sameCategory\` keeps them inside the same kitchen family and is on unless you turn it off.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "restaurantKey": {
        "description": "the venue to find neighbours of",
        "type": "string"
      },
      "sameCategory": {
        "description": "keep to the same kitchen family; true when omitted",
        "type": "boolean"
      }
    },
    "required": [
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "list_similar_restaurants",
  "title": "List similar restaurants"
}

🟢 search_dishes read Поиск заведений, где подают указанное блюдо. Ищите блюдо так, как его назвал гость, сохраняя исходные слова и их порядок: формулировка блюда — часть его идентичности, поэтому не перефразируйте, не переводите и не сокращайте её. Длинные слова допускают небольшую опечатку; короткие должны быть указаны точно. В каждом результате приводится название блюда из меню, а exact\ имеет значение true только при точном совпадении названия. Инструмент не учитывает часы работы — для этого используйте filter_restaurants. Данные меню неполные: пустой результат означает, что ни в одном из имеющихся у нас меню это блюдо не указано, а не то, что его нигде не готовят.

Поиск блюд

Поиск заведений, где подают указанное блюдо. Ищите блюдо так, как его назвал гость, сохраняя исходные слова и их порядок: формулировка блюда — часть его идентичности, поэтому не перефразируйте, не переводите и не сокращайте её. Длинные слова допускают небольшую опечатку; короткие должны быть указаны точно. В каждом результате приводится название блюда из меню, а exact\ имеет значение true только при точном совпадении названия. Инструмент не учитывает часы работы — для этого используйте filter_restaurants. Данные меню неполные: пустой результат означает, что ни в одном из имеющихся у нас меню это блюдо не указано, а не то, что его нигде не готовят.

ПараметрТипОписание
q обязательныйstringблюдо, как его назвал гость
latnumberширота для поиска поблизости, в паре с lng
limitintegerколичество возвращаемых строк, не более 50
lngnumberдолгота для поиска поблизости
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать их постранично
radiusMetersintegerрадиус поиска вокруг точки
regionIdstringограничить поиск одним регионом

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Search dishes"
  },
  "description": "Find the venues that serve a named dish. Search the dish as the guest said it, in their words and their order — the wording of a dish is part of its identity, so do not rephrase, translate or shorten it. Longer words survive a small spelling slip; very short ones must be exact. Every hit quotes the dish as the menu prints it, and \`exact\` is true only where the name matched word for word. This knows nothing of opening hours — use filter_restaurants for that. Menu coverage is partial: an empty result means no menu we hold names that dish, never that nobody cooks it.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "lat": {
        "description": "latitude to search around, paired with lng",
        "type": "number"
      },
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "lng": {
        "description": "longitude to search around",
        "type": "number"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "q": {
        "description": "the dish as the guest named it",
        "type": "string"
      },
      "radiusMeters": {
        "description": "how far around the point to look",
        "type": "integer"
      },
      "regionId": {
        "description": "bound the search to one region",
        "type": "string"
      }
    },
    "required": [
      "q"
    ],
    "type": "object"
  },
  "name": "search_dishes",
  "title": "Search dishes"
}

🟢 search_restaurants read Найти заведения по названию или по тому, как их называет гость, его собственными словами. Не менее трёх символов. Если регион известен, ограничьте поиск им. Используйте filter_restaurants, если гость описал тип заведения, а не назвал конкретное.

Поиск ресторанов

Найти заведения по названию или по тому, как их называет гость, его собственными словами. Не менее трёх символов. Если регион известен, ограничьте поиск им. Используйте filter_restaurants, если гость описал тип заведения, а не назвал конкретное.

ПараметрТипОписание
text обязательныйstringпоисковый запрос, не менее трёх символов
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать их постранично
regionIdstringограничить поиск одним регионом; если не указано, поиск выполняется во всех регионах, которые мы охватываем

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Search restaurants"
  },
  "description": "Find venues by name or by what they are called, in the guest's own words. Three characters at least. Bound it to a region when you know one. Use filter_restaurants when the guest described a kind of place rather than named one.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "regionId": {
        "description": "bound the search to one region; omitted it searches every region we cover",
        "type": "string"
      },
      "text": {
        "description": "what to search for, three characters or more",
        "type": "string"
      }
    },
    "required": [
      "text"
    ],
    "type": "object"
  },
  "name": "search_restaurants",
  "title": "Search restaurants"
}

МЕСТО

🟢 list_regions read Регионы, охватываемые TasteMatch. Для каждого указан regionId, который требуется всем инструментам с ограничением по региону, а также часовой пояс IANA, в котором указано время работы заведений и время слотов. Передайте точку, чтобы получить регионы в порядке удалённости. В месте, не входящем ни в один из этих регионов, нет заведений в нашей базе.

Список регионов

Регионы, охватываемые TasteMatch. Для каждого указан regionId, который требуется всем инструментам с ограничением по региону, а также часовой пояс IANA, в котором указано время работы заведений и время слотов. Передайте точку, чтобы получить регионы в порядке удалённости. В месте, не входящем ни в один из этих регионов, нет заведений в нашей базе.

ПараметрТипОписание
latnumberширота, от которой сортировать по расстоянию, в паре с lng
limitintegerколичество возвращаемых строк, не более 50
lngnumberдолгота, от которой сортировать по расстоянию
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать их постранично

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List regions"
  },
  "description": "The regions TasteMatch covers. Each carries the regionId every region-scoped tool takes, and the IANA timezone its venues' opening hours and slot times are written on. Pass a point to get them nearest first. A place not in any of these regions has no venues we hold.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "lat": {
        "description": "latitude to sort by distance from, paired with lng",
        "type": "number"
      },
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "lng": {
        "description": "longitude to sort by distance from",
        "type": "number"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      }
    },
    "required": [],
    "type": "object"
  },
  "name": "list_regions",
  "title": "List regions"
}

🟢 search_places read Сопоставить названный гостем город, район или квартал с регионом, в который он входит. Пустой результат означает, что место находится за пределами всех охватываемых нами регионов, а не то, что название указано неверно.

Поиск мест

Сопоставить названный гостем город, район или квартал с регионом, в который он входит. Пустой результат означает, что место находится за пределами всех охватываемых нами регионов, а не то, что название указано неверно.

ПараметрТипОписание
q обязательныйstringместо, как его назвал гость
countryCodestringкод ISO 3166-1 alpha-2, которым нужно ограничить поиск
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество пропускаемых строк; вместе с totalCount в результате позволяет просматривать их постранично

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Search places"
  },
  "description": "Match a town, district or quarter the guest named to the region that contains it. An empty result means the place is outside every region we cover, not that the name was wrong.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "countryCode": {
        "description": "ISO 3166-1 alpha-2 code to restrict the match to",
        "type": "string"
      },
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      },
      "q": {
        "description": "the place as the guest named it",
        "type": "string"
      }
    },
    "required": [
      "q"
    ],
    "type": "object"
  },
  "name": "search_places",
  "title": "Search places"
}

РЕСТОРАН

🟢 get_restaurant read Прочитать данные одного заведения. По умолчанию возвращается краткий набор полей — название, ключи, регион, адрес, описания, способы бронирования и сводка о часах работы. Расширенные данные возвращаются, только если указать их в fields\: ContactInformation, MenuCards, MenuCardsV2, labelVector, coverPictures, socialScore, matchInfo, tmType, eventId, businessPro, likesByUser, likesByFollowees, likesUserAvatars, likesFolloweeAvatars. Документ без проекции может оказаться больше остальной части вашей задачи.

Получить ресторан

Прочитать данные одного заведения. По умолчанию возвращается краткий набор полей — название, ключи, регион, адрес, описания, способы бронирования и сводка о часах работы. Расширенные данные возвращаются, только если указать их в fields\: ContactInformation, MenuCards, MenuCardsV2, labelVector, coverPictures, socialScore, matchInfo, tmType, eventId, businessPro, likesByUser, likesByFollowees, likesUserAvatars, likesFolloweeAvatars. Документ без проекции может оказаться больше остальной части вашей задачи.

ПараметрТипОписание
restaurantKey обязательныйstringключ заведения
accessTypestringкогда гость попросил открыть это заведение, укажите, как он на него вышел: filtered, searched, recommended, similar, popular, spotlight. Тогда открытие будет засчитано за ним; не указывайте это поле, если просто проверяете заведение для себя.
fieldsarray<string>возвращаемые поля; по умолчанию используется краткая проекция, ключи включаются всегда

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get restaurant"
  },
  "description": "Read one venue. The default projection is lean — name, keys, region, address, descriptors, how it can be booked and its opening summary. The heavy parts arrive only when you name them in \`fields\`: ContactInformation, MenuCards, MenuCardsV2, labelVector, coverPictures, socialScore, matchInfo, tmType, eventId, businessPro, likesByUser, likesByFollowees, likesUserAvatars, likesFolloweeAvatars. An unprojected document can be larger than the rest of your task.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "accessType": {
        "description": "when the guest asked to open this venue, how they reached it — one of filtered, searched, recommended, similar, popular, spotlight. The open is then counted as theirs; leave it out when you are only checking a venue for yourself.",
        "type": "string"
      },
      "fields": {
        "description": "the fields to return; the default projection is lean, and keys are always included",
        "items": {
          "type": "string"
        },
        "type": "array"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "get_restaurant",
  "title": "Get restaurant"
}

🔴 like_restaurant write Записать, что действующая учётная запись отметила это заведение как понравившееся. Такие отметки улучшают последующие рекомендации. Это мнение гостя, а не ваше: отмечайте только то, что, по словам гостя, ему понравилось.

Отметить ресторан как понравившийся

Записать, что действующая учётная запись отметила это заведение как понравившееся. Такие отметки улучшают последующие рекомендации. Это мнение гостя, а не ваше: отмечайте только то, что, по словам гостя, ему понравилось.

ПараметрТипОписание
idempotencyKey обязательныйstringсобственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
restaurantKey обязательныйstringключ заведения

Определение wire (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Like restaurant"
  },
  "description": "Record that the acting identity likes this venue. Liking is what makes the recommendations that follow better, and it is the guest's statement, not yours — like what they said they liked.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "like_restaurant",
  "title": "Like restaurant"
}

🔴 submit_restaurant_impressions write Сообщить, какие заведения действующая учётная запись действительно увидела и с какими из них взаимодействовала. Одна пакетная отправка за ход, с собственным sessionId, который остаётся неизменным на протяжении всего разговора. Сообщайте о том, что произошло, а не о своих намерениях: на этих сигналах обучается рекомендательная система.

Отправить сведения о взаимодействиях с ресторанами

Сообщить, какие заведения действующая учётная запись действительно увидела и с какими из них взаимодействовала. Одна пакетная отправка за ход, с собственным sessionId, который остаётся неизменным на протяжении всего разговора. Сообщайте о том, что произошло, а не о своих намерениях: на этих сигналах обучается рекомендательная система.

ПараметрТипОписание
idempotencyKey обязательныйstringсобственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
impressions обязательныйarray<object>что было показано или с чем взаимодействовали
impressions[].accessType обязательныйstringодно из значений: filtered, searched, recommended, similar, popular, spotlight
impressions[].restaurantKey обязательныйstring
sessionId обязательныйstringсобственный UUID, одинаковый для всех пакетных отправок в рамках одного разговора

Определение wire (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Submit restaurant impressions"
  },
  "description": "Tell us which venues the identity actually saw, and which of them it acted on. One batch per turn, with a sessionId of your own that stays the same for the whole conversation. Report what happened, never what you intend: these are the signals the recommender learns from.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "impressions": {
        "description": "what was shown or acted on",
        "items": {
          "additionalProperties": false,
          "properties": {
            "accessType": {
              "description": "one of filtered, searched, recommended, similar, popular, spotlight",
              "type": "string"
            },
            "restaurantKey": {
              "type": "string"
            }
          },
          "required": [
            "accessType",
            "restaurantKey"
          ],
          "type": "object"
        },
        "type": "array"
      },
      "sessionId": {
        "description": "a UUID of your own, the same for every batch in one conversation",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "impressions",
      "sessionId"
    ],
    "type": "object"
  },
  "name": "submit_restaurant_impressions",
  "title": "Submit restaurant impressions"
}

🔴 unlike_restaurant write Отменить отметку «Нравится». Заведение останется в каталоге; будет удалено только мнение действующей учётной записи о нём.

Убрать отметку «Нравится» у ресторана

Отменить отметку «Нравится». Заведение останется в каталоге; будет удалено только мнение действующей учётной записи о нём.

ПараметрТипОписание
idempotencyKey обязательныйstringсобственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
restaurantKey обязательныйstringключ заведения

Определение wire (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Unlike restaurant"
  },
  "description": "Take back a like. The venue stays in the catalogue; only the identity's opinion of it is removed.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "unlike_restaurant",
  "title": "Unlike restaurant"
}

ДОСТУПНОСТЬ

🟢 get_reservation_info read Как заведение принимает бронирования. mode\ имеет значение instant, если столики подтверждаются сразу, и request, если запрос должен принять сотрудник заведения; инструмент откажет, если заведение вообще не принимает бронирования. Сначала прочитайте эти данные: они определяют, вызывать ли create_instant_reservation или create_reservation_request. maxPeople\ — максимальный размер компании, которую можно разместить. Этот вызов только читает данные: он ничего не бронирует и не записывает.

Получить сведения о бронировании

Как заведение принимает бронирования. mode\ имеет значение instant, если столики подтверждаются сразу, и request, если запрос должен принять сотрудник заведения; инструмент откажет, если заведение вообще не принимает бронирования. Сначала прочитайте эти данные: они определяют, вызывать ли create_instant_reservation или create_reservation_request. maxPeople\ — максимальный размер компании, которую можно разместить. Этот вызов только читает данные: он ничего не бронирует и не записывает.

ПараметрТипОписание
restaurantKey обязательныйstringключ заведения

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get reservation info"
  },
  "description": "How this venue takes reservations. \`mode\` is instant when tables are confirmed live, request when someone at the venue has to accept, and the tool refuses when the venue takes none at all. Read this first: it decides whether you call create_instant_reservation or create_reservation_request. \`maxPeople\` is the largest party we can place anywhere. This reads only — it books nothing and records nothing.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "get_reservation_info",
  "title": "Get reservation info"
}

🟢 list_availability_slots read Свободные столики в одном заведении на один день. Время указано по местным часам заведения и не привязано к фиксированной сетке — бронируйте время, указанное здесь, а не выбранное вами круглое значение. Заведение с режимом request вместо этого возвращает интервалы в windows\: в них можно отправить запрос на бронирование. Если оба списка пусты, значит, в этот день заведение закрыто или дата выходит за пределы периода бронирования.

Список доступных слотов

Свободные столики в одном заведении на один день. Время указано по местным часам заведения и не привязано к фиксированной сетке — бронируйте время, указанное здесь, а не выбранное вами круглое значение. Заведение с режимом request вместо этого возвращает интервалы в windows\: в них можно отправить запрос на бронирование. Если оба списка пусты, значит, в этот день заведение закрыто или дата выходит за пределы периода бронирования.

ПараметрТипОписание
date обязательныйstringдата для проверки, RFC3339 с UTC-смещением региона
restaurantKey обязательныйstringключ заведения
paxintegerразмер компании, чтобы исключить слишком маленькие слоты

Определение wire (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List availability slots"
  },
  "description": "The tables free at one venue on one day. Times are the venue's own wall clock, and they sit on no fixed grid — book a time you read here rather than a round number you chose. A request-mode venue answers in \`windows\` instead: the spans it will consider a request inside. Both empty means shut that day, or past the booking horizon.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "date": {
        "description": "the day to read, RFC3339 with the region's UTC offset",
        "type": "string"
      },
      "pax": {
        "description": "party size, to drop slots too small for it",
        "type": "integer"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "date",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "list_availability_slots",
  "title": "List availability slots"
}

БРОНИРОВАНИЕ

🔴 cancel_reservation destructive Отменить бронирование, принадлежащее действующей учётной записи. Отмену нельзя отменить, а столик будет освобождён. Сначала прочитайте данные бронирования, назовите гостю заведение и время, дождитесь его ответа, а затем передайте здесь оба значения: confirmRestaurantName\ и confirmDateTime\ должны совпадать с данными бронирования, иначе вызов будет отклонён. Никогда не отменяйте бронирование, опираясь только на ключ, даже если полностью в нём уверены.

Отменить бронирование

Отменить бронирование, принадлежащее действующей учётной записи. Отмену нельзя отменить, а столик будет освобождён. Сначала прочитайте данные бронирования, назовите гостю заведение и время, дождитесь его ответа, а затем передайте здесь оба значения: confirmRestaurantName\ и confirmDateTime\ должны совпадать с данными бронирования, иначе вызов будет отклонён. Никогда не отменяйте бронирование, опираясь только на ключ, даже если полностью в нём уверены.

ПараметрТипОписание
confirmDateTime обязательныйstringвремя бронирования, названное гостю, RFC3339
confirmRestaurantName обязательныйstringназвание заведения, названное гостю
idempotencyKey обязательныйstringсобственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
reservationKey обязательныйstringбронирование для отмены из списка list_reservations, принадлежащих учётной записи

Определение wire (tools/list)

{
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Cancel reservation"
  },
  "description": "Cancel a reservation the identity owns. This cannot be undone and the table is given up. Read the reservation first, say the venue and the time back to the guest, wait for them, and then echo both here: \`confirmRestaurantName\` and \`confirmDateTime\` must match the reservation on file or the call is refused. Never cancel on a key alone, however sure you are of it.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "confirmDateTime": {
        "description": "the reservation's time as you said it to the guest, RFC3339",
        "type": "string"
      },
      "confirmRestaurantName": {
        "description": "the venue's name as you said it to the guest",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "reservationKey": {
        "description": "the reservation to cancel, from the owned set of list_reservations",
        "type": "string"
      }
    },
    "required": [
      "confirmDateTime",
      "confirmRestaurantName",
      "idempotencyKey",
      "reservationKey"
    ],
    "type": "object"
  },
  "name": "cancel_reservation",
  "title": "Cancel reservation"
}

🔴 create_instant_reservation write Забронировать свободный столик. Это доступно для заведений с мгновенным бронированием; после успешного ответа столик считается подтверждённым. Бронируйте значение dateTime\, полученное из list_availability_slots: слоты заведения не привязаны к сетке, поэтому круглого времени обычно среди них нет. Оставьте approxMinutes\ равным 0, если только гость не сказал, что время для него гибкое: ненулевое значение позволяет заведению предложить близкое время, о чём будет сообщено в adjusted\ и bookedDate\. Бронирование оформляется на сохранённую учётную запись, для которой нужны и адрес электронной почты, и номер телефона.

Создать мгновенное бронирование Возьмите столик, который свободен сейчас. Это подходит для заведений с мгновенным бронированием: столик будет подтверждён после выполнения запроса. Забронируйте dateTime\, полученный из list_availability_slots: временные слоты заведения не привязаны к сетке, поэтому круглого времени обычно среди них нет. Оставьте approxMinutes\ равным 0, если только гость не сказал, что готов к гибкому времени: ненулевое значение позволяет заведению забронировать столик на близкое время, и об этом будет сказано в adjusted\ и bookedDate\. Бронирование выполняется с сохранёнными данными личности; для заведения с мгновенным бронированием нужны и адрес электронной почты, и номер телефона.

ПараметрТипОписание
dateTime requiredstringвыбранный временной слот в формате RFC3339 с часовым смещением региона, полученный из list_availability_slots
idempotencyKey requiredstringваш собственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая запись повторно
pax requiredintegerразмер группы
restaurantKey requiredstringключ заведения
approxMinutesintegerнасколько заведение может изменить время относительно dateTime; 0 означает только это время или отказ
areaIdstringзона для размещения, выбранная из слота; она сужает поиск и никогда не меняет время бронирования
commentstringпримечание для заведения словами гостя

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Create instant reservation"
  },
  "description": "Take a table that is free now. This is for instant venues and the table is confirmed when it returns. Book a \`dateTime\` you read from list_availability_slots — the venue's slots sit on no grid, so a round number is usually not one of them. Leave \`approxMinutes\` at 0 unless the guest said they are flexible: a non-zero value lets the venue book a nearby time instead, and the answer says so in \`adjusted\` and \`bookedDate\`. The booking runs on the stored identity, which needs both an email and a phone for an instant venue.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "approxMinutes": {
        "description": "how far from dateTime the venue may book instead; 0 means this time or nothing",
        "type": "integer"
      },
      "areaId": {
        "description": "the area to seat in, from the slot you chose; it narrows the search and never moves the booking",
        "type": "string"
      },
      "comment": {
        "description": "a note for the venue, in the guest's words",
        "type": "string"
      },
      "dateTime": {
        "description": "the slot to take, RFC3339 with the region's UTC offset, as read from list_availability_slots",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "pax": {
        "description": "party size",
        "type": "integer"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "dateTime",
      "idempotencyKey",
      "pax",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "create_instant_reservation",
  "title": "Create instant reservation"
}

🔴 create_reservation_offer запись Откройте бронирование в заведении, которое принимает бронирования через собственный виджет. Это действие создаёт запись: черновик, привязанный к действующей личности, и одноразовый widgetUrl\, с помощью которого гость завершит бронирование. Передайте URL гостю, затем опрашивайте get_reservation_status по reservationKey\, который он вернёт. Вызывайте этот инструмент один раз для каждой попытки бронирования: второй вызов создаст ещё один черновик. Для заведения с нативным бронированием предложение не требуется: используйте create_instant_reservation или create_reservation_request.

Создать предложение бронирования

Откройте бронирование в заведении, которое принимает бронирования через собственный виджет. Это действие создаёт запись: черновик, привязанный к действующей личности, и одноразовый widgetUrl\, с помощью которого гость завершит бронирование. Передайте URL гостю, затем опрашивайте get_reservation_status по reservationKey\, который он вернёт. Вызывайте этот инструмент один раз для каждой попытки бронирования: второй вызов создаст ещё один черновик. Для заведения с нативным бронированием предложение не требуется: используйте create_instant_reservation или create_reservation_request.

ПараметрТипОписание
idempotencyKey requiredstringваш собственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая запись повторно
restaurantKey requiredstringключ заведения

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Create reservation offer"
  },
  "description": "Open a booking at a venue that books through its own widget. This writes: it mints a draft attributed to the acting identity and a single-use \`widgetUrl\` for the guest to finish in. Hand the URL to the guest, then poll get_reservation_status on the \`reservationKey\` it returns. Call it once per booking attempt — a second call mints a second draft. A venue that books natively needs no offer: use create_instant_reservation or create_reservation_request instead.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "create_reservation_offer",
  "title": "Create reservation offer"
}

🔴 create_reservation_request запись Запросите столик в заведении. Это подходит для заведений, работающих в режиме запросов: бронирование возвращается в состоянии ожидания, и сотрудник заведения принимает или отклоняет его, поэтому сообщите гостю, что столик ещё не подтверждён. Время должно попадать в один из интервалов, указанных в list_availability_slots. Бронирование выполняется с сохранёнными данными личности — имя и контактные данные берутся из записи, а не из этого вызова.

Создать запрос на бронирование

Запросите столик в заведении. Это подходит для заведений, работающих в режиме запросов: бронирование возвращается в состоянии ожидания, и сотрудник заведения принимает или отклоняет его, поэтому сообщите гостю, что столик ещё не подтверждён. Время должно попадать в один из интервалов, указанных в list_availability_slots. Бронирование выполняется с сохранёнными данными личности — имя и контактные данные берутся из записи, а не из этого вызова.

ПараметрТипОписание
dateTime requiredstringзапрошенное время в формате RFC3339 с часовым смещением региона
idempotencyKey requiredstringваш собственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая запись повторно
pax requiredintegerразмер группы
restaurantKey requiredstringключ заведения
commentstringпримечание для заведения словами гостя

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Create reservation request"
  },
  "description": "Ask a venue for a table. This is for request-mode venues: the reservation comes back pending and someone at the venue accepts or declines it, so tell the guest it is not yet a table. The time must fall inside one of the windows list_availability_slots reported. The booking runs on the stored identity — its name and contact are read from the record, not from this call.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "comment": {
        "description": "a note for the venue, in the guest's words",
        "type": "string"
      },
      "dateTime": {
        "description": "the time asked for, RFC3339 with the region's UTC offset",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "pax": {
        "description": "party size",
        "type": "integer"
      },
      "restaurantKey": {
        "description": "the venue's key",
        "type": "string"
      }
    },
    "required": [
      "dateTime",
      "idempotencyKey",
      "pax",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "create_reservation_request",
  "title": "Create reservation request"
}

🔴 get_reservation_status чтение Состояние одного бронирования действующей личности. Опросите этот инструмент после создания предложения: бронирование через виджет становится действительным только после подтверждения заведением, и статус сообщает об этом.

Получить статус бронирования

Состояние одного бронирования действующей личности. Опросите этот инструмент после создания предложения: бронирование через виджет становится действительным только после подтверждения заведением, и статус сообщает об этом.

ПараметрТипОписание
reservationKey requiredstringключ бронирования из list_reservations

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get reservation status"
  },
  "description": "Where one reservation of the acting identity stands. Poll this after an offer: a widget booking becomes real only once the venue confirms it, and the status is how that arrives.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "reservationKey": {
        "description": "the reservation's key, from list_reservations",
        "type": "string"
      }
    },
    "required": [
      "reservationKey"
    ],
    "type": "object"
  },
  "name": "get_reservation_status",
  "title": "Get reservation status"
}

🔴 list_reservation_slots чтение Доступные варианты переноса существующего бронирования. Это не то же самое, что list_availability_slots: поиск ограничен конкретным бронированием и вариантами, на которые заведение разрешит его перенести. Перенести можно только принятое бронирование в заведении с актуальными данными о доступности.

Список временных слотов для бронирования

Доступные варианты переноса существующего бронирования. Это не то же самое, что list_availability_slots: поиск ограничен конкретным бронированием и вариантами, на которые заведение разрешит его перенести. Перенести можно только принятое бронирование в заведении с актуальными данными о доступности.

ПараметрТипОписание
reservationKey requiredstringбронирование для переноса из list_reservations
fromDatestringпервый день для поиска в формате RFC3339; если не указан, используется дата самого бронирования

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List reservation slots"
  },
  "description": "Where an existing reservation could move to. This is a different question from list_availability_slots: it is scoped to the reservation and to what the venue will let it become. Only an accepted reservation at a venue with live availability can move.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "fromDate": {
        "description": "the first day to look at, RFC3339; the reservation's own day when omitted",
        "type": "string"
      },
      "reservationKey": {
        "description": "the reservation to move, from list_reservations",
        "type": "string"
      }
    },
    "required": [
      "reservationKey"
    ],
    "type": "object"
  },
  "name": "list_reservation_slots",
  "title": "List reservation slots"
}

🔴 list_reservations чтение Все бронирования, принадлежащие действующей личности. owned\ доступны для действий — именно эти ключи принимают инструменты записи. foundByEmail\ переданы другому владельцу: они отображаются, чтобы вы могли сообщить о них, но любые операции записи с ними отклоняются.

Список бронирований

Все бронирования, принадлежащие действующей личности. owned\ доступны для действий — именно эти ключи принимают инструменты записи. foundByEmail\ переданы другому владельцу: они отображаются, чтобы вы могли сообщить о них, но любые операции записи с ними отклоняются.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List reservations"
  },
  "description": "Every reservation the acting identity holds. \`owned\` is actionable — those keys are the ones the write tools take. \`foundByEmail\` was reassigned to another owner: it is shown so you can speak about it, and every write on it is refused.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "list_reservations",
  "title": "List reservations"
}

🔴 update_reservation запись Перенесите бронирование, принадлежащее личности, или измените размер группы. Укажите только то, что меняется. Новое время должно быть одним из вариантов, предложенных для этого бронирования инструментом list_reservation_slots.

Обновить бронирование

Перенесите бронирование, принадлежащее личности, или измените размер группы. Укажите только то, что меняется. Новое время должно быть одним из вариантов, предложенных для этого бронирования инструментом list_reservation_slots.

ПараметрТипОписание
idempotencyKey requiredstringваш собственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая запись повторно
reservationKey requiredstringбронирование для изменения из принадлежащего личности списка list_reservations
dateTimestringновое время в формате RFC3339 с часовым смещением региона
paxintegerновый размер группы

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Update reservation"
  },
  "description": "Move a reservation the identity owns, or change its party size. Name only what changes. A new time must be one list_reservation_slots offered for that reservation.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "dateTime": {
        "description": "the new time, RFC3339 with the region's UTC offset",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "pax": {
        "description": "the new party size",
        "type": "integer"
      },
      "reservationKey": {
        "description": "the reservation to change, from the owned set of list_reservations",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "reservationKey"
    ],
    "type": "object"
  },
  "name": "update_reservation",
  "title": "Update reservation"
}

ЛИЧНОСТЬ

🔴 get_identity чтение Данные личности, от имени которой вы действуете. Прочитайте их, прежде чем что-либо спрашивать у гостя: уже сохранённое значение никогда не заменяется, а повторный вопрос о том, что нам уже известно, показывает, что вы не слушаете.

Получить данные личности

Данные личности, от имени которой вы действуете. Прочитайте их, прежде чем что-либо спрашивать у гостя: уже сохранённое значение никогда не заменяется, а повторный вопрос о том, что нам уже известно, показывает, что вы не слушаете.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get identity"
  },
  "description": "The identity you are acting for. Read it before asking the guest for anything: a value already on file is never replaced, and asking again for what we hold reads as not listening.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "get_identity",
  "title": "Get identity"
}

🟢 get_session чтение К чему подключён этот сеанс: доступные ему сценарии и человек, от имени которого вы действуете после входа, с указанием его уровня — acting\ отсутствует, пока кто-либо не войдёт в систему. Сначала вызовите этот инструмент, если не уверены, выполнен ли вход, а затем прочитайте climbWith\, чтобы узнать, какой инструмент собирает недостающие данные для текущего уровня.

Получить сеанс

К чему подключён этот сеанс: доступные ему сценарии и человек, от имени которого вы действуете после входа, с указанием его уровня — acting\ отсутствует, пока кто-либо не войдёт в систему. Сначала вызовите этот инструмент, если не уверены, выполнен ли вход, а затем прочитайте climbWith\, чтобы узнать, какой инструмент собирает недостающие данные для текущего уровня.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get session"
  },
  "description": "What this connection reaches: the journeys open to it, and the signed-in person you act for with their rung — \`acting\` is absent until someone signs in. Call it first when unsure whether anyone is signed in, and read \`climbWith\` for the tool that collects whatever the current rung is missing.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "get_session",
  "title": "Get session"
}

🔴 promote_identity запись Повышайте уровень до того, который позволяет бронировать, передав недостающие данные личности: имя и фамилию, один канал связи и подтверждение принятия Условий. Передавайте только то, что гость сообщил в этом разговоре. Для мгновенного бронирования заведению нужны и адрес электронной почты, и номер телефона, поэтому запросите оба, если гость хочет подтверждённый столик.

Повысить уровень личности

Повышайте уровень до того, который позволяет бронировать, передав недостающие данные личности: имя и фамилию, один канал связи и подтверждение принятия Условий. Передавайте только то, что гость сообщил в этом разговоре. Для мгновенного бронирования заведению нужны и адрес электронной почты, и номер телефона, поэтому запросите оба, если гость хочет подтверждённый столик.

ПараметрТипОписание
idempotencyKey requiredstringваш собственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая запись повторно
acceptTermsbooleantrue, если гость принимает Условия по адресу https://www.tastematch.io/agb
emailstringконтактный адрес электронной почты
firstNamestringимя гостя
lastNamestringфамилия гостя
phonestringконтактный номер телефона в международном формате

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Promote identity"
  },
  "description": "Climb to the rung that can reserve, by supplying what the identity is missing: a first and last name, one contact channel, and accepted Terms. Only send what the guest told you in this conversation. An instant venue needs both an email and a phone, so collect both when the guest wants a confirmed table.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "acceptTerms": {
        "description": "true when the guest accepts the Terms at https://www.tastematch.io/agb",
        "type": "boolean"
      },
      "email": {
        "description": "contact email",
        "type": "string"
      },
      "firstName": {
        "description": "the guest's first name",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "lastName": {
        "description": "the guest's last name",
        "type": "string"
      },
      "phone": {
        "description": "contact phone in international format",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey"
    ],
    "type": "object"
  },
  "name": "promote_identity",
  "title": "Promote identity"
}

🔴 update_identity запись Исправьте или дополните данные личности. Пустое поле будет заполнено, а неверное — исправлено, но канал связи, подтверждённый гостем, отсюда заменить нельзя. Передавайте только изменённые данные.

Обновить данные личности

Исправьте или дополните данные личности. Пустое поле будет заполнено, а неверное — исправлено, но канал связи, подтверждённый гостем, отсюда заменить нельзя. Передавайте только изменённые данные.

ПараметрТипОписание
idempotencyKey requiredstringваш собственный ключ для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая запись повторно
acceptTermsbooleantrue, если гость принимает Условия по адресу https://www.tastematch.io/agb
emailstringконтактный адрес электронной почты
firstNamestringимя гостя
lastNamestringфамилия гостя
phonestringконтактный номер телефона в международном формате

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Update identity"
  },
  "description": "Correct or complete the identity. A blank field is filled and a wrong one is corrected, but a channel the guest has validated cannot be replaced from here. Send only what changed.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "acceptTerms": {
        "description": "true when the guest accepts the Terms at https://www.tastematch.io/agb",
        "type": "boolean"
      },
      "email": {
        "description": "contact email",
        "type": "string"
      },
      "firstName": {
        "description": "the guest's first name",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "lastName": {
        "description": "the guest's last name",
        "type": "string"
      },
      "phone": {
        "description": "contact phone in international format",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey"
    ],
    "type": "object"
  },
  "name": "update_identity",
  "title": "Update identity"
}

ВКУСЫ

🔴 get_taste_profile чтение Сохранённые вкусовые предпочтения этой личности: дескрипторы, указанный для каждого уровень уверенности и выведенный на их основе тип вкуса. Прочитайте их, прежде чем снова указывать вкусы: вы исправляете профиль, а не создаёте новый.

Получить профиль вкусов

Сохранённые вкусовые предпочтения этой личности: дескрипторы, указанный для каждого уровень уверенности и выведенный на их основе тип вкуса. Прочитайте их, прежде чем снова указывать вкусы: вы исправляете профиль, а не создаёте новый.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get taste profile"
  },
  "description": "What this identity's taste is on file as: the descriptors it carries, the confidence stated for each, and the taste type derived from them. Read it before stating taste again — you are correcting a profile, not starting one.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "get_taste_profile",
  "title": "Get taste profile"
}

🔴 submit_taste_profile запись Укажите вкусы гостя, задав для каждого дескриптора уровень уверенности от 0 до 1, и выведите столько предпочтений, сколько позволяет разговор. Это заменит сохранённые данные, поэтому передайте полную картину, а не исправления. Допустимы только дескрипторы, перечисленные в weights\; все они опубликованы в get_vocabulary — любые другие будут отклонены. Поводы и характеристики меню сохраняются вместе с остальными данными, но относятся к атрибутам заведения, поэтому влияют на фильтры, а не на вектор вкусов. Необязательно: поиск, списки и бронирование работают и без этого; профиль нужен только для персонализации list_recommended_restaurants.

Отправить профиль вкусов Укажите вкусовые предпочтения гостя, присвоив каждому дескриптору значение уверенности от 0 до 1, и определите столько предпочтений, сколько позволяет разговор. Эти данные заменяют сохранённые ранее, поэтому передавайте полную картину, а не исправления. Дескрипторы — это те, которые перечисляет weights\; все они опубликованы через get_vocabulary — любые другие будут отклонены. Поводы и характеристики меню хранятся вместе с остальными данными, но относятся к атрибутам заведения, поэтому влияют на фильтры, а не на вектор вкусовых предпочтений. Необязательно: поиск, списки и бронирование работают и без этого; эти данные нужны только для персонализации list_recommended_restaurants.

ПараметрТипОписание
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
weights requiredmap<string, number>уверенность от 0 до 1 для каждого дескриптора: один из apero, breakfast, brunch, dinner, dishCocktails, dishCraftBeer, dishNatureWine, dishWine, fineDining, late, lunch, menuFish, menuMeat, menuVegan, menuVegetarian, occasionBusiness, occasionCasual, occasionCelebration, occasionChildren, occasionCulture, occasionGroups, occasionImpressive, occasionRomantic, occasionSolo, priceCheap, pricePricey, salty, sweets

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Submit taste profile"
  },
  "description": "State the guest's taste as a confidence from 0 to 1 per descriptor, and infer as many as the conversation supports. This replaces what was on file, so send the whole picture rather than a correction. The descriptors are the ones \`weights\` names, all published by get_vocabulary — any other is refused. Occasions and menu characters are stored with the rest but are venue attributes, so they shape filters rather than the taste vector. Optional: discovery, lists and booking all work without it; it only makes list_recommended_restaurants personal.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "weights": {
        "additionalProperties": {
          "type": "number"
        },
        "description": "confidence 0 to 1 per descriptor, one of apero, breakfast, brunch, dinner, dishCocktails, dishCraftBeer, dishNatureWine, dishWine, fineDining, late, lunch, menuFish, menuMeat, menuVegan, menuVegetarian, occasionBusiness, occasionCasual, occasionCelebration, occasionChildren, occasionCulture, occasionGroups, occasionImpressive, occasionRomantic, occasionSolo, priceCheap, pricePricey, salty, sweets",
        "type": "object"
      }
    },
    "required": [
      "idempotencyKey",
      "weights"
    ],
    "type": "object"
  },
  "name": "submit_taste_profile",
  "title": "Submit taste profile"
}

СПИСКИ

🔴 add_restaurant_to_list write Добавить заведение в один из списков пользователя. Если оно уже есть в списке, ничего не изменится.

Добавить ресторан в список

Добавить заведение в один из списков пользователя. Если оно уже есть в списке, ничего не изменится.

ПараметрТипОписание
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
listKey requiredstringсписок, в который нужно добавить
restaurantKey requiredstringзаведение, которое нужно добавить

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Add restaurant to list"
  },
  "description": "Put a venue on one of the identity's lists. Adding one that is already there changes nothing.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "listKey": {
        "description": "the list to add to",
        "type": "string"
      },
      "restaurantKey": {
        "description": "the venue to add",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "listKey",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "add_restaurant_to_list",
  "title": "Add restaurant to list"
}

🔴 create_list write Создать именной список для пользователя. Назовите его по назначению: в следующий раз гость снова увидит это название, как и вы.

Создать список

Создать именной список для пользователя. Назовите его по назначению: в следующий раз гость снова увидит это название, как и вы.

ПараметрТипОписание
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
title requiredstringназначение списка, сформулированное на языке гостя

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Create list"
  },
  "description": "Start a named list for the identity. Name it for what it is for — the guest will see the name again next time, and so will you.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "title": {
        "description": "what the list is for, in the guest's language",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "title"
    ],
    "type": "object"
  },
  "name": "create_list",
  "title": "Create list"
}

🔴 delete_list destructive Удалить один из списков пользователя вместе со всем его содержимым. Сначала прочитайте список и сообщите гостю, что будет удалено; отменить это действие нельзя.

Удалить список

Удалить один из списков пользователя вместе со всем его содержимым. Сначала прочитайте список и сообщите гостю, что будет удалено; отменить это действие нельзя.

ПараметрТипОписание
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
listKey requiredstringсписок, который нужно удалить

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Delete list"
  },
  "description": "Delete one of the identity's lists and everything on it. Read the list first and tell the guest what will go; this cannot be undone.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "listKey": {
        "description": "the list to delete",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "listKey"
    ],
    "type": "object"
  },
  "name": "delete_list",
  "title": "Delete list"
}

🔴 get_list read Прочитать целиком один из списков текущего пользователя со всеми заведениями в нём. Список другого пользователя недоступен для чтения.

Получить список

Прочитать целиком один из списков текущего пользователя со всеми заведениями в нём. Список другого пользователя недоступен для чтения.

ПараметрТипОписание
listKey requiredstringключ списка из list_lists

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get list"
  },
  "description": "Read one of the acting identity's lists in full, with every venue on it. Another identity's list is not readable.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "listKey": {
        "description": "the list's key, from list_lists",
        "type": "string"
      }
    },
    "required": [
      "listKey"
    ],
    "type": "object"
  },
  "name": "get_list",
  "title": "Get list"
}

🔴 list_lists read Списки самого пользователя с количеством заведений и обложкой для каждого. Прочитайте их в начале повторного разговора: это то, что гость сохранил в прошлый раз.

Список списков

Списки самого пользователя с количеством заведений и обложкой для каждого. Прочитайте их в начале повторного разговора: это то, что гость сохранил в прошлый раз.

ПараметрТипОписание
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество строк, которые нужно пропустить; вместе с totalCount в результате позволяет просматривать список постранично

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List lists"
  },
  "description": "The identity's own lists, with a count and a cover for each. Read this at the start of a returning conversation: it is what the guest kept last time.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      }
    },
    "required": [],
    "type": "object"
  },
  "name": "list_lists",
  "title": "List lists"
}

🔴 remove_restaurant_from_list destructive Удалить заведение из одного из списков пользователя. Перед вызовом сообщите гостю, какое заведение и из какого списка будет удалено: это действие удаляет данные.

Удалить ресторан из списка

Удалить заведение из одного из списков пользователя. Перед вызовом сообщите гостю, какое заведение и из какого списка будет удалено: это действие удаляет данные.

ПараметрТипОписание
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
listKey requiredstringсписок, из которого нужно удалить
restaurantKey requiredstringзаведение, которое нужно удалить

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Remove restaurant from list"
  },
  "description": "Take a venue off one of the identity's lists. Say which venue and which list to the guest before you call it — this removes data.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "listKey": {
        "description": "the list to remove from",
        "type": "string"
      },
      "restaurantKey": {
        "description": "the venue to remove",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "listKey",
      "restaurantKey"
    ],
    "type": "object"
  },
  "name": "remove_restaurant_from_list",
  "title": "Remove restaurant from list"
}

🔴 update_list write Переименовать один из списков пользователя. Заведения в нём останутся без изменений.

Обновить список

Переименовать один из списков пользователя. Заведения в нём останутся без изменений.

ПараметрТипОписание
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
listKey requiredstringсписок, который нужно переименовать
title requiredstringновое название

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Update list"
  },
  "description": "Rename one of the identity's lists. The venues on it are untouched.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "listKey": {
        "description": "the list to rename",
        "type": "string"
      },
      "title": {
        "description": "the new name",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "listKey",
      "title"
    ],
    "type": "object"
  },
  "name": "update_list",
  "title": "Update list"
}

ГРУППА

🔴 close_group_match write Закрыть групповое голосование. Результаты и все голоса останутся доступными для чтения, но голосовать больше нельзя. Закройте голосование, когда группа примет решение, а затем забронируйте выбранный вариант.

Закрыть групповое голосование

Закрыть групповое голосование. Результаты и все голоса останутся доступными для чтения, но голосовать больше нельзя. Закройте голосование, когда группа примет решение, а затем забронируйте выбранный вариант.

ПараметрТипОписание
groupMatchKey requiredstringголосование, которое нужно закрыть
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Close group match"
  },
  "description": "Close a group match to further votes. The match and every vote stay readable; only voting stops. Close it once the group has decided, then book the winner.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "groupMatchKey": {
        "description": "the match to close",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      }
    },
    "required": [
      "groupMatchKey",
      "idempotencyKey"
    ],
    "type": "object"
  },
  "name": "close_group_match",
  "title": "Close group match"
}

🔴 create_group_match write Создать групповое голосование: несколько заведений, несколько дат и список участников. В ответе будет ссылка для общего доступа — передайте её гостю, чтобы он мог переслать её другим: приглашённым не нужен профиль TasteMatch, чтобы проголосовать по ссылке. Предлагайте немного вариантов: это голосование для принятия решения, а не каталог.

Создать групповое голосование

Создать групповое голосование: несколько заведений, несколько дат и список участников. В ответе будет ссылка для общего доступа — передайте её гостю, чтобы он мог переслать её другим: приглашённым не нужен профиль TasteMatch, чтобы проголосовать по ссылке. Предлагайте немного вариантов: это голосование для принятия решения, а не каталог.

ПараметрТипОписание
dateOptions requiredarray<string>даты для выбора в формате RFC3339 с часовым смещением региона
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
restaurantKeys requiredarray<string>заведения для выбора
title requiredstringрешение, которое принимает группа, сформулированное словами гостя
inviteesarray<object>участники, которых нужно пригласить; для каждого укажите имя и адрес электронной почты
invitees[].displayName requiredstringназвание, которое увидит группа
invitees[].email requiredstringадрес, на который отправить приглашение

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Create group match"
  },
  "description": "Start a group decision: a few venues, a few dates, and the people to ask. The answer carries a share link — give that to the guest to send on, because an invitee needs no TasteMatch identity to vote through it. Keep the options few: this is a decision, not a catalogue.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "dateOptions": {
        "description": "the dates to choose between, RFC3339 with the region's UTC offset",
        "items": {
          "type": "string"
        },
        "type": "array"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "invitees": {
        "description": "the people to ask, each by name and email",
        "items": {
          "additionalProperties": false,
          "properties": {
            "displayName": {
              "description": "the name the group will see",
              "type": "string"
            },
            "email": {
              "description": "where the invitation goes",
              "type": "string"
            }
          },
          "required": [
            "displayName",
            "email"
          ],
          "type": "object"
        },
        "type": "array"
      },
      "restaurantKeys": {
        "description": "the venues to choose between",
        "items": {
          "type": "string"
        },
        "type": "array"
      },
      "title": {
        "description": "what the group is deciding, in the guest's words",
        "type": "string"
      }
    },
    "required": [
      "dateOptions",
      "idempotencyKey",
      "restaurantKeys",
      "title"
    ],
    "type": "object"
  },
  "name": "create_group_match",
  "title": "Create group match"
}

🔴 delete_group_match destructive Удалить групповое голосование. Ссылка для общего доступа перестанет работать у всех, у кого она есть, а голоса будут удалены. Перед вызовом прочитайте данные голосования и сообщите гостю, что будет удалено.

Удалить групповое голосование

Удалить групповое голосование. Ссылка для общего доступа перестанет работать у всех, у кого она есть, а голоса будут удалены. Перед вызовом прочитайте данные голосования и сообщите гостю, что будет удалено.

ПараметрТипОписание
groupMatchKey requiredstringголосование, которое нужно удалить
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Delete group match"
  },
  "description": "Delete a group match. The share link stops working for everyone who holds it, and the votes go with it. Read the match and tell the guest what will go before you call this.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "groupMatchKey": {
        "description": "the match to delete",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      }
    },
    "required": [
      "groupMatchKey",
      "idempotencyKey"
    ],
    "type": "object"
  },
  "name": "delete_group_match",
  "title": "Delete group match"
}

🔴 get_group_match read Одно групповое голосование, созданное пользователем: заведения, варианты дат, приглашённые, проголосовавшие и выбранные ими варианты, а также ссылка для общего доступа.

Получить групповое голосование

Одно групповое голосование, созданное пользователем: заведения, варианты дат, приглашённые, проголосовавшие и выбранные ими варианты, а также ссылка для общего доступа.

ПараметрТипОписание
groupMatchKey requiredstringключ голосования из list_group_matches

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get group match"
  },
  "description": "One group match the identity created: the venues, the date options, who was invited, who has voted and for what, and the share link.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "groupMatchKey": {
        "description": "the match's key, from list_group_matches",
        "type": "string"
      }
    },
    "required": [
      "groupMatchKey"
    ],
    "type": "object"
  },
  "name": "get_group_match",
  "title": "Get group match"
}

🔴 list_group_matches read Групповые голосования, созданные этим пользователем, с количеством приглашённых и проголосовавших. Голосования, в которые его только пригласили, здесь не отображаются.

Список групповых голосований

Групповые голосования, созданные этим пользователем, с количеством приглашённых и проголосовавших. Голосования, в которые его только пригласили, здесь не отображаются.

ПараметрТипОписание
limitintegerколичество возвращаемых строк, не более 50
offsetintegerколичество строк, которые нужно пропустить; вместе с totalCount в результате позволяет просматривать список постранично

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List group matches"
  },
  "description": "The group matches this identity created, with how many were invited and how many have voted. Matches it was merely invited to are not here.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "limit": {
        "description": "rows to return, at most 50",
        "type": "integer"
      },
      "offset": {
        "description": "rows to skip; with totalCount in the result this pages through them",
        "type": "integer"
      }
    },
    "required": [],
    "type": "object"
  },
  "name": "list_group_matches",
  "title": "List group matches"
}

🔴 submit_group_match_vote write Подать голос одного участника в открытом групповом голосовании. Передайте memberId\ для приглашённого по имени; для участника, присоединившегося по ссылке, вместо этого передайте displayName\. Учитывайте только то, что действительно сказал этот участник: ключ голосования — единственное подтверждение полномочий, а memberId, который вы не получили от самого участника, перезапишет его голос. Голосование должно быть открытым.

Подать голос в групповом голосовании

Подать голос одного участника в открытом групповом голосовании. Передайте memberId\ для приглашённого по имени; для участника, присоединившегося по ссылке, вместо этого передайте displayName\. Учитывайте только то, что действительно сказал этот участник: ключ голосования — единственное подтверждение полномочий, а memberId, который вы не получили от самого участника, перезапишет его голос. Голосование должно быть открытым.

ПараметрТипОписание
groupMatchKey requiredstringголосование, в котором подаётся голос
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат
picks requiredarray<object>по одному варианту для каждой пары «заведение — дата», которую принимает участник
picks[].dateOptionIdx requiredintegerиндекс варианта даты, начиная с нуля
picks[].restaurantKey requiredstring
displayNamestringимя участника, присоединившегося по ссылке, если его не приглашали по имени
memberIdstringприглашённый, от имени которого подаётся этот голос, из get_group_match

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Submit group match vote"
  },
  "description": "Cast one person's vote in an open group match. Pass \`memberId\` for someone who was invited by name; pass \`displayName\` instead for someone joining off the share link. Vote only what that person actually said: possession of the match key is the whole authorisation, and a memberId you did not collect from that person overwrites their vote. The match must still be open.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "displayName": {
        "description": "the name of someone joining off the link, when they were not invited by name",
        "type": "string"
      },
      "groupMatchKey": {
        "description": "the match being voted in",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "memberId": {
        "description": "the invitee this vote belongs to, from get_group_match",
        "type": "string"
      },
      "picks": {
        "description": "one pick per venue and date pair the person accepts",
        "items": {
          "additionalProperties": false,
          "properties": {
            "dateOptionIdx": {
              "description": "the index of the date option, counting from zero",
              "type": "integer"
            },
            "restaurantKey": {
              "type": "string"
            }
          },
          "required": [
            "dateOptionIdx",
            "restaurantKey"
          ],
          "type": "object"
        },
        "type": "array"
      }
    },
    "required": [
      "groupMatchKey",
      "idempotencyKey",
      "picks"
    ],
    "type": "object"
  },
  "name": "submit_group_match_vote",
  "title": "Submit group match vote"
}

ОБЩИЙ ДОСТУП

🔴 cancel_shared_reservation destructive Отменить бронирование, для которого у гостя есть ссылка на редактирование. Это действие нельзя отменить. Назовите гостю заведение и время бронирования и дождитесь подтверждения, прежде чем вызывать этот инструмент. Для бронирования, принадлежащего текущему пользователю, используйте cancel_reservation: этот инструмент сам проверит подтверждение.

Отменить бронирование по общей ссылке

Отменить бронирование, для которого у гостя есть ссылка на редактирование. Это действие нельзя отменить. Назовите гостю заведение и время бронирования и дождитесь подтверждения, прежде чем вызывать этот инструмент. Для бронирования, принадлежащего текущему пользователю, используйте cancel_reservation: этот инструмент сам проверит подтверждение.

ПараметрТипОписание
editToken requiredstringтокен из личной ссылки гостя для редактирования
idempotencyKey requiredstringключ на ваш выбор для этой записи; повторная отправка того же ключа вернёт первый результат, не создавая дубликат

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Cancel shared reservation"
  },
  "description": "Cancel a reservation the guest holds an edit link for. This cannot be undone. Say the venue and the time back to the guest and wait for them before you call it. For a reservation the acting identity owns, use cancel_reservation instead, which checks that echo for you.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "editToken": {
        "description": "the token from the guest's own edit link",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      }
    },
    "required": [
      "editToken",
      "idempotencyKey"
    ],
    "type": "object"
  },
  "name": "cancel_shared_reservation",
  "title": "Cancel shared reservation"
}

🔴 create_share_key write Создайте ссылку, которую гость сможет отправить кому-нибудь ещё. Только для чтения: любой, кто откроет её, сможет просматривать, но не редактировать. Повторное создание ссылки для того же объекта возвращает ту же ссылку. Создавайте ссылки только для заведения, о котором спросил гость, или бронирования, принадлежащего текущей учётной записи: ссылку может открыть любой, у кого она есть, а в ссылке на бронирование отображаются заведение, дата и размер компании.

Создать ключ доступа

Создайте ссылку, которую гость сможет отправить кому-нибудь ещё. Только для чтения: любой, кто откроет её, сможет просматривать, но не редактировать. Повторное создание ссылки для того же объекта возвращает ту же ссылку. Создавайте ссылки только для заведения, о котором спросил гость, или бронирования, принадлежащего текущей учётной записи: ссылку может открыть любой, у кого она есть, а в ссылке на бронирование отображаются заведение, дата и размер компании.

ПараметрТипОписание
idempotencyKey requiredstringсобственный ключ для этой операции записи; повторная отправка того же ключа вернёт первый результат, а не выполнит запись повторно
kind requiredstringчто нужно предоставить: restaurant, reservation
objectKey requiredstringключ заведения или бронирования, которым нужно поделиться

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Create share key"
  },
  "description": "Mint a link the guest can send to someone else. Read-kind only: whoever opens it can look, never edit. Minting twice for the same object returns the same link. Mint only for a venue the guest asked about or a reservation the acting identity owns — a link is readable by anyone who holds it, and a reservation's link shows the venue, the date and the party size.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "kind": {
        "description": "what to share: restaurant, reservation",
        "type": "string"
      },
      "objectKey": {
        "description": "the key of the venue or reservation to share",
        "type": "string"
      }
    },
    "required": [
      "idempotencyKey",
      "kind",
      "objectKey"
    ],
    "type": "object"
  },
  "name": "create_share_key",
  "title": "Create share key"
}

🟢 get_share_sitemap read Публичный индекс всех заведений и списков, которыми можно поделиться, в формате XML. Большой объём данных: читайте его, чтобы узнать, что вообще доступно, а не для ответа на отдельный вопрос.

Получить карту сайта для общего доступа

Публичный индекс всех заведений и списков, которыми можно поделиться, в формате XML. Большой объём данных: читайте его, чтобы узнать, что вообще доступно, а не для ответа на отдельный вопрос.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get share sitemap"
  },
  "description": "The public index of every shareable venue and list, as XML. Large: read it to discover what exists at all, not to answer one question.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "get_share_sitemap",
  "title": "Get share sitemap"
}

🟢 resolve_share_public_id read Преобразуйте публичный идентификатор страницы — читаемую часть URL заведения или списка на tastematch.io — в объект, который он обозначает, и его ключ.

Разрешить публичный идентификатор общего доступа

Преобразуйте публичный идентификатор страницы — читаемую часть URL заведения или списка на tastematch.io — в объект, который он обозначает, и его ключ.

ПараметрТипОписание
objectType requiredstringrestaurant или list
publicId requiredstringчитаемый идентификатор из публичного URL

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Resolve share public id"
  },
  "description": "Turn a public page id — the readable one in a tastematch.io venue or list URL — into the object it names and its key.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "objectType": {
        "description": "restaurant or list",
        "type": "string"
      },
      "publicId": {
        "description": "the readable id from the public URL",
        "type": "string"
      }
    },
    "required": [
      "objectType",
      "publicId"
    ],
    "type": "object"
  },
  "name": "resolve_share_public_id",
  "title": "Resolve share public id"
}

🟢 resolve_share_token read Преобразуйте ссылку общего доступа, которую прислал гость, в объект, на который она указывает: заведение, бронирование или групповое совпадение, — и получите ключ для дальнейшей работы. Передайте токен — последний сегмент пути ссылки. Если срок действия ссылки истёк или она никогда не принадлежала нам, объект просто не будет найден.

Разрешить токен общего доступа

Преобразуйте ссылку общего доступа, которую прислал гость, в объект, на который она указывает: заведение, бронирование или групповое совпадение, — и получите ключ для дальнейшей работы. Передайте токен — последний сегмент пути ссылки. Если срок действия ссылки истёк или она никогда не принадлежала нам, объект просто не будет найден.

ПараметрТипОписание
token requiredstringтокен из ссылки общего доступа, её последний сегмент пути

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Resolve share token"
  },
  "description": "Turn a share link the guest pasted into the thing it points at — a venue, a reservation or a group match — and the key to carry on with. Pass the token, which is the last path segment of the link. A link that has expired or was never ours is simply not found.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "token": {
        "description": "the token from the share link, its last path segment",
        "type": "string"
      }
    },
    "required": [
      "token"
    ],
    "type": "object"
  },
  "name": "resolve_share_token",
  "title": "Resolve share token"
}

🔴 update_shared_reservation write Измените бронирование, для которого у гостя есть ссылка на редактирование, — созданное где-то ещё, а не через нас. Ссылка служит разрешением, поэтому попросите её у гостя и используйте только для указанного им бронирования. Для бронирования, принадлежащего текущей учётной записи, используйте update_reservation.

Обновить бронирование по ссылке общего доступа

Измените бронирование, для которого у гостя есть ссылка на редактирование, — созданное где-то ещё, а не через нас. Ссылка служит разрешением, поэтому попросите её у гостя и используйте только для указанного им бронирования. Для бронирования, принадлежащего текущей учётной записи, используйте update_reservation.

ПараметрТипОписание
editToken requiredstringтокен из собственной ссылки гостя на редактирование
idempotencyKey requiredstringсобственный ключ для этой операции записи; повторная отправка того же ключа вернёт первый результат, а не выполнит запись повторно
dateTimestringновое время в формате RFC3339 с часовым смещением региона относительно UTC
paxintegerновый размер компании

Определение протокола (tools/list)

{
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false,
    "readOnlyHint": false,
    "title": "Update shared reservation"
  },
  "description": "Change a reservation the guest holds an edit link for — one made somewhere else, not through us. The link is the authorisation, so ask the guest for it and use it only for the reservation they named. For a reservation the acting identity owns, use update_reservation instead.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "dateTime": {
        "description": "the new time, RFC3339 with the region's UTC offset",
        "type": "string"
      },
      "editToken": {
        "description": "the token from the guest's own edit link",
        "type": "string"
      },
      "idempotencyKey": {
        "description": "a key of your own for this one write; sending the same key again returns the first result instead of writing twice",
        "type": "string"
      },
      "pax": {
        "description": "the new party size",
        "type": "integer"
      }
    },
    "required": [
      "editToken",
      "idempotencyKey"
    ],
    "type": "object"
  },
  "name": "update_shared_reservation",
  "title": "Update shared reservation"
}

СЛУЖЕБНЫЕ ИНСТРУМЕНТЫ

🟢 get_skill read Прочитайте полностью одну или несколько инструкций. Запрашивайте несколько сразу, а не по одной за ход.

Получить инструкцию

Прочитайте полностью одну или несколько инструкций. Запрашивайте несколько сразу, а не по одной за ход.

ПараметрТипОписание
names requiredarray<string>инструкции для чтения из list_skills

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get skill"
  },
  "description": "Read one or more playbooks in full. Ask for several at once rather than one per turn.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "names": {
        "description": "the playbooks to read, from list_skills",
        "items": {
          "type": "string"
        },
        "type": "array"
      }
    },
    "required": [
      "names"
    ],
    "type": "object"
  },
  "name": "get_skill",
  "title": "Get skill"
}

🟢 get_vocabulary read Все значения, допустимые для фильтров, сгруппированные по осям, и правила их объединения. Прочитайте перед первым применением фильтра и сохраните на время разговора: неизвестный дескриптор будет отклонён, а неизвестный slug кухни незаметно приведёт к нулевому результату.

Получить словарь значений

Все значения, допустимые для фильтров, сгруппированные по осям, и правила их объединения. Прочитайте перед первым применением фильтра и сохраните на время разговора: неизвестный дескриптор будет отклонён, а неизвестный slug кухни незаметно приведёт к нулевому результату.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Get vocabulary"
  },
  "description": "Every value the filters accept, by axis, with the rule for combining them. Read it before your first filter and keep it for the conversation — a guessed descriptor is refused, and a guessed cuisine slug quietly matches nothing.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "get_vocabulary",
  "title": "Get vocabulary"
}

🟢 list_skills read Доступные инструкции, по одной строке на каждую. Прочитайте инструкцию перед незнакомым сценарием: в ней описаны последовательность действий и подводные камни, которые не указаны в описаниях инструментов.

Список инструкций

Доступные инструкции, по одной строке на каждую. Прочитайте инструкцию перед незнакомым сценарием: в ней описаны последовательность действий и подводные камни, которые не указаны в описаниях инструментов.

Параметров нет.

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "List skills"
  },
  "description": "The playbooks available, one line each. Read a playbook before a journey you have not done before; they carry the sequence and the traps that the tool descriptions cannot.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {},
    "required": [],
    "type": "object"
  },
  "name": "list_skills",
  "title": "List skills"
}

🟡 resolve_key read Преобразуйте названный гостем объект в возможные ключи, начиная с наиболее подходящего. kind\ указывает, что именно нужно найти: restaurant, region, list, reservation. list\ или reservation\ принадлежат вошедшему в систему пользователю и требуют входа. Разрешите имя один раз, а затем используйте полученный ключ: при повторном разрешении то же имя может привести к другому заведению. Если подошло несколько вариантов, назовите гостю найденные варианты.

Разрешить ключ

Преобразуйте названный гостем объект в возможные ключи, начиная с наиболее подходящего. kind\ указывает, что именно нужно найти: restaurant, region, list, reservation. list\ или reservation\ принадлежат вошедшему в систему пользователю и требуют входа. Разрешите имя один раз, а затем используйте полученный ключ: при повторном разрешении то же имя может привести к другому заведению. Если подошло несколько вариантов, назовите гостю найденные варианты.

ПараметрТипОписание
kind requiredstringчто нужно найти: restaurant, region, list, reservation
latnumberширота для поиска региона по координатам, а не по названию
lngnumberдолгота, указывается вместе с lat
regionIdstringограничить поиск заведений одним регионом
textstringназвание, произнесённое гостем

Определение протокола (tools/list)

{
  "annotations": {
    "idempotentHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Resolve key"
  },
  "description": "Turn a name the guest said into the keys it might mean, best first. \`kind\` says what you are looking for: restaurant, region, list, reservation. A \`list\` or a \`reservation\` is the signed-in person's own and needs a sign-in. Resolve once per thing and then thread the key: a name resolved again later can land on a different venue. Say the label back to the guest when more than one candidate came close.",
  "inputSchema": {
    "additionalProperties": false,
    "properties": {
      "kind": {
        "description": "what to resolve: restaurant, region, list, reservation",
        "type": "string"
      },
      "lat": {
        "description": "latitude, to resolve a region from a point instead of a name",
        "type": "number"
      },
      "lng": {
        "description": "longitude, paired with lat",
        "type": "number"
      },
      "regionId": {
        "description": "bound a restaurant search to one region",
        "type": "string"
      },
      "text": {
        "description": "the name as the guest said it",
        "type": "string"
      }
    },
    "required": [
      "kind"
    ],
    "type": "object"
  },
  "name": "resolve_key",
  "title": "Resolve key"
}

ИНСТРУКЦИИ

Вы — агент, использующий TasteMatch core для поиска ресторанов, подбора заведений по вкусам и бронирования. Чтобы быть полезным, вам не нужно разбираться в векторе TasteMatch или нашей системе меток. Используйте любой фильтр в соответствии с вашим пониманием. Никогда не придумывайте дескриптор — вызывайте get_vocabulary. Вы действуете от имени одного человека: того, кто вошёл в эту учётную запись. Пока никто не вошёл, поиск доступен, а инструменту, которому нужен пользователь, потребуется его вход. Сценарии: DISCOVER, PLACE, RESTAURANT, AVAILABILITY, RESERVATION, IDENTITY, TASTE, LISTS, GROUP, SHARE, UTILITY. Соглашение об именах — все инструменты ему соответствуют: get_ | list_ | search_ | filter_ | count_ | resolve_ — чтение; create_ | update_ | delete_ | {verb}_ — запись. Выбирайте по намерению: Название, а не ключ → resolve_key, затем работайте с ключом «рестораны, похожие на X» → filter_restaurants, фасеты из get_vocabulary «сколько» → count_restaurants, никогда не фильтруйте, чтобы затем подсчитать строки Конкретное заведение → get_restaurant с полем fields[] Название блюда → search_dishes Бронирование → get_reservation_info → list_availability_slots → create_instant_reservation или create_reservation_request Сохранить на будущее → список Ключи остаются у вас. Разрешите имя один раз, затем используйте ключ на протяжении всего сценария. Не разрешайте повторно имя, для которого у вас уже есть ключ. Списки — ваше хранилище. Добавляйте в именованный список короткий список вариантов, набор для сравнения или места, которые вы обсуждали: он принадлежит текущей учётной записи и сохранится до следующего сеанса, когда контекст уже будет недоступен. Данные учётной записи запрашиваются только тогда, когда они нужны, и никогда заранее. Поиск ничего не записывает и не требует входа. Для бронирования нужен соответствующий уровень идентификации: имя, один способ связи и принятые Условия. Инструмент, который откажет из-за отсутствия данных, укажет недостающий уровень и инструмент для его получения. Уже сохранённое значение никогда не заменяется переданным вами. Социальных функций нет: подписок, блокировок, подписчиков, поиска пользователей, уведомлений или просмотра профилей. Групповое совпадение — единственная функция для нескольких человек; она работает по ссылке общего доступа, поэтому приглашённым не нужна учётная запись TasteMatch. Эффективная работа с данными: по умолчанию limit равен 10, totalCount сообщается всегда. Всегда используйте фильтры. Запрашивайте fields[], а не целые документы. Объединяйте запросы, не выполняйте их в цикле. Бронирование: сначала прочитайте режим бронирования заведения; мгновенное бронирование и запрос на бронирование — разные инструменты. Бронируйте слот, полученный через list_availability_slots. Оставляйте approxMinutes равным 0, если гость не сообщил, что готов к гибкому времени: ненулевое значение позволяет заведению назначить время, отличное от запрошенного, о чём сообщат поля adjusted и bookedDate. Запись: передавайте idempotencyKey — повторная отправка того же ключа вернёт первый результат, а не выполнит запись повторно. Деструктивные инструменты помечены; прочитайте сведения об объекте и сообщите гостю, что будет удалено, прежде чем вызывать такой инструмент. Перед вызовом cancel_reservation обязательно получите подтверждение: прочитайте бронирование, повторите гостю название заведения и время, дождитесь ответа и укажите оба значения в вызове. Никогда не отменяйте бронирование, опираясь только на ключ, даже если уверены в нём. При сбое прочитайте сообщение. Отказ из-за ошибки проверки, отсутствия объекта или запрета доступа исходит от нас и подсказывает, как исправить вызов: исправьте его, не повторяйте без изменений. Если получен только код ошибки, повторять запрос нельзя; сообщите об этом. Представляйте результаты в виде понятных сводок, а не необработанного JSON, если не попросили иначе. Для незнакомого сценария: list_skills, затем get_skill.

НАВЫКИ

discover-to-reserve — весь сценарий целиком: найти заведение, узнать, как оно принимает бронирования, и забронировать столик

Сначала место, затем заведение, затем бронирование. 1. Преобразуйте местоположение гостя в regionId: вызовите resolve_key с kind region или list_regions. 2. Найдите заведения: filter_restaurants для поиска по типу места, search_restaurants для поиска по названию, search_dishes для поиска по названию блюда. Перед первым применением фильтра один раз прочитайте get_vocabulary. 3. Если описание гостя расплывчатое, сначала сузьте результаты с помощью count_restaurants, а затем запрашивайте строки. 4. Прочитайте сведения о заведении: get_restaurant; по умолчанию используйте краткий ответ, для остальных данных укажите fields[]. 5. Узнайте, как заведение принимает бронирования: get_reservation_info. Это определяет следующий инструмент; не угадывайте. 6. Узнайте, какие места свободны: list_availability_slots. Предложите гостю реальные варианты времени. 7. Только теперь запросите данные учётной записи: гость входит в систему, затем вызовите promote_identity, чтобы получить уровень, необходимый для бронирования. 8. Забронируйте столик: вызовите create_instant_reservation для заведения с мгновенным бронированием, create_reservation_request для заведения, принимающего запросы, или create_reservation_offer для заведения, которое бронирует через собственный виджет. Сообщите гостю, какой из трёх вариантов сработал. Запрос ещё не означает, что столик забронирован; предложение тоже не означает, что столик забронирован, пока гость не завершит процесс в виджете и get_reservation_status не подтвердит это.

sign-in-and-identity — от чьего имени вы действуете, уровни идентификации, инструмент для перехода на следующий уровень и возможности каждого уровня Вы действуете от имени одного человека: того, кто вошёл в эту учётную запись. Личность определяется входом в систему; ничто другое не определяет, чьи данные затрагиваются, и никакой аргумент не может этого изменить. До входа в систему доступно обнаружение. Инструмент, действующий от имени человека, попросит его войти в систему при вызове, поэтому вызывайте его, когда он понадобится гостю, а не просите гостя сначала войти в систему. Уровни, определяемые тем, чем располагает личность: анонимный вошедший пользователь получает доступ к обнаружению, спискам, групповому подбору и резервированию по предпочтениям + имени и фамилии; контактные данные дают доступ к резервированию профиля + подтверждённым контактным данным, ничего сверх этого. Поднимайтесь на следующий уровень с помощью promote_identity. В отказе из-за уровня доступа указаны недостающий уровень и инструмент для его получения — прочитайте сообщение, а не повторяйте вызов. Для мгновенного бронирования заведения нужны и адрес электронной почты, и номер телефона, поэтому соберите оба, если гость хочет подтверждённый столик, а не запрос на бронирование. Уже сохранённое значение никогда не заменяется переданным вами. Прежде чем спрашивать гостя о том, что у нас уже есть, вызовите get_identity.

label-vocabulary — оси дескрипторов, проверка без преобразования и сочетание фасетов

Вызовите get_vocabulary и используйте в точности указанные там слова. Никогда не придумывайте их, не переводите и не сокращайте. Оси: dims (какое заведение), occasions (для каких случаев оно подходит), menuMetas (какой тип обслуживания), menuDescriptors (что есть в меню), cuisine (какая кухня). Между фасетами действует AND, внутри одного фасета — OR. Каждое значение сужает результаты. Передавайте только то, о чём попросил гость, и ничего сверх этого: фильтр, о котором никто не просил, незаметно исключает заведения, которые могли бы понравиться гостю. menuDescriptors относятся к заведению, а не к гостю. Человеку с целиакией не нужен «гость, которому требуется безглютеновое меню»; ему нужно меню, в котором указаны безглютеновые блюда. Неизвестное значение отклоняется с сообщением, в котором назван фасет. Иначе выдуманный идентификатор кухни вернул бы пустой список, который выглядел бы так, будто «здесь нет ничего подобного».

availability-semantics — мгновенное бронирование и запрос, лестница временных интервалов, approxMinutes и adjusted

Режим бронирования заведения определяется самим заведением. Прежде чем выбирать инструмент, прочитайте его с помощью get_reservation_info. Мгновенное бронирование: столики подтверждаются сразу —> create_instant_reservation. Запрос на бронирование: кто-то в заведении принимает его —> create_reservation_request. Временные интервалы задаются самим заведением по его местному времени. Они не привязаны к сетке, поэтому время 19:00 часто недоступно, а 19:15 — доступно. Прочитайте list_availability_slots и бронируйте время из полученного списка. Передайте pax, и инструмент исключит интервалы, слишком короткие для группы, в том числе с учётом минимального размера группы для отдельных зон. Передайте areaId выбранного интервала, чтобы закрепить зону посадки; это сузит поиск, но не переместит бронирование. По умолчанию approxMinutes равен 0, то есть подходит только это время. Увеличивайте значение, только если гость сказал, что готов к гибкому времени, а затем прочитайте adjusted\ и bookedDate\ в ответе и сообщите гостю, что именно ему досталось. Пустой список интервалов или пустое временное окно означают, что в этот день заведение закрыто либо дата выходит за пределы горизонта бронирования. Предложите другой день, а не повторяйте запрос.

group-match — создать групповое голосование, пригласить по ссылке, собрать голоса людей без учётной записи, завершить

Групповой подбор — единственная функция для нескольких человек, и работает она по ссылке. 1. Вызовите create_group_match, указав несколько заведений и несколько дат. Не добавляйте слишком много ни того, ни другого: это выбор, а не каталог. 2. В ответе будет ссылка для общего доступа. Передайте её гостю, чтобы он разослал её остальным. Любой, кто откроет ссылку, сможет проголосовать, даже не имея учётной записи TasteMatch. 3. get_group_match показывает, кто и за что проголосовал. submit_group_match_vote предназначен для голосования, которое поступило к вам, а не по ссылке: укажите memberId для приглашённого по имени или displayName для нового участника. 4. Когда группа определится, вызовите close_group_match. Голоса останутся доступными для просмотра. 5. Затем забронируйте победивший вариант через процесс бронирования от имени того, кто организует встречу.

regions-and-places — определение места и назначение regionId

Для всего, что ограничено регионом, требуется regionId, который предоставляем мы, а не гость. Вызовите resolve_key с kind region, указав город, район, адрес либо широту и долготу. list_regions показывает все регионы, которые мы обслуживаем; search_places находит небольшой населённый пункт и регион, в который он входит. В регионе указана часовая зона IANA, по которой задаётся время заведений. Каждое передаваемое вами значение dateTime должно содержать смещение UTC для этого региона, а время каждого полученного интервала указано по этим часам. Пустой результат означает, что у нас нет заведений в этом месте. Скажите об этом, а не расширяйте поиск незаметно.

lists-as-store — что следует хранить в списке, а не в контексте

Контекст заканчивается вместе с разговором. Список — нет. Сохраните короткий список вариантов, набор для сравнения или места, от которых гость уже отказался, в именованном списке с помощью create_list и add_restaurant_to_list. Назовите список в соответствии с его назначением: гость снова увидит это название. Начинайте повторный разговор с list_lists. Там хранится то, что гость сохранил в прошлый раз. Списки принадлежат действующей учётной записи и здесь являются личными: обмен ими, просмотр чужих списков и поиск по ним относятся к социальным функциям, которых в этом интерфейсе нет. Удаляйте лишнее, а не накапливайте: remove_restaurant_from_list удаляет данные, поэтому сначала сообщите гостю, какое заведение и из какого списка будет удалено.

bulk-and-pagination — сначала подсчёт, затем фильтрация; пакетная обработка вместо цикла; лимиты по умолчанию; fields[]

Запрашивайте меньше. count_restaurants отвечает на вопрос «сколько?» без возврата строк. Используйте его, пока сужаете поиск, а затем один раз получите строки. У всех инструментов для списков и поиска есть параметры limit и offset, а также поле totalCount. По умолчанию limit равен 10. Переходите к следующей странице с помощью offset, а не повторяйте поиск. По умолчанию get_restaurant возвращает только основные поля. Указывайте в fields[] только те поля, о которых действительно собираетесь рассказать гостю; вектор меток и карточки меню занимают много места. Объединяйте пакетные запросы: один вызов impressions за ход, несколько навыков в одном get_skill. Разрешите название один раз и используйте полученный ключ дальше. Повторное разрешение — это и лишний запрос, и риск получить другое заведение.