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 |
可流式传输的 HTTP MCP Toolkit,帮助您在瑞士及更远的地方找到最适合您的餐厅。使用上方的 URL 将其添加到 MCP 客户端。发现功能公开开放。
身份验证
要访问我们的 MCP 服务器,您的服务需要使用 DCR(OAuth 2.0 动态客户端注册)在 /.well-known/oauth-protected-resource/mcp 中 authorization_servers 所指的授权服务器上自行注册;该服务器自己的元数据文档包含 registration_endpoint。
要使用需要身份验证的端点,您的用户必须通过 OpenID Connect(使用 PKCE 的授权码流程)向同一授权服务器进行身份验证,并请求 /.well-known/oauth-protected-resource/mcp 中列出的 scopes_supported。
- 🟢 无需登录:任何人都可以使用该工具。
- 🟡 某些参数需要登录,例如
list_recommended_restaurantsresolve_key。其他调用公开开放,可使用用户专属参数;只有登录后才能成功使用这些参数。登录失败的情况见下文。 - 🔴 需要登录:该工具代表用户执行操作。用户可以是匿名用户。不带令牌调用时,服务器会返回 HTTP 401,并附带一个指向
/.well-known/oauth-protected-resource/mcp的WWW-Authenticate挑战;客户端会通过 OAuth(使用 PKCE 的授权码流程)让用户登录。登录用户即为该身份。 - 等级:任何已登录用户都可以使用
anonymous。reservation还需要提供名字和姓氏、一个联系方式并接受条款;当预订需要这些信息时,promote_identity会收集这些信息。 - 速率限制:调用次数按已登录用户分别计数;所有未携带令牌的调用者共用一个额度。超出限制的调用会被拒绝并返回错误代码;请稍后再试,并减少调用次数。
发现
🟢 count_restaurants 读取符合一组筛选条件的场所数量,不返回任何行。探索筛选条件时,请先于 filter_restaurants 调用此工具:它能回答同样的问题,但不会返回文档。
统计餐厅数量
读取符合一组筛选条件的场所数量,不返回任何行。探索筛选条件时,请先于 filter_restaurants 调用此工具:它能回答同样的问题,但不会返回文档。
| 参数 | 类型 | 描述 |
|---|---|---|
drinkOptions | object | 饮品列表必须包含的内容 |
drinkOptions.beerSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
drinkOptions.cocktailSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
drinkOptions.natureWineSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
drinkOptions.wineSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
kitchen | object | 餐厅烹制的菜系 |
kitchen.cuisine | array<string> | 菜系 slug,符合其中任意一项即可;列表见 get_vocabulary |
location | object | 搜索范围:regionId,或带半径的坐标点 |
location.lat | number | 搜索中心的纬度,与 lng 配对使用 |
location.lng | number | 搜索中心的经度 |
location.radiusMeters | integer | 搜索点周围的范围 |
location.regionId | string | 要搜索的区域,取自 list_regions 或 resolve_key |
menuOptions | object | 菜单必须包含的内容 |
menuOptions.fishDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.glutenFreeDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.halalDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.lactoseFreeDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.meatDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.veganDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.vegetarianDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
nutrition | object | 场所的整体类型 |
nutrition.veganRestaurants | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
nutrition.vegetarianRestaurants | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
opening | object | 场所的营业时间 |
opening.daytime | string | 要营业的时段:午餐或晚餐 |
opening.openOn | array<integer> | 必须营业的星期几,星期日为 0 |
reservation | object | 可用的预订方式 |
reservation.hasWidget | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
reservation.liveAvailability | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
线协议定义 (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 读取按筛选条件搜索场所:地点、营业时间、菜系、菜单和饮品列表包含的内容,以及可用的预订方式。每个筛选条件都会将结果缩小到符合条件的场所,因此只传入客人提出的条件。描述词和菜系值来自 get_vocabulary——虚构的值会被拒绝,而不会被忽略。结果按受欢迎程度排序;不会应用口味向量。
筛选餐厅
按筛选条件搜索场所:地点、营业时间、菜系、菜单和饮品列表包含的内容,以及可用的预订方式。每个筛选条件都会将结果缩小到符合条件的场所,因此只传入客人提出的条件。描述词和菜系值来自 get_vocabulary——虚构的值会被拒绝,而不会被忽略。结果按受欢迎程度排序;不会应用口味向量。
| 参数 | 类型 | 描述 |
|---|---|---|
drinkOptions | object | 饮品列表必须包含的内容 |
drinkOptions.beerSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
drinkOptions.cocktailSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
drinkOptions.natureWineSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
drinkOptions.wineSelection | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
kitchen | object | 餐厅烹制的菜系 |
kitchen.cuisine | array<string> | 菜系 slug,符合其中任意一项即可;列表见 get_vocabulary |
limit | integer | 返回的行数,最多 50 |
location | object | 搜索范围:regionId,或带半径的坐标点 |
location.lat | number | 搜索中心的纬度,与 lng 配对使用 |
location.lng | number | 搜索中心的经度 |
location.radiusMeters | integer | 搜索点周围的范围 |
location.regionId | string | 要搜索的区域,取自 list_regions 或 resolve_key |
menuOptions | object | 菜单必须包含的内容 |
menuOptions.fishDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.glutenFreeDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.halalDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.lactoseFreeDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.meatDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.veganDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
menuOptions.vegetarianDishes | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
nutrition | object | 场所的整体类型 |
nutrition.veganRestaurants | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
nutrition.vegetarianRestaurants | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
offset | integer | 要跳过的行数;结果中的 totalCount 可用于分页 |
opening | object | 场所的营业时间 |
opening.daytime | string | 要营业的时段:午餐或晚餐 |
opening.openOn | array<integer> | 必须营业的星期几,星期日为 0 |
reservation | object | 可用的预订方式 |
reservation.hasWidget | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
reservation.liveAvailability | boolean | true 表示仅保留包含该项的场所;省略则不按此项筛选 |
线协议定义 (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 读取某个区域中最受欢迎的场所。必须指定区域:如果不指定,则会读取我们收录的所有场所。
列出热门餐厅
读取某个区域中最受欢迎的场所。必须指定区域:如果不指定,则会读取我们收录的所有场所。
| 参数 | 类型 | 描述 |
|---|---|---|
regionId required | string | 要读取的区域,取自 list_regions |
limit | integer | 返回的行数,最多 50 |
offset | integer | 要跳过的行数;结果中的 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 读取为已登录客人推荐的场所,按口味相似度从高到低排序;任何人登录前,推荐都不是个性化的。bookableOnly\ 仅保留有空位的场所;这会大幅缩小结果范围,并且需要登录。
列出推荐餐厅
读取为已登录客人推荐的场所,按口味相似度从高到低排序;任何人登录前,推荐都不是个性化的。bookableOnly\ 仅保留有空位的场所;这会大幅缩小结果范围,并且需要登录。
| 参数 | 类型 | 描述 |
|---|---|---|
bookableOnly | boolean | 仅保留当前有空位的场所 |
interDiem | integer | 使用 bookableOnly 时,可预订空位最远可提前多少天 |
limit | integer | 返回的行数,最多 50 |
offset | integer | 要跳过的行数;结果中的 totalCount 可用于分页 |
regionId | string | 推荐餐厅所在的区域;省略时使用该身份所属的区域 |
线协议定义 (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 读取与您已持有密钥的某个场所口味相近的场所,按相似度从高到低排序。sameCategory\ 将结果限制在同一菜系类别中,默认开启;如需关闭,请将其设为 false。
列出相似餐厅
读取与您已持有密钥的某个场所口味相近的场所,按相似度从高到低排序。sameCategory\ 将结果限制在同一菜系类别中,默认开启;如需关闭,请将其设为 false。
| 参数 | 类型 | 描述 |
|---|---|---|
restaurantKey required | string | 要查找相似场所的场所 |
limit | integer | 返回的行数,最多 50 |
offset | integer | 要跳过的行数;结果中的 totalCount 可用于分页 |
sameCategory | boolean | 是否限制在同一菜系类别中;省略时为 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 查找供应指定菜品的场所。请按照客人原话、原顺序搜索菜品——菜品的名称是其身份的一部分,因此不要改写、翻译或缩短。较长的词可以容忍轻微拼写错误;很短的词必须完全准确。每条结果都会引用菜单上印出的菜品名称;只有名称逐字匹配时,exact\ 才为 true。此工具不提供营业时间信息——请使用 filter_restaurants 查询。菜单覆盖范围不完整:结果为空表示我们收录的菜单中没有提到该菜品,并不代表没有餐厅供应。
搜索菜品
查找供应指定菜品的场所。请按照客人原话、原顺序搜索菜品——菜品的名称是其身份的一部分,因此不要改写、翻译或缩短。较长的词可以容忍轻微拼写错误;很短的词必须完全准确。每条结果都会引用菜单上印出的菜品名称;只有名称逐字匹配时,exact\ 才为 true。此工具不提供营业时间信息——请使用 filter_restaurants 查询。菜单覆盖范围不完整:结果为空表示我们收录的菜单中没有提到该菜品,并不代表没有餐厅供应。
| 参数 | 类型 | 描述 |
|---|---|---|
q 必填 | string | 客人所说的菜品名称 |
lat | number | 搜索中心的纬度,与 lng 配对 |
limit | integer | 返回的行数,最多 50 |
lng | number | 搜索中心的经度 |
offset | integer | 跳过的行数;结果中的 totalCount 可用于分页 |
radiusMeters | integer | 搜索点周围的范围 |
regionId | string | 将搜索范围限定在一个区域内 |
接口定义 (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 | 搜索内容,至少三个字符 |
limit | integer | 返回的行数,最多 50 |
offset | integer | 跳过的行数;结果中的 totalCount 可用于分页 |
regionId | string | 将搜索范围限定在一个区域内;省略时会搜索我们覆盖的所有区域 |
接口定义 (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"
}
PLACE
🟢 list_regions read TasteMatch 覆盖的区域。每个区域都包含所有区域级工具所需的 regionId,以及该区域场所营业时间和时段所使用的 IANA 时区。传入一个地点坐标,可按距离从近到远获取区域。不属于这些区域的地点没有我们收录的场所。
列出区域
TasteMatch 覆盖的区域。每个区域都包含所有区域级工具所需的 regionId,以及该区域场所营业时间和时段所使用的 IANA 时区。传入一个地点坐标,可按距离从近到远获取区域。不属于这些区域的地点没有我们收录的场所。
| 参数 | 类型 | 描述 |
|---|---|---|
lat | number | 用于按距离排序的纬度,与 lng 配对 |
limit | integer | 返回的行数,最多 50 |
lng | number | 用于按距离排序的经度 |
offset | integer | 跳过的行数;结果中的 totalCount 可用于分页 |
接口定义 (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 | 客人所说的地点名称 |
countryCode | string | 用于限制匹配范围的 ISO 3166-1 alpha-2 代码 |
limit | integer | 返回的行数,最多 50 |
offset | integer | 跳过的行数;结果中的 totalCount 可用于分页 |
接口定义 (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"
}
RESTAURANT
🟢 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 | 场所的键 |
accessType | string | 客人要求打开此场所时,他们是如何找到它的——可选值为 filtered、searched、recommended、similar、popular、spotlight。此时会将打开操作计入客人名下;如果只是为自己查看场所,请省略。 |
fields | array<string> | 要返回的字段;默认投影内容精简,且始终包含键 |
接口定义 (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 | 场所的键 |
接口定义 (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,同一对话中的每个批次都使用相同值 |
接口定义 (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 | 场所的键 |
接口定义 (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"
}
AVAILABILITY
🟢 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 | 场所的键 |
接口定义 (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 | 要查询的日期,采用带区域 UTC 偏移量的 RFC3339 格式 |
restaurantKey 必填 | string | 场所的键 |
pax | integer | 用餐人数,用于排除容纳人数不足的时段 |
接口定义 (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"
}
RESERVATION
🔴 cancel_reservation destructive 取消当前身份拥有的预订。此操作无法撤销,桌位也会被释放。请先读取预订信息,向客人复述场所和时间,等待客人确认,然后在此处再次填写这两项:confirmRestaurantName\ 和 confirmDateTime\ 必须与预订记录一致,否则调用会被拒绝。无论你对预订键多么确定,都不能仅凭键取消预订。
取消预订
取消当前身份拥有的预订。此操作无法撤销,桌位也会被释放。请先读取预订信息,向客人复述场所和时间,等待客人确认,然后在此处再次填写这两项:confirmRestaurantName\ 和 confirmDateTime\ 必须与预订记录一致,否则调用会被拒绝。无论你对预订键多么确定,都不能仅凭键取消预订。
| 参数 | 类型 | 描述 |
|---|---|---|
confirmDateTime 必填 | string | 向客人说明的预订时间,采用 RFC3339 格式 |
confirmRestaurantName 必填 | string | 向客人说明的场所名称 |
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
reservationKey 必填 | string | 要取消的预订,来自 list_reservations 返回的当前身份拥有的预订集合 |
接口定义 (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 预订当前空闲的桌位。此操作适用于 instant 模式的场所,调用返回时预订即已确认。请预订从 list_availability_slots 读取到的 dateTime\——场所的时段不遵循固定间隔,因此整点时间通常不在可选时段内。除非客人表示时间灵活,否则请将 approxMinutes\ 保持为 0:非零值允许场所安排相近时间,结果会在 adjusted\ 和 bookedDate\ 中说明。预订将使用已存储的身份信息;instant 模式的场所要求该身份同时提供电子邮箱和电话号码。
创建即时预订
现在有空位的餐桌。适用于即时预订的场所,返回时即确认餐桌。预订从 list_availability_slots 读取的 dateTime\。场所的时段不按整点排列,因此整点时间通常不在可选时段内。除非客人表示时间灵活,否则将 approxMinutes\ 保持为 0:非零值允许场所改订到附近的时间,回复会在 adjusted\ 和 bookedDate\ 中说明这一点。预订使用已存储的身份信息;即时预订的场所要求同时提供电子邮箱和电话号码。
| 参数 | 类型 | 说明 |
|---|---|---|
dateTime 必填 | string | 要预订的时段,采用 RFC3339 格式并带有所在地区的 UTC 偏移量,取自 list_availability_slots |
idempotencyKey 必填 | string | 为本次写入自行指定的键;再次发送相同的键会返回首次结果,而不会重复写入 |
pax 必填 | integer | 用餐人数 |
restaurantKey 必填 | string | 场所的键 |
approxMinutes | integer | 场所可将预订时间调整到距 dateTime 多远;0 表示只能预订此时间,否则不预订 |
areaId | string | 要入座的区域,取自所选时段;它会缩小搜索范围,但不会更改预订时间 |
comment | string | 用客人的原话写给场所的备注 |
Wire definition (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 交给客人,然后使用返回的 reservationKey\ 轮询 get_reservation_status。每次预订尝试只调用一次——再次调用会生成第二份草稿。原生支持预订的场所无需报价:改用 create_instant_reservation 或 create_reservation_request。
创建预订报价
通过场所自有的预订小组件创建预订。这会写入数据:生成一份归属于当前操作身份的草稿,并生成一个供客人完成预订的一次性 widgetUrl\。将 URL 交给客人,然后使用返回的 reservationKey\ 轮询 get_reservation_status。每次预订尝试只调用一次——再次调用会生成第二份草稿。原生支持预订的场所无需报价:改用 create_instant_reservation 或 create_reservation_request。
| 参数 | 类型 | 说明 |
|---|---|---|
idempotencyKey 必填 | string | 为本次写入自行指定的键;再次发送相同的键会返回首次结果,而不会重复写入 |
restaurantKey 必填 | string | 场所的键 |
Wire definition (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 必填 | string | 申请的时间,采用 RFC3339 格式并带有所在地区的 UTC 偏移量 |
idempotencyKey 必填 | string | 为本次写入自行指定的键;再次发送相同的键会返回首次结果,而不会重复写入 |
pax 必填 | integer | 用餐人数 |
restaurantKey 必填 | string | 场所的键 |
comment | string | 用客人的原话写给场所的备注 |
Wire definition (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 必填 | string | 预订的键,取自 list_reservations |
Wire definition (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 必填 | string | 要改期的预订,取自 list_reservations |
fromDate | string | 要查询的首日,采用 RFC3339 格式;省略时使用预订当天 |
Wire definition (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\ 已转让给其他所有者:仍会显示,以便你向客人说明,但所有针对它的写入操作都会被拒绝。
无参数。
Wire definition (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 必填 | string | 为本次写入自行指定的键;再次发送相同的键会返回首次结果,而不会重复写入 |
reservationKey 必填 | string | 要更改的预订,取自 list_reservations 返回的自有预订集合 |
dateTime | string | 新时间,采用 RFC3339 格式并带有所在地区的 UTC 偏移量 |
pax | integer | 新的用餐人数 |
Wire definition (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 读取 当前操作所用的身份。向客人询问任何信息前先读取:已存档的值不会被替换,再次询问已有信息会显得没有认真倾听。
获取身份
当前操作所用的身份。向客人询问任何信息前先读取:已存档的值不会被替换,再次询问已有信息会显得没有认真倾听。
无参数。
Wire definition (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\,了解用于收集当前等级所缺信息的工具。
无参数。
Wire definition (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 必填 | string | 为本次写入自行指定的键;再次发送相同的键会返回首次结果,而不会重复写入 |
acceptTerms | boolean | 客人接受 https://www.tastematch.io/agb 中的条款时为 true |
email | string | 联系邮箱 |
firstName | string | 客人的名字 |
lastName | string | 客人的姓氏 |
phone | string | 国际格式的联系电话 |
Wire definition (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 必填 | string | 为本次写入自行指定的键;再次发送相同的键会返回首次结果,而不会重复写入 |
acceptTerms | boolean | 客人接受 https://www.tastematch.io/agb 中的条款时为 true |
email | string | 联系邮箱 |
firstName | string | 客人的名字 |
lastName | string | 客人的姓氏 |
phone | string | 国际格式的联系电话 |
Wire definition (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 读取 当前身份存档的口味偏好:包含的描述词、每项描述词对应的置信度,以及由此推导出的口味类型。再次陈述口味偏好前先读取——你是在更正个人资料,而不是新建资料。
获取口味偏好资料
当前身份存档的口味偏好:包含的描述词、每项描述词对应的置信度,以及由此推导出的口味类型。再次陈述口味偏好前先读取——你是在更正个人资料,而不是新建资料。
无参数。
Wire definition (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 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
weights 必填 | map<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 |
Wire definition (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 写入 将场所添加到该身份的某个列表中。若该场所已在列表中,则不会有任何变化。
将餐厅添加到列表
将场所添加到该身份的某个列表中。若该场所已在列表中,则不会有任何变化。
| 参数 | 类型 | 描述 |
|---|---|---|
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
listKey 必填 | string | 要添加到的列表 |
restaurantKey 必填 | string | 要添加的场所 |
Wire definition (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 写入 为该身份创建一个命名列表。请根据用途命名——客人下次会再次看到这个名称,你也会看到。
创建列表
为该身份创建一个命名列表。请根据用途命名——客人下次会再次看到这个名称,你也会看到。
| 参数 | 类型 | 描述 |
|---|---|---|
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
title 必填 | string | 列表的用途,使用客人的语言填写 |
Wire definition (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 破坏性操作 删除该身份的一个列表及其中的所有内容。请先读取列表并告知客人将删除哪些内容;此操作无法撤销。
删除列表
删除该身份的一个列表及其中的所有内容。请先读取列表并告知客人将删除哪些内容;此操作无法撤销。
| 参数 | 类型 | 描述 |
|---|---|---|
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
listKey 必填 | string | 要删除的列表 |
Wire definition (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 读取 完整读取当前操作身份的某个列表及其中的所有场所。无法读取其他身份的列表。
获取列表
完整读取当前操作身份的某个列表及其中的所有场所。无法读取其他身份的列表。
| 参数 | 类型 | 描述 |
|---|---|---|
listKey 必填 | string | 列表的键,来自 list_lists |
Wire definition (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 读取 该身份自己的列表,以及每个列表的数量和封面。在回访对话开始时读取此项:它记录了客人上次保留的内容。
列出列表
该身份自己的列表,以及每个列表的数量和封面。在回访对话开始时读取此项:它记录了客人上次保留的内容。
| 参数 | 类型 | 描述 |
|---|---|---|
limit | integer | 返回的行数,最多 50 行 |
offset | integer | 跳过的行数;结合结果中的 totalCount 可分页浏览 |
Wire definition (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 破坏性操作 从该身份的某个列表中移除一个场所。调用前请告知客人要从哪个列表移除哪个场所——此操作会删除数据。
从列表中移除餐厅
从该身份的某个列表中移除一个场所。调用前请告知客人要从哪个列表移除哪个场所——此操作会删除数据。
| 参数 | 类型 | 描述 |
|---|---|---|
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
listKey 必填 | string | 要从中移除的列表 |
restaurantKey 必填 | string | 要移除的场所 |
Wire definition (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 写入 重命名该身份的某个列表。列表中的场所不会受到影响。
更新列表
重命名该身份的某个列表。列表中的场所不会受到影响。
| 参数 | 类型 | 描述 |
|---|---|---|
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
listKey 必填 | string | 要重命名的列表 |
title 必填 | string | 新名称 |
Wire definition (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 写入 关闭群组匹配,停止接收后续投票。匹配信息和所有投票仍可读取;只有投票会停止。群组做出决定后请关闭匹配,然后预订获胜选项。
关闭群组匹配
关闭群组匹配,停止接收后续投票。匹配信息和所有投票仍可读取;只有投票会停止。群组做出决定后请关闭匹配,然后预订获胜选项。
| 参数 | 类型 | 描述 |
|---|---|---|
groupMatchKey 必填 | string | 要关闭的匹配 |
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
Wire definition (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 写入 发起群组决策:提供几个场所、几个日期,以及需要征询意见的人。返回结果中包含分享链接——请交给客人转发,因为受邀者无需拥有 TasteMatch 身份即可通过链接投票。选项不要太多:这是为了做出决定,而不是创建目录。
创建群组匹配
发起群组决策:提供几个场所、几个日期,以及需要征询意见的人。返回结果中包含分享链接——请交给客人转发,因为受邀者无需拥有 TasteMatch 身份即可通过链接投票。选项不要太多:这是为了做出决定,而不是创建目录。
| 参数 | 类型 | 描述 |
|---|---|---|
dateOptions 必填 | array<string> | 可供选择的日期,使用 RFC3339 格式并包含所在地区的 UTC 偏移量 |
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
restaurantKeys 必填 | array<string> | 可供选择的场所 |
title 必填 | string | 群组要决定的事项,使用客人的原话 |
invitees | array<object> | 要征询意见的人,每人提供姓名和电子邮件地址 |
invitees[].displayName 必填 | string | 群组成员会看到的名称 |
invitees[].email 必填 | string | 邀请发送到的地址 |
Wire definition (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 破坏性操作 删除群组匹配。持有分享链接的所有人都将无法再使用该链接,投票也会一并删除。调用前请先读取匹配信息,并告知客人将删除哪些内容。
删除群组匹配
删除群组匹配。持有分享链接的所有人都将无法再使用该链接,投票也会一并删除。调用前请先读取匹配信息,并告知客人将删除哪些内容。
| 参数 | 类型 | 描述 |
|---|---|---|
groupMatchKey 必填 | string | 要删除的匹配 |
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
Wire definition (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 读取 该身份创建的某个群组匹配:包括场所、日期选项、受邀者、投票者及其投票内容,以及分享链接。
获取群组匹配
该身份创建的某个群组匹配:包括场所、日期选项、受邀者、投票者及其投票内容,以及分享链接。
| 参数 | 类型 | 描述 |
|---|---|---|
groupMatchKey 必填 | string | 匹配的键,来自 list_group_matches |
Wire definition (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 读取 该身份创建的群组匹配,以及受邀人数和已投票人数。仅受邀参与的匹配不会显示在此处。
列出群组匹配
该身份创建的群组匹配,以及受邀人数和已投票人数。仅受邀参与的匹配不会显示在此处。
| 参数 | 类型 | 描述 |
|---|---|---|
limit | integer | 返回的行数,最多 50 行 |
offset | integer | 跳过的行数;结合结果中的 totalCount 可分页浏览 |
Wire definition (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 写入 为开放的群组匹配中的一位成员投票。对于按姓名受邀的人,请传入 memberId\;对于通过分享链接加入的人,请改为传入 displayName\。只提交该成员实际表达的选择:持有匹配键即拥有完整授权,而你未从该成员处收集到的 memberId 会覆盖其投票。匹配必须仍处于开放状态。
提交群组匹配投票
为开放的群组匹配中的一位成员投票。对于按姓名受邀的人,请传入 memberId\;对于通过分享链接加入的人,请改为传入 displayName\。只提交该成员实际表达的选择:持有匹配键即拥有完整授权,而你未从该成员处收集到的 memberId 会覆盖其投票。匹配必须仍处于开放状态。
| 参数 | 类型 | 描述 |
|---|---|---|
groupMatchKey 必填 | string | 要投票的匹配 |
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
picks 必填 | array<object> | 该成员接受的每个场所与日期组合各选一项 |
picks[].dateOptionIdx 必填 | integer | 日期选项的索引,从零开始计数 |
picks[].restaurantKey 必填 | string | |
displayName | string | 通过链接加入且未按姓名受邀者的姓名 |
memberId | string | 此投票所属的受邀者,来自 get_group_match |
Wire definition (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 破坏性操作 取消客人持有编辑链接的预订。此操作无法撤销。请向客人复述场所和时间,并等待客人确认后再调用。若预订属于当前操作身份,请改用 cancel_reservation;该工具会替你核对这些信息。
取消共享预订
取消客人持有编辑链接的预订。此操作无法撤销。请向客人复述场所和时间,并等待客人确认后再调用。若预订属于当前操作身份,请改用 cancel_reservation;该工具会替你核对这些信息。
| 参数 | 类型 | 描述 |
|---|---|---|
editToken 必填 | string | 客人自己的编辑链接中的令牌 |
idempotencyKey 必填 | string | 此次写入使用的自定义键;再次发送相同的键会返回首次结果,而不会重复写入 |
Wire definition (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 必填 | string | 为这次写入自选的密钥;再次发送相同密钥会返回首次操作的结果,而不会重复写入 |
kind 必填 | string | 要分享的内容:restaurant、reservation |
objectKey 必填 | string | 要分享的场所或预订的密钥 |
Wire definition (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 格式读取所有可分享场所和列表的公开索引。内容较大:读取它是为了了解有哪些内容,而不是回答某个具体问题。
无参数。
Wire definition (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 将公开页面 ID(tastematch.io 场所或列表 URL 中可读的部分)转换为它所指向的对象及其密钥。
解析分享公开 ID
将公开页面 ID(tastematch.io 场所或列表 URL 中可读的部分)转换为它所指向的对象及其密钥。
| 参数 | 类型 | 描述 |
|---|---|---|
objectType 必填 | string | restaurant 或 list |
publicId 必填 | string | 公开 URL 中可读的 ID |
Wire definition (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 必填 | string | 分享链接中的令牌,即路径的最后一段 |
Wire definition (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 必填 | string | 客人自己的编辑链接中的令牌 |
idempotencyKey 必填 | string | 为这次写入自选的密钥;再次发送相同密钥会返回首次操作的结果,而不会重复写入 |
dateTime | string | 新时间,采用 RFC3339 格式,并带有所在地区的 UTC 偏移量 |
pax | integer | 新人数 |
Wire definition (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 必填 | array<string> | 要读取的操作手册,来自 list_skills |
Wire definition (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 则会悄悄匹配不到任何结果。
无参数。
Wire definition (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 列出可用的操作手册,每个手册一行。开始尚未执行过的流程前,请先读取相应手册;其中包含工具描述无法涵盖的步骤顺序和注意事项。
列出技能
列出可用的操作手册,每个手册一行。开始尚未执行过的流程前,请先读取相应手册;其中包含工具描述无法涵盖的步骤顺序和注意事项。
无参数。
Wire definition (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 必填 | string | 要解析的对象:restaurant、region、list、reservation |
lat | number | 纬度;从坐标点而非名称解析地区时使用 |
lng | number | 经度,与 lat 配对使用 |
regionId | string | 将餐厅搜索范围限定在一个地区内 |
text | string | 客人说出的名称 |
Wire definition (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 核心功能的代理,负责餐厅发现、口味匹配和预订。无需了解 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:使用 kind 为 region 的 resolve_key,或使用 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 描述的是场所,而不是访客。乳糜泻患者不需要“无麸质访客”这一标签;他们需要的是菜单上标明无麸质菜品。未知值会被拒绝,并附上指出相应筛选维度的消息。否则,编造的 cuisine slug 会返回空列表,让人误以为“这里没有这类场所”。
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,而 regionId 必须由我们提供,不能由访客提供。使用 kind 为 region 的 resolve_key,传入城镇、街区、地址,或纬度和经度。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 可获取多个技能。解析名称一次,然后传递该键。重复解析既会增加一次往返,也可能匹配到不同的场所。