エキテン ネット予約
エキテン(日本全国のお店・施設の情報サイト)のネット予約を提供するMCPサーバー。オールジャンルの日本国内店舗・施設が対象。店舗検索・空き確認・予約登録・キャンセルに対応。
使うべきか
品質と安全性
検出事項(3)
- HIGH
- MEDIUMget_availability 内
- LOWlogout 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"ekiten-reservation": {
"url": "https://eapi.ekiten.jp/mcp/reservation"
}
}
}リモートエンドポイント
https://eapi.ekiten.jp/mcp/reservationstreamable-httpできること
ツール一覧
ツール(7)
⚪logout
現在のセッションのログイン状態を解除する。
入力スキーマ
{
"type": "object",
"properties": {}
}🟢search_shops(keyword, address, prefecture, city, prefectureCode, ...)
エキテンのネット予約に対応した店舗を検索する。店舗名・住所・大ジャンル・小ジャンルに加え、日時・人数の大まかな条件で絞り込み可能。取得した shopId を予約在庫状況取得・予約登録ツール(get_availability)で使用する。keyword / address / prefecture / city / prefectureCode / cityCode / largeGenreId / smallGenreId のいずれか1つ以上を必ず指定すること。日時・人数条件は任意。メニュー・スタッフ・禁煙喫煙等の詳細条件は search_shops では絞り込めないため、候補店舗ごとに予約在庫状況取得・予約登録ツール(get_availability)を使用すること。
入力スキーマ
{
"type": "object",
"properties": {
"keyword": {
"type": [
"null",
"string"
],
"default": null,
"description": "店舗名。店舗名または店舗名のキーワードで検索(部分一致)。省略可"
},
"address": {
"type": [
"null",
"string"
],
"default": null,
"description": "住所。住所をフリーワードで絞り込み(都道府県名・市区町村名・町名等)。省略可"
},
"prefecture": {
"type": [
"null",
"string"
],
"default": null,
"description": "都道府県名。都道府県名で絞り込み。省略可。(例: 東京都)"
},
"city": {
"type": [
"null",
"string"
],
"default": null,
"description": "市区町村名。市区町村名で絞り込み。省略可。(例: 渋谷区)"
},
"prefectureCode": {
"type": [
"null",
"string"
],
"default": null,
"description": "都道府県JISコード。都道府県JISコードで絞り込み。prefecture より優先。省略可。(例: \"13\"=東京都)"
},
"cityCode": {
"type": [
"null",
"string"
],
"default": null,
"description": "市区町村JISコード。市区町村JISコードで絞り込み。city・prefectureより優先。prefectureCode より優先。省略可。(例: \"13113\"=渋谷区)"
},
"largeGenreId": {
"type": "string",
"default": null,
"description": "大ジャンルID。大ジャンルIDで絞り込み。省略可"
},
"smallGenreId": {
"type": "string",
"default": null,
"description": "小ジャンルID。小ジャンルIDで絞り込み。省略可 largeGenreId と組み合わせて使用、親子関係が不一致の場合はsmallGenreIdを優先"
},
"reservationDate": {
"type": [
"null",
"string"
],
"default": null,
"description": "予約日(YYYY-MM-DD形式)。指定した場合、その日に予約枠(即予約またはリクエスト予約)がある店舗のみに絞り込む。省略可"
},
"reservationTime": {
"type": [
"null",
"string"
],
"default": null,
"description": "予約時間(HH:MM形式)。reservationDateとの同時指定が必須(単独指定はエラー)。指定した場合、その日時に予約枠がある店舗のみに絞り込む。省略時はreservationDate当日のいずれかの時間に空きがあれば対象とする"
},
"headcount": {
"type": [
"null",
"integer"
],
"default": null,
"description": "予約人数。指定した場合、その人数を受け入れ可能な店舗のみに絞り込む。グルメ予約(tableUnit)の店舗のみ判定対象。グルメ予約以外(timeUnit)の店舗は人数条件を無視して結果に含める。省略可"
},
"page": {
"type": "integer",
"default": 1,
"description": "ページ数。1始まり。省略時は1"
},
"perPage": {
"type": "integer",
"default": 10,
"description": "1ページあたりの取得件数(最大20)。省略時は10",
"maximum": 20
}
}
}🟡create_reservation(shopId, reservationDate, reservationTime, lastName, firstName, ...)
エキテンのネット予約を登録する。事前に get_availability(予約在庫状況取得ツール)で店舗の予約可能な空き枠(reservationType・空席スロット・メニュー・スタッフ・クーポン・人数設定等)を取得してから使用すること。tableUnit(グルメ向け)かつ headcountBreakdownEnabled: true(内訳あり)の場合、headcountBreakdown の合計人数は get_availability の該当 slots[].headcountBreakdownMax を上限とする。予約方法は2通り。(1)ログインして予約する場合: email を付けずに呼び出す。未ログインなら 401 認証要求が返るので start_login を呼び、返されたloginUrlをユーザーに提示してログインを完了してもらい、完了後に再実行する(ログインすると会員情報が反映され、予約後のキャンセルも可能)。(2)ログインせず予約する場合: email(メールアドレス)を指定する。予約後に認証メールが送信される(キャンセル不可)。ユーザーにどちらで進めるか確認し、実行前に予約内容の最終確認を求めること。
入力スキーマ
{
"type": "object",
"properties": {
"shopId": {
"type": "string",
"description": "エキテン店舗ID。必須。"
},
"reservationDate": {
"type": "string",
"description": "予約日。必須。YYYY-MM-DD 形式。"
},
"reservationTime": {
"type": "string",
"description": "予約時間。必須。HH:MM 形式。"
},
"lastName": {
"type": "string",
"description": "予約者の姓。必須。"
},
"firstName": {
"type": "string",
"description": "予約者の名。必須。"
},
"lastNameKana": {
"type": "string",
"description": "予約者の姓(ふりがな)。必須。"
},
"firstNameKana": {
"type": "string",
"description": "予約者の名(ふりがな)。必須。"
},
"phone": {
"type": "string",
"description": "電話番号。必須。ハイフンなし。携帯・IP電話(070/080/090/050等)は11桁、固定電話(03/06等)は10桁。形式: ^(0[5-9]0[0-9]{8}|0[1-9][1-9][0-9]{7})$"
},
"headcount": {
"type": [
"null",
"integer"
],
"default": null,
"description": "予約人数。tableUnit(グルメ向け)かつ headcountBreakdownEnabled: false(内訳なし)の場合のみ必須。それ以外(timeUnit、または内訳ありの場合)はトルツメ"
},
"headcountBreakdown": {
"type": [
"array",
"null"
],
"description": "来店人数の内訳。tableUnit かつ headcountBreakdownEnabled: true(内訳あり)の場合のみ必須。キーは headcountBreakdownItems[].itemKey、値は各内訳の人数(integer)。合計人数は get_availability の headcountBreakdownMax が上限。それ以外はトルツメ。例:{\"adult\": 2, \"child\": 1}",
"default": null,
"items": {}
},
"menuId": {
"type": [
"null",
"string"
],
"default": null,
"description": "メニューID。予約在庫状況取得ツール(get_availability)で取得した menus[] から選択したメニューの menuId を指定する。同ツールの menuSelectionRequired が true の場合は必須(false の場合は省略可)"
},
"staffId": {
"type": [
"null",
"string"
],
"default": null,
"description": "スタッフID。reservationType が timeUnit(全ジャンル向け)のみ有効。省略可(指名なし)。tableUnit(グルメ向け)の場合はトルツメ"
},
"couponId": {
"type": [
"null",
"string"
],
"default": null,
"description": "クーポンID。省略可"
},
"smokingPreference": {
"type": [
"null",
"string"
],
"default": null,
"description": "禁煙/喫煙希望。reservationType が tableUnit(グルメ向け)かつ smokingSetting が separate(分煙)の場合のみ有効・必須。それ以外の場合はトルツメ",
"enum": [
"noSmoking",
"smoking",
"noPreference"
]
},
"email": {
"type": [
"null",
"string"
],
"default": null,
"description": "メールアドレス。未ログイン時は必須。ログイン済みの場合は省略可(会員登録済みアドレスを使用)"
},
"note": {
"type": [
"null",
"string"
],
"default": null,
"description": "お店へのご要望。省略可(上限2000文字)"
}
},
"required": [
"shopId",
"reservationDate",
"reservationTime",
"lastName",
"firstName",
"lastNameKana",
"firstNameKana",
"phone"
]
}🟡get_availability(shopId, since, until, reservationDate, reservationTime, ...)
指定した店舗の予約可能な空き枠を、日時・人数・メニュー・スタッフ・禁煙喫煙・クーポン等の条件で取得する。事前に search_shops(店舗検索ツール)で取得した shopId を指定すること。予約方式(timeUnit/tableUnit)によって返却項目が異なる。フィルタ条件を指定した場合、条件に合致しない空き枠は除外(canReserve: falseに更新)され、選択できないメニュー・スタッフ・クーポンには isSelectable: false と unselectableReason(選択不可の理由コード)が付与される。AIがユーザーに予約条件を提示し、条件を確定するための情報として使用する。【reservationType による create_reservation への影響】取得した reservationType によって次ステップ create_reservation の必須パラメータが変わる。timeUnit(全ジャンル向け):headcount不要・staffId指定可・smokingPreference不要。tableUnit(グルメ向け):headcountBreakdownEnabled が false なら headcount 必須、true なら headcountBreakdown(内訳)必須。smokingSetting が separate(分煙)なら smokingPreference 必須。staffId はトルツメ。menuSelectionRequired が true の場合は menuId 必須。【人数上限の確認】tableUnit(グルメ向け)で headcountBreakdownEnabled が true の場合、各 slots[] の headcountBreakdownMax が日時・禁煙喫煙・選択済みメニューの限定数・連結可能なテーブルの最大定員数を反映した合計人数の動的な上限値。ユーザーに人数を提示・確認する際はこの値を上限として使用すること。【選択不可の判定に含まれる要素】menuId・staffId を指定した場合、限定条件(利用可能時間・曜日・日・1日の限定数)に加えて、メニューの同時対応可能件数・スタッフの同時担当可能件数が該当時間枠で上限に達していないかも判定される。staffId・couponId を先に指定した場合、対応不可・併用不可のメニューも isSelectable: false となる(メニュー側の判定はスタッフ・クーポン起点でも双方向に働く)。【tableUnit のテーブル割り当て】tableUnit で headcount または smokingPreference を指定した場合の canReserve 判定は、実際の予約確定時にテーブルを割り当てるアルゴリズムと同一のロジックで判定される(最少人数を満たす単独テーブル優先→連結テーブル→最少人数未満の単独テーブルの順、禁煙/喫煙は同属性同士のみ連結可)。【初回呼び出しの注意】menuId・staffId・couponId・headcountBreakdownの有効な値は店舗ごとに異なり事前にはわからないため、初回呼び出し時はこれらを指定せず、レスポンスのmenus/staffs/coupons/headcountBreakdownItemsから選択肢を取得すること。ユーザーが選択した後、必要であればその値を指定して再度呼び出す。【次のステップ】取得した条件をもとにユーザーへ日時・人数・メニュー等を質問し、create_reservation を呼び出す。
入力スキーマ
{
"type": "object",
"properties": {
"shopId": {
"type": "string",
"description": "店舗ID。必須。店舗検索ツールで取得した shopId を指定"
},
"since": {
"type": [
"null",
"string"
],
"default": null,
"description": "空席情報の取得開始日。YYYY-MM-DD 形式。省略時は当日。reservationDate を指定した場合はそちらが優先される。until との期間(until - since)は14日以内とすること"
},
"until": {
"type": [
"null",
"string"
],
"default": null,
"description": "空席情報の取得終了日。YYYY-MM-DD 形式。省略時は当日から2週間後。reservationDate を指定した場合はそちらが優先される。since との期間(until - since)は14日以内とすること"
},
"reservationDate": {
"type": [
"null",
"string"
],
"default": null,
"description": "予約希望日(単一日)。YYYY-MM-DD 形式。指定した場合 since / until より優先し、その日の空き枠のみ返す。省略可"
},
"reservationTime": {
"type": [
"null",
"string"
],
"default": null,
"description": "予約希望時間。HH:MM 形式。指定した場合、該当時間の枠のみ返す。省略可"
},
"headcount": {
"type": [
"null",
"integer"
],
"default": null,
"description": "予約人数。tableUnit(グルメ向け予約)かつ内訳なしの場合に指定。省略可"
},
"headcountBreakdown": {
"type": [
"array",
"null"
],
"description": "来店人数の内訳。tableUnit かつ内訳ありの場合に指定。キーは headcountBreakdownItems[].itemKey、値は各内訳の人数。省略可",
"default": null,
"items": {}
},
"smokingPreference": {
"type": [
"null",
"string"
],
"default": null,
"description": "禁煙/喫煙希望。tableUnit(グルメ向け)かつ分煙店舗の場合に指定。省略可 noSmoking / smoking / noPreference"
},
"menuId": {
"type": [
"null",
"string"
],
"default": null,
"description": "メニューID。指定した場合、そのメニューの限定条件(利用可能時間・曜日・日・1日の限定数)および該当時間枠の同時対応可能件数に合致する枠のみ canReserve: true とする。省略可"
},
"staffId": {
"type": [
"null",
"string"
],
"default": null,
"description": "スタッフID。timeUnit(全ジャンル向け)のみ有効。指定した場合、そのスタッフの受付可能時間および該当時間枠の同時担当可能件数に合致する枠のみ canReserve: true とする。省略可"
},
"couponId": {
"type": [
"null",
"string"
],
"default": null,
"description": "クーポンID。指定した場合、そのクーポンの限定条件に合致する枠のみ canReserve: true とする。省略可"
}
},
"required": [
"shopId"
]
}🔴cancel_reservation(reservationNo)
ログイン済みユーザーの予約をキャンセルする。未ログインユーザーはキャンセル不可(ログインしていない場合は start_login を呼び、返されたloginUrlをユーザーに提示してログインを案内すること)。キャンセルする reservationNo は create_reservation(予約登録ツール)のレスポンスで取得した値を使用する。実行前に必ずユーザーにキャンセル対象の予約内容を確認し、最終確認を求めること。
入力スキーマ
{
"type": "object",
"properties": {
"reservationNo": {
"type": "string",
"description": "キャンセルする予約番号。必須。create_reservation(予約登録ツール)のレスポンスで取得した reservationNo。"
}
},
"required": [
"reservationNo"
]
}⚪start_login
ネット予約のログインを開始する。返されたloginUrlをユーザーに提示し、ブラウザで開いてログインを完了するよう案内すること。このURLは短命かつ一度きりの使い切りであり、他人と共有しないようユーザーに必ず注意喚起すること。ログイン完了後、AIは同じチャット内で予約操作(cancel_reservation等)を再実行してよい。
入力スキーマ
{
"type": "object",
"properties": {}
}🟢get_genres
エキテンの大ジャンル・小ジャンルの全件一覧を取得する。ジャンルはキーワード検索ではなく一覧から選ぶ方式。引数は不要。AIはユーザーの入力(「美容」「グルメ」等)とレスポンス内の largeGenreName / smallGenreName を照合し、該当する largeGenreId / smallGenreId を選択すること。曖昧または複数該当する場合はユーザーに確認すること。取得したIDを店舗検索ツールに渡す。【次のステップ】選択した largeGenreId / smallGenreId を使って search_shops を呼び出す。
入力スキーマ
{
"type": "object",
"properties": {}
}推奨プロンプト
search_shopssearch_shopsget_availabilityget_availabilitysearch_shopscreate_reservationコミュニティ
エビデンス