MCP Server

airport-transfers

rs.rides/airport-transfers
Travel & Hospitality Public & reachable MCP 2026-07-28

What this MCP does

Provides pricing, route information, and provisional booking requests for airport transfers between Novi Sad and Belgrade Airport.

create_booking_request
Start a booking (email confirmation)
Start a provisional airport-transfer booking. This does NOT finalize a booking — it emails the passenger a one-tap confirmation link, and the ride is only booked once they click it. Payment is to the driver (cash or card); no online payment is needed. Call estimate_price first to confirm the vehicle + price with the user, then call this. Always tell the user to check their email to confirm.
Open world
Input schema
{'type': 'object', 'required': ['routeSlug', 'direction', 'pickupDate', 'pickupTime', 'passengerName', 'passengerEmail', 'passengerPhone', 'passengers'], 'properties': {'locale': {'enum': ['en', 'sr', 'ru'], 'type': 'string', 'description': 'Language for the confirmation email. Default en.'}, 'luggage': {'type': 'integer', 'minimum': 0, 'description': 'Number of large bags (optional).'}, 'vehicle': {'type': 'string', 'description': "Optional vehicle tier name (e.g. 'Group XL'). Defaults to the cheapest vehicle that fits the group."}, 'direction': {'enum': ['to_airport', 'from_airport'], 'type': 'string', 'description': 'to_airport = going to the airport; from_airport = pickup at the airport.'}, 'routeSlug': {'type': 'string', 'description': 'Route slug from list_routes.'}, 'passengers': {'type': 'integer', 'minimum': 1, 'description': 'Number of passengers.'}, 'pickupDate': {'type': 'string', 'description': 'Pickup date, YYYY-MM-DD, Belgrade local time.'}, 'pickupTime': {'type': 'string', 'description': 'Pickup time, HH:MM (24h), Belgrade local time.'}, 'flightNumber': {'type': 'string', 'description': 'Flight number (recommended for airport pickups).'}, 'passengerName': {'type': 'string', 'description': 'Full name of the passenger.'}, 'pickupAddress': {'type': 'string', 'description': 'Pickup or drop-off address. REQUIRED when the ride departs to the airport (direction to_airport) or runs city-to-city — the driver has nowhere to collect the passenger otherwise, and the booking is refused. Optional for an airport arrival, where the driver waits in arrivals.'}, 'passengerEmail': {'type': 'string', 'description': 'Passenger email — the confirmation link is sent here.'}, 'passengerPhone': {'type': 'string', 'description': 'Passenger phone in international format.'}, 'specialRequests': {'type': 'string', 'description': 'Notes, e.g. child seat needed (optional).'}}, 'additionalProperties': False}
Output schema
{'oneOf': [{'type': 'object', 'required': ['ok', 'status', 'booked', 'confirmationEmailSent', 'message'], 'properties': {'ok': {'const': True}, 'route': {'type': 'string'}, 'booked': {'const': False}, 'pickup': {'type': 'string'}, 'status': {'const': 'pending_confirmation'}, 'message': {'type': 'string'}, 'vehicle': {'type': 'string'}, 'priceEur': {'type': 'number'}, 'expiresAt': {'type': 'string', 'format': 'date-time'}, 'requestId': {'type': 'string'}, 'confirmationEmailSent': {'type': 'boolean'}}}, {'type': 'object', 'required': ['ok', 'error'], 'properties': {'ok': {'const': False}, 'error': {'type': 'string'}}}]}
estimate_price
Estimate price
Estimate the price for a trip. Given a route and passenger count (and optional luggage count), returns the cheapest vehicle that fits the group, plus all fitting options. Use this to answer 'how much for N people from X to the airport?'.
Read only
Input schema
{'type': 'object', 'required': ['routeSlug', 'passengers'], 'properties': {'luggage': {'type': 'integer', 'minimum': 0, 'description': 'Number of large bags (optional).'}, 'routeSlug': {'type': 'string', 'description': 'Route slug from list_routes.'}, 'passengers': {'type': 'integer', 'minimum': 1, 'description': 'Number of passengers.'}}, 'additionalProperties': False}
Output schema
{'oneOf': [{'type': 'object', 'required': ['fits', 'route', 'recommended'], 'properties': {'fits': {'const': True}, 'note': {'type': 'string'}, 'route': {'type': 'string'}, 'luggage': {'type': ['integer', 'null']}, 'passengers': {'type': 'integer'}, 'recommended': {'type': 'object', 'required': ['vehicle', 'priceEur'], 'properties': {'vehicle': {'type': 'string'}, 'priceEur': {'type': 'number'}, 'priceRsd': {'type': ['number', 'null']}, 'maxLuggage': {'type': 'integer'}, 'maxPassengers': {'type': 'integer'}}}, 'allFittingOptions': {'type': 'array', 'items': {'type': 'object'}}}}, {'type': 'object', 'required': ['fits', 'message'], 'properties': {'fits': {'const': False}, 'message': {'type': 'string'}}}, {'type': 'object', 'required': ['error'], 'properties': {'error': {'type': 'string'}}}]}
get_booking_request_status
Check booking request status
Check whether a booking request (from create_booking_request) has been confirmed by the passenger yet. Returns 'pending', 'confirmed' (with the booking number), or 'expired'.
Read only
Input schema
{'type': 'object', 'required': ['requestId'], 'properties': {'requestId': {'type': 'string', 'description': 'The requestId returned by create_booking_request.'}}, 'additionalProperties': False}
Output schema
{'oneOf': [{'type': 'object', 'required': ['ok', 'status', 'booked', 'message'], 'properties': {'ok': {'const': True}, 'booked': {'type': 'boolean'}, 'status': {'enum': ['pending', 'confirmed', 'expired']}, 'message': {'type': 'string'}, 'bookingNumber': {'type': ['string', 'null']}}}, {'type': 'object', 'required': ['ok', 'error'], 'properties': {'ok': {'const': False}, 'error': {'type': 'string'}}}]}
get_pricing
Get pricing
Get fixed per-vehicle prices for a route, or for all routes if no routeSlug is given. Prices are fixed (no surge, no metered fares), in EUR and RSD. Each vehicle tier lists max passengers and luggage.
Read only
Input schema
{'type': 'object', 'properties': {'routeSlug': {'type': 'string', 'description': "Optional route slug from list_routes (e.g. 'novi-sad-belgrade-airport'). Omit to get pricing for every route."}}, 'additionalProperties': False}
Output schema
{'oneOf': [{'type': 'object', 'required': ['currency', 'routes'], 'properties': {'routes': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'pricing'], 'properties': {'slug': {'type': 'string'}, 'route': {'type': 'string'}, 'pricing': {'type': 'array', 'items': {'type': 'object', 'required': ['vehicle', 'priceEur'], 'properties': {'vehicle': {'type': 'string'}, 'priceEur': {'type': 'number'}, 'priceRsd': {'type': ['number', 'null']}, 'maxLuggage': {'type': ['integer', 'null']}, 'maxPassengers': {'type': ['integer', 'null']}}}}}}}, 'currency': {'type': 'string'}}}, {'type': 'object', 'required': ['error'], 'properties': {'error': {'type': 'string'}}}]}
get_service_info
Get service info
Get business info: service area, accepted payment methods, supported languages, minimum booking lead time, contact details, and how to book (including the booking URL template).
Read only
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Output schema
{'type': 'object', 'required': ['howToBook'], 'properties': {'url': {'type': 'string'}, 'meta': {'type': 'object'}, 'name': {'type': 'string'}, 'email': {'type': 'string'}, 'howToBook': {'type': 'string'}, 'languages': {'type': 'array', 'items': {'type': 'string'}}, 'telephone': {'type': 'string'}, 'paymentMethods': {'type': 'array', 'items': {'type': 'string'}}, 'bookingUrlTemplate': {'type': 'string'}}}
list_routes
List routes
List all active airport-transfer routes with their slug, endpoints, distance, travel time, available directions, and starting price. Use this first to discover what routes exist.
Read only
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Output schema
{'type': 'object', 'required': ['routes', 'count'], 'properties': {'count': {'type': 'integer'}, 'routes': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'origin', 'destination'], 'properties': {'slug': {'type': 'string'}, 'origin': {'type': 'string'}, 'directions': {'type': 'array', 'items': {'type': 'string'}}, 'distanceKm': {'type': 'number'}, 'destination': {'type': 'string'}, 'fromPriceEur': {'type': 'number'}, 'durationMinutes': {'type': 'number'}}}}}}
Added
get_booking_request_status
Sept. 17, 2026, 12:54 p.m.
Added
create_booking_request
Sept. 17, 2026, 12:54 p.m.
Added
get_service_info
Sept. 17, 2026, 12:54 p.m.
Added
estimate_price
Sept. 17, 2026, 12:54 p.m.
Added
get_pricing
Sept. 17, 2026, 12:54 p.m.
Added
list_routes
Sept. 17, 2026, 12:54 p.m.