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 等客戶端

文件

公開服務 URLhttps://mcp.tastematch.io/
隱私權聲明 URLhttps://tastematch.io/mcp/privacy.html

Streamable 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_restaurants resolve_key。其他呼叫則公開提供,可使用使用者專屬參數;只有登入後才能成功使用這些參數。登入失敗的情況請見下文。
  • 🔴 需要登入:此工具會代表使用者執行操作。使用者可以是匿名的。若未帶權杖呼叫,會收到 HTTP 401 回應,並附上指向 /.well-known/oauth-protected-resource/mcp 的 WWW-Authenticate 挑戰;用戶端會透過 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>菜系 slug,符合其中任一項即可;清單見 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 會將結果限縮為包含此項目的場地;若不想依此限縮,請省略

Wire definition (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>菜系 slug,符合其中任一項即可;清單見 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 會將結果限縮為包含此項目的場地;若不想依此限縮,請省略

Wire definition (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 可用來分頁

Wire definition (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要推薦的區域;省略時使用該身分所屬的區域

Wire definition (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

Wire definition (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 definition (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 definition (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 definition (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 definition (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 definition (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 definition (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 必填stringfiltered、searched、recommended、similar、popular、spotlight 其中之一
impressions[].restaurantKey 必填string
sessionId 必填string自訂 UUID,同一段對話中的每批資料都使用相同值

Wire definition (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 definition (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 definition (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店家的鍵值
paxinteger人數,用於排除容納人數不足的時段

Wire definition (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 definition (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 預訂目前有空位的桌位。此功能適用於即時預訂的店家,呼叫成功後即確認桌位。請預訂從 list_availability_slots 查到的 dateTime\——店家的時段不遵循固定間隔,因此整點時間通常不在可選時段內。除非餐客表示時間彈性,否則請將 approxMinutes\ 保持為 0:非零值允許店家安排鄰近時間,回覆會在 adjusted\ 和 bookedDate\ 中說明。預訂會使用已儲存的身分;即時預訂的店家要求該身分同時具備電子郵件和電話號碼。

建立即時預訂 現在就訂一張有空位的桌子。這適用於即時訂位的餐廳,呼叫成功後即確認訂位。預訂從 list_availability_slots 讀取的 dateTime\。餐廳的時段不會落在固定的時間間隔上,因此整點通常不會是可選時段。除非客人表示時間彈性,否則將 approxMinutes\ 留為 0:非零值會讓餐廳改訂附近的時間,回覆會在 adjusted\ 和 bookedDate\ 中說明。訂位會使用已儲存的身分資料;即時訂位的餐廳需要電子郵件和電話兩者。

參數類型說明
dateTime 必填string要預訂的時段,使用 RFC3339 格式並附上所在地區的 UTC 時差,取自 list_availability_slots
idempotencyKey 必填string為這次寫入自行指定的鍵;再次傳送相同的鍵會傳回第一次的結果,而不會重複寫入
pax 必填integer用餐人數
restaurantKey 必填string餐廳的鍵
approxMinutesinteger餐廳可改訂的時間範圍;0 表示只能訂這個時間,否則不訂
areaIdstring要入座的區域,取自所選時段;此欄位會縮小搜尋範圍,但不會變更訂位
commentstring以客人的原話提供給餐廳的備註

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。每次訂位嘗試只呼叫一次——再次呼叫會建立第二筆草稿。原生支援訂位的餐廳不需要 offer:請改用 create_instant_reservation 或 create_reservation_request。

建立訂位 offer

在透過自有小工具進行訂位的餐廳開啟訂位。這會寫入資料:建立一筆歸屬於目前操作身分的草稿,並產生一個供客人完成訂位的一次性 widgetUrl\。將 URL 提供給客人,然後使用傳回的 reservationKey\ 輪詢 get_reservation_status。每次訂位嘗試只呼叫一次——再次呼叫會建立第二筆草稿。原生支援訂位的餐廳不需要 offer:請改用 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餐廳的鍵
commentstring以客人的原話提供給餐廳的備註

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 讀取 查詢目前操作身分的一筆訂位狀態。提出 offer 後請輪詢此項:小工具訂位只有在餐廳確認後才會成立,而狀態會回報確認結果。

取得訂位狀態

查詢目前操作身分的一筆訂位狀態。提出 offer 後請輪詢此項:小工具訂位只有在餐廳確認後才會成立,而狀態會回報確認結果。

參數類型說明
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
fromDatestring要查詢的第一天,使用 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 的自有訂位集合
dateTimestring新時間,使用 RFC3339 格式並附上所在地區的 UTC 時差
paxinteger新的用餐人數

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為這次寫入自行指定的鍵;再次傳送相同的鍵會傳回第一次的結果,而不會重複寫入
acceptTermsboolean客人在 https://www.tastematch.io/agb 接受條款時為 true
emailstring聯絡電子郵件
firstNamestring客人的名字
lastNamestring客人的姓氏
phonestring國際格式的聯絡電話

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為這次寫入自行指定的鍵;再次傳送相同的鍵會傳回第一次的結果,而不會重複寫入
acceptTermsboolean客人在 https://www.tastematch.io/agb 接受條款時為 true
emailstring聯絡電子郵件
firstNamestring客人的名字
lastNamestring客人的姓氏
phonestring國際格式的聯絡電話

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 write 將餐廳加入身分的其中一份清單。若餐廳已在清單中,則不會有任何變更。

將餐廳加入清單

將餐廳加入身分的其中一份清單。若餐廳已在清單中,則不會有任何變更。

參數類型說明
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 write 為身分建立一份具名清單。請依用途命名——賓客下次會再次看到這個名稱,你也會看到。

建立清單

為身分建立一份具名清單。請依用途命名——賓客下次會再次看到這個名稱,你也會看到。

參數類型說明
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 destructive 刪除身分的一份清單及其中所有項目。請先讀取清單並告知賓客將刪除哪些內容;此操作無法復原。

刪除清單

刪除身分的一份清單及其中所有項目。請先讀取清單並告知賓客將刪除哪些內容;此操作無法復原。

參數類型說明
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 read 完整讀取目前操作身分的一份清單及其中所有餐廳。無法讀取其他身分的清單。

取得清單

完整讀取目前操作身分的一份清單及其中所有餐廳。無法讀取其他身分的清單。

參數類型說明
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 read 身分自己的清單,每份清單都附有項目數量和封面。請在回訪對話開始時讀取:這是賓客上次保留的內容。

列出清單

身分自己的清單,每份清單都附有項目數量和封面。請在回訪對話開始時讀取:這是賓客上次保留的內容。

參數類型說明
limitinteger要傳回的資料列數,最多 50
offsetinteger要略過的資料列數;搭配結果中的 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 destructive 將餐廳從身分的一份清單中移除。呼叫前請告知賓客要移除哪間餐廳及哪份清單——這會刪除資料。

從清單移除餐廳

將餐廳從身分的一份清單中移除。呼叫前請告知賓客要移除哪間餐廳及哪份清單——這會刪除資料。

參數類型說明
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 write 重新命名身分的一份清單。清單中的餐廳不會受到影響。

更新清單

重新命名身分的一份清單。清單中的餐廳不會受到影響。

參數類型說明
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 write 停止群組配對接受新投票。配對和所有投票仍可讀取;只有投票功能會停止。群組做出決定後請關閉配對,接著為勝出的選項訂位。

關閉群組配對

停止群組配對接受新投票。配對和所有投票仍可讀取;只有投票功能會停止。群組做出決定後請關閉配對,接著為勝出的選項訂位。

參數類型說明
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 write 發起群組決策:提供幾間餐廳、幾個日期,以及要詢問的人。回覆會附上分享連結——請交給賓客轉傳,因為受邀者不需要 TasteMatch 身分也能透過連結投票。選項請保持精簡:這是要做決定,不是建立目錄。

建立群組配對

發起群組決策:提供幾間餐廳、幾個日期,以及要詢問的人。回覆會附上分享連結——請交給賓客轉傳,因為受邀者不需要 TasteMatch 身分也能透過連結投票。選項請保持精簡:這是要做決定,不是建立目錄。

參數類型說明
dateOptions 必填array<string>可供選擇的日期,使用 RFC3339 格式並附上該地區的 UTC 時差
idempotencyKey 必填string此次寫入由你自行指定的鍵;再次傳送相同的鍵會傳回首次結果,而不會重複寫入
restaurantKeys 必填array<string>可供選擇的餐廳
title 必填string群組要決定的事項,以賓客的說法填寫
inviteesarray<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 destructive 刪除群組配對。持有分享連結的所有人都將無法再使用該連結,投票也會一併刪除。呼叫前請先讀取配對,並告知賓客將刪除哪些內容。

刪除群組配對

刪除群組配對。持有分享連結的所有人都將無法再使用該連結,投票也會一併刪除。呼叫前請先讀取配對,並告知賓客將刪除哪些內容。

參數類型說明
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 read 由身分建立的一個群組配對:包含餐廳、日期選項、受邀者、投票者及其選擇,以及分享連結。

取得群組配對

由身分建立的一個群組配對:包含餐廳、日期選項、受邀者、投票者及其選擇,以及分享連結。

參數類型說明
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 read 此身分建立的群組配對,包含受邀人數和已投票人數。僅受邀參與、但非由此身分建立的配對不會列在此處。

列出群組配對

此身分建立的群組配對,包含受邀人數和已投票人數。僅受邀參與、但非由此身分建立的配對不會列在此處。

參數類型說明
limitinteger要傳回的資料列數,最多 50
offsetinteger要略過的資料列數;搭配結果中的 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 write 為開放中的群組配對提交一人的投票。若對方是以姓名受邀,請傳入 memberId\;若對方透過分享連結加入,則改傳入 displayName\。只提交該人實際表達的選擇:持有配對鍵即代表完整授權,而未經該人提供便取得的 memberId 會覆寫其投票。配對必須仍處於開放狀態。

提交群組配對投票

為開放中的群組配對提交一人的投票。若對方是以姓名受邀,請傳入 memberId\;若對方透過分享連結加入,則改傳入 displayName\。只提交該人實際表達的選擇:持有配對鍵即代表完整授權,而未經該人提供便取得的 memberId 會覆寫其投票。配對必須仍處於開放狀態。

參數類型說明
groupMatchKey 必填string要投票的配對
idempotencyKey 必填string此次寫入由你自行指定的鍵;再次傳送相同的鍵會傳回首次結果,而不會重複寫入
picks 必填array<object>對方接受的每組餐廳與日期配對各選一項
picks[].dateOptionIdx 必填integer日期選項的索引,從零開始計數
picks[].restaurantKey 必填string
displayNamestring透過連結加入者的姓名;若對方並非以姓名受邀,則填寫此欄
memberIdstring此投票所屬的受邀者,取自 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 destructive 取消賓客持有編輯連結的訂位。此操作無法復原。請向賓客確認餐廳和時間,並等候對方回覆後再呼叫。若訂位屬於目前操作身分,請改用 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

將公開頁面 ID——也就是 tastematch.io 場地或清單 URL 中可讀取的 ID——轉換成它所指向的物件及其金鑰。

參數類型說明
objectType 必填stringrestaurant 或 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,也就是連結路徑的最後一段。已過期或並非由我們建立的連結會直接回報找不到。

解析分享 token

將訪客貼上的分享連結解析為它指向的項目——場地、預訂或群組配對——以及後續操作所需的金鑰。傳入 token,也就是連結路徑的最後一段。已過期或並非由我們建立的連結會直接回報找不到。

參數類型說明
token 必填string分享連結中的 token,也就是路徑的最後一段

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訪客自己的編輯連結中的 token
idempotencyKey 必填string為這次寫入自行指定的金鑰;再次傳送相同金鑰會傳回第一次的結果,而不會重複寫入
dateTimestring新時間,使用含有該地區 UTC 時差的 RFC3339 格式
paxinteger新的人數

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
latnumber緯度;若要從座標而非名稱解析地區,請提供此值
lngnumber經度,與 lat 搭配使用
regionIdstring將餐廳搜尋範圍限定在一個地區
textstring訪客說出的名稱

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。告知訪客實際完成的是哪一種。申請不代表已訂到位子;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 傳入多個技能。名稱解析一次後,沿用該 key。重新解析既會多一次往返,也可能找到不同的場地。