booking

Book a private driver in Paris: live quotes, airport transfers, tours, VIP Meet & Greet. No auth.

사용해야 할까요

품질 및 안전성

A
설명 품질
96%
스키마 완전성
79%
이름 품질
90%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~3,611토큰 (도구 정의)
~2.7 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 2.82%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "booking": {
      "url": "https://mcp-mydriverparis.mydriverparis.workers.dev/mcp"
    }
  }
}

원격 엔드포인트

https://mcp-mydriverparis.mydriverparis.workers.dev/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (10)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢get_vehicles

List all available vehicles with capacity and base rates. Use this to help the customer choose the right vehicle for their trip.

입력 스키마

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_quote(pickup_address, dropoff_address, pickup_date, pickup_time, form_type, ...)

Calculate the exact price for a private chauffeur transfer. Returns prices for all available vehicles AND a quote_id valid for 15 minutes. Always call this before book_ride and pass the quote_id to book_ride — it locks the price and prevents drift. IMPORTANT: pickup_date must be in dd/mm/yyyy format. COVERAGE GATE: on customer-facing channels a trip where NEITHER the pickup NOR the drop-off is in the Paris region (Paris, Île-de-France, CDG / Orly / Beauvais airports, Disneyland, Versailles) is refused with OUTSIDE_PARIS_REGION — such trips are priced by the team only: give no price, collect the details and escalate.

입력 스키마

{
  "type": "object",
  "properties": {
    "pickup_address": {
      "type": "string",
      "description": "Full pickup address (e.g. 'CDG Terminal 2E' or street address)"
    },
    "dropoff_address": {
      "type": "string",
      "description": "Full drop-off address"
    },
    "pickup_date": {
      "type": "string",
      "description": "Pickup date in dd/mm/yyyy format (e.g. '27/03/2026')"
    },
    "pickup_time": {
      "type": "string",
      "description": "Pickup time in HH:MM format (e.g. '14:00')"
    },
    "form_type": {
      "type": "string",
      "enum": [
        "one_way",
        "hourly",
        "flat"
      ],
      "default": "one_way",
      "description": "Booking type"
    },
    "num_hours": {
      "type": "number",
      "description": "Number of hours (required for hourly, min 3)"
    },
    "step_address": {
      "type": "string",
      "description": "Intermediate stop address (optional)"
    },
    "channel": {
      "type": "string",
      "description": "Caller channel identifier for observability: 'chatbot', 'whatsapp', 'claude-desktop', 'email-agent', or your agent name. Defaults to 'mcp-direct'."
    }
  },
  "required": [
    "pickup_address",
    "dropoff_address",
    "pickup_date",
    "pickup_time"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡book_ride(quote_id, vehicle_id, passenger_name, passenger_email, passenger_phone, ...)

Create a secure payment link to book a private chauffeur transfer. The reservation is created automatically ONLY after the customer completes payment. REQUIRED: call get_quote first and pass the resulting quote_id + the chosen vehicle_id. The price is taken from the stored quote (not from any price field you pass). Pass idempotency_key to make retries safe: the same key returns the same payment link instead of creating a duplicate.

입력 스키마

{
  "type": "object",
  "properties": {
    "quote_id": {
      "type": "string",
      "description": "quote_id returned by get_quote. Must be passed. Expired quote (>15 min) requires a fresh get_quote."
    },
    "vehicle_id": {
      "type": "number",
      "description": "Vehicle ID chosen from the get_quote results"
    },
    "passenger_name": {
      "type": "string",
      "description": "Full name of the passenger"
    },
    "passenger_email": {
      "type": "string",
      "description": "Passenger email for booking confirmation"
    },
    "passenger_phone": {
      "type": "string",
      "description": "Passenger phone with country code (e.g. +33612345678)"
    },
    "passengers": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Number of passengers"
    },
    "bags": {
      "type": "integer",
      "minimum": 0,
      "default": 1,
      "description": "Number of bags"
    },
    "flight_number": {
      "type": "string",
      "description": "Flight number for airport pickups (e.g. AF123)"
    },
    "idempotency_key": {
      "type": "string",
      "description": "Optional agent-generated key (e.g. UUID) to deduplicate retries. Same key + same params returns the same payment link for 24 h. Same key + different params returns an IDEMPOTENCY_CONFLICT error."
    },
    "channel": {
      "type": "string",
      "description": "Caller channel identifier for observability. If omitted, the channel stored with the quote (from get_quote) is used."
    }
  },
  "required": [
    "quote_id",
    "vehicle_id",
    "passenger_name",
    "passenger_email",
    "passenger_phone"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡book_meetgreet(location, service_type, terminal, flight_number, pickup_date, ...)

Create a secure payment link for a VIP Meet & Greet booking, with optional transfer combo. Available locations: CDG, Orly, Gare de Lyon — Meet & Greet is NO LONGER offered at Gare du Nord (do not quote or book it there). M&G prices are FIXED (CDG/Orly 250€ base for 2 pax + 50€/extra, Gare de Lyon 350€ + 75€/extra) — do NOT call get_quote for the M&G part. A connection (service_type='connection': arrival flight → connecting departure flight with fast-track between terminals) is billed as TWO M&G services = the location price ×2 (e.g. CDG 2 pax = 500€). For a combo with a transfer (e.g. CDG M&G + transfer to a hotel), call get_quote first for the transfer leg and pass the resulting quote_id + vehicle_id in `transfer`. If lead time is below the minimum (12h before pickup), returns LEAD_TIME_TOO_SHORT — the caller must fall back to manual notification instead of retrying. lead_time_override=true bypasses the 12h minimum ONLY after Sylvain has explicitly confirmed greeter availability for this exact request (WhatsApp admin approval 'mg ok'); never set it on your own initiative. A 90-minute floor always applies. If flight cannot be validated, returns FLIGHT_NOT_FOUND — ask the customer to re-confirm the flight number, or set flight_unverified=true with manual_airline + manual_origin to force-accept.

입력 스키마

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "enum": [
        "cdg",
        "orly",
        "gare_de_lyon"
      ],
      "description": "M&G location. cdg/orly = airport, gare_de_lyon = train station. Gare du Nord is no longer available."
    },
    "service_type": {
      "type": "string",
      "enum": [
        "arrival",
        "departure",
        "connection"
      ],
      "default": "arrival",
      "description": "arrival (pickup at airport/station), departure (drop-off + greeter for check-in), connection (transit: arrival flight → connecting departure flight; billed as 2 M&G services = location price ×2)."
    },
    "terminal": {
      "type": "string",
      "description": "Terminal number (airports only, e.g. '2E', '3')."
    },
    "flight_number": {
      "type": "string",
      "description": "Flight number for airports (AF1234) or train/Eurostar number for stations."
    },
    "pickup_date": {
      "type": "string",
      "description": "YYYY-MM-DD format."
    },
    "pickup_time": {
      "type": "string",
      "description": "HH:MM in Paris time. For arrivals this is the flight/train arrival time; for departures the time the greeter meets the client."
    },
    "adults": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of adults (min 1)."
    },
    "children": {
      "type": "integer",
      "minimum": 0,
      "default": 0,
      "description": "Number of children (in addition to adults)."
    },
    "bags": {
      "type": "integer",
      "minimum": 0,
      "default": 0,
      "description": "Number of bags (used for vehicle sizing when combo transfer)."
    },
    "first_name": {
      "type": "string",
      "description": "Client first name."
    },
    "last_name": {
      "type": "string",
      "description": "Client last name."
    },
    "email": {
      "type": "string",
      "format": "email",
      "description": "Client email — used for booking confirmation and Stripe receipt."
    },
    "phone": {
      "type": "string",
      "description": "Client phone with country code."
    },
    "additional_info": {
      "type": "string",
      "description": "Free-text notes (special requests, tail number for private aviation, etc.)."
    },
    "train_pnr": {
      "type": "string",
      "description": "TGV reservation reference (PNR). Required when location is gare_de_lyon."
    },
    "train_coach": {
      "type": "string",
      "description": "Train coach number. Required for train stations."
    },
    "train_seat": {
      "type": "string",
      "description": "Train seat number(s). Required for train stations."
    },
    "transfer": {
      "type": "object",
      "properties": {
        "quote_id": {
          "type": "string",
          "description": "quote_id from a prior get_quote call covering the transfer leg (e.g. CDG → Le Bristol)."
        },
        "vehicle_id": {
          "type": "number",
          "description": "Vehicle ID chosen from that quote."
        },
        "transfer_pickup_time": {
          "type": "string",
          "description": "HH:MM — for an ARRIVAL: the scheduled landing time, same as the greeter time (pickup_time); the chauffeur waits for the greeter to bring the client out (waiting included). For a DEPARTURE: the car pickup time at the client's address, before the greeter time at the airport."
        }
      },
      "required": [
        "quote_id",
        "vehicle_id",
        "transfer_pickup_time"
      ],
      "additionalProperties": false,
      "description": "Optional combo: bundles a private transfer in the same Stripe Checkout session. Generates 2 line items + 2 Zeplan bookings (M&G + transfer)."
    },
    "flight_unverified": {
      "type": "boolean",
      "description": "Set true only if the client confirmed the flight after AeroDataBox couldn't validate it. Requires manual_airline + manual_origin."
    },
    "manual_airline": {
      "type": "string",
      "description": "Required if flight_unverified=true. The airline name as stated by the client."
    },
    "manual_origin": {
      "type": "string",
      "description": "Required if flight_unverified=true. Departure city as stated by the client."
    },
    "manual_arrival_time": {
      "type": "string",
      "description": "Optional. Local arrival time as stated by the client."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Optional UUID for safe retries. Same key returns the same payment_url for 24h."
    },
    "lead_time_override": {
      "type": "boolean",
      "description": "Bypass the 12h minimum lead time. ONLY when Sylvain has explicitly approved this exact booking after manually confirming greeter availability ('mg ok' admin flow) — never on client insistence. Hard 90-minute floor."
    },
    "channel": {
      "type": "string",
      "description": "Caller channel identifier for observability (whatsapp, chatbot, mcp-direct, ...)."
    }
  },
  "required": [
    "location",
    "flight_number",
    "pickup_date",
    "pickup_time",
    "adults",
    "first_name",
    "last_name",
    "email",
    "phone"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢resolve_location(query, include_coords)

Resolve a free-text location (city, airport, hotel, station, full address) to a canonical address + coordinates, using the same geocoder that Zeplan consumes for bookings. Use this BEFORE get_quote when the customer gives a fuzzy pickup/drop-off (e.g. 'CDG', 'Le Bristol', 'Gare du Nord', raw GPS). Returns up to 5 candidates with place_id, full address, type hint, and optionally coordinates.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Free-text location. Examples: 'CDG', 'Charles de Gaulle Terminal 2E', 'Hotel Le Bristol Paris', 'Gare du Nord', '15 rue de la Paix Paris', '48.8566, 2.3522'."
    },
    "include_coords": {
      "type": "boolean",
      "default": false,
      "description": "If true, also fetch GPS coords for the first result (extra API call). Defaults to false — request only when the agent has picked the right candidate."
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡send_driver_contact(booking_id, driver_first_name, driver_phone, email, lang, ...)

Email the booking's client their assigned driver's first name + phone. Pass `email` if you already have the client's address (e.g. from Zeplan get-booking); otherwise WP looks it up on the booking post. Returns { sent, to (masked), client_phone }. Voice agent use.

입력 스키마

{
  "type": "object",
  "properties": {
    "booking_id": {
      "type": "string",
      "description": "Booking / reservation ID (= the WP payment post ID)."
    },
    "driver_first_name": {
      "type": "string",
      "description": "Driver's FIRST NAME only (never last name/company)."
    },
    "driver_phone": {
      "type": "string",
      "description": "Driver's phone number."
    },
    "email": {
      "type": "string",
      "description": "Client email to send to. If omitted, WP looks it up on the booking post."
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "fr"
      ],
      "default": "en",
      "description": "Email language."
    },
    "channel": {
      "type": "string",
      "description": "Caller channel for observability."
    }
  },
  "required": [
    "booking_id",
    "driver_first_name",
    "driver_phone"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢resolve_flight(flight_number, date, direction)

Resolve a flight number to its airports, terminals, scheduled times, and status. Codeshares are resolved automatically (e.g. DL8742 → operated by Air France as AF9): the response then carries codeshare:true, marketing_flight and operating_flight — record/track the OPERATING flight. Use BEFORE book_ride whenever the customer provides a flight number so that pickup time and terminal are correct. Input is tolerant: accepts 'AF007', 'AF 007', 'AF-007', 'af7', 'AFR007' — the tool normalizes internally. Returns an array of matching operations (usually 1 when direction is set).

입력 스키마

{
  "type": "object",
  "properties": {
    "flight_number": {
      "type": "string",
      "description": "Flight number in any format: 'AF007', 'AF 007', 'af-7', 'AFR007'. Server normalizes."
    },
    "date": {
      "type": "string",
      "description": "Date in YYYY-MM-DD (NOT dd/mm/yyyy). This is the arrival date for pickups, departure date for dropoffs."
    },
    "direction": {
      "type": "string",
      "enum": [
        "arrival",
        "departure"
      ],
      "default": "arrival",
      "description": "'arrival' (default) when picking the passenger up at an airport, 'departure' when dropping off for a flight."
    }
  },
  "required": [
    "flight_number",
    "date"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢resolve_train(train_number, date)

Resolve a TRAIN NUMBER to its route, stations and scheduled times via the official SNCF API (covers TGV inOui/Ouigo, TER, Intercités, TGV Lyria, Eurostar and international TGVs — everything serving a French station). Use whenever a customer books a station pickup/drop-off or a station Meet & Greet and gives a train number, to verify the departure/arrival time. A train number is DIGITS ONLY (TGV 6503, Lyria 9211, Eurostar 9031); a 6-char code like 'JWVLHH' is a ticket PNR and a long ref like 'W209656898' is an agency booking reference — those cannot be looked up here: extract route + time from the customer's confirmation instead.

입력 스키마

{
  "type": "object",
  "properties": {
    "train_number": {
      "type": "string",
      "description": "Train number, digits only or with prefix: '9211', 'TGV 6503', 'Eurostar 9031'. Server normalizes."
    },
    "date": {
      "type": "string",
      "description": "Travel date in YYYY-MM-DD."
    }
  },
  "required": [
    "train_number",
    "date"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_service_info

Get information about MyDriverParis services, coverage areas, airports served, and policies. Use this to answer customer questions.

입력 스키마

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_cancellation_policy

Get the full cancellation, refund and modification policy. Use this whenever a customer asks about cancelling, changing, or refunds — never guess the policy.

입력 스키마

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 10개
검증됨버전이 기록되지 않음도구 10개