Booking Holdings Capabilities
Naftiko 0.5 capability definitions for Booking Holdings - 100 capabilities showing integration workflows and service orchestrations.
Retrieves A/B test experiment results from Optimizely for a given experiment and reports the winning variant.
naftiko: "0.5"
info:
label: "A/B Test Results Fetcher"
description: "Retrieves A/B test experiment results from Optimizely for a given experiment and reports the winning variant."
tags:
- experimentation
- optimizely
- analytics
capability:
exposes:
- type: mcp
namespace: experimentation
port: 8080
tools:
- name: get-experiment-results
description: "Fetch A/B test results from Optimizely for a given experiment ID."
inputParameters:
- name: experiment_id
in: body
type: string
description: "Optimizely experiment identifier."
call: "optimizely.get-results"
with:
experiment_id: "{{experiment_id}}"
consumes:
- type: http
namespace: optimizely
baseUri: "https://api.optimizely.com/v2"
authentication:
type: bearer
token: "$secrets.optimizely_token"
resources:
- name: experiments
path: "/experiments/{{experiment_id}}/results"
inputParameters:
- name: experiment_id
in: path
operations:
- name: get-results
method: GET
Generates a tracked affiliate deep link for a Booking.com property using the affiliate API and logs it in the partnership tracking system.
naftiko: "0.5"
info:
label: "Affiliate Link Generator"
description: "Generates a tracked affiliate deep link for a Booking.com property using the affiliate API and logs it in the partnership tracking system."
tags:
- affiliates
- booking-com
- marketing
capability:
exposes:
- type: mcp
namespace: affiliates
port: 8080
tools:
- name: generate-affiliate-link
description: "Generate a tracked affiliate link for a property and log it."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: affiliate_id
in: body
type: string
description: "Affiliate partner identifier."
- name: campaign
in: body
type: string
description: "Campaign name for tracking."
steps:
- name: create-link
type: call
call: "booking-affiliate.generate-link"
with:
property_id: "{{property_id}}"
affiliate_id: "{{affiliate_id}}"
campaign: "{{campaign}}"
- name: log-link
type: call
call: "segment.track"
with:
userId: "{{affiliate_id}}"
event: "Affiliate Link Generated"
properties: "{\"property_id\":\"{{property_id}}\",\"campaign\":\"{{campaign}}\",\"link\":\"{{create-link.url}}\"}"
consumes:
- type: http
namespace: booking-affiliate
baseUri: "https://distribution-xml.booking.com/2.10"
authentication:
type: basic
username: "$secrets.booking_affiliate_user"
password: "$secrets.booking_affiliate_password"
resources:
- name: links
path: "/json/affiliateLinks"
operations:
- name: generate-link
method: POST
- type: http
namespace: segment
baseUri: "https://api.segment.io/v1"
authentication:
type: basic
username: "$secrets.segment_write_key"
password: ""
resources:
- name: track
path: "/track"
operations:
- name: track
method: POST
Updates room rates for an Agoda property listing through the Agoda partner connectivity API and notifies the revenue team in Slack.
naftiko: "0.5"
info:
label: "Agoda Property Rate Update"
description: "Updates room rates for an Agoda property listing through the Agoda partner connectivity API and notifies the revenue team in Slack."
tags:
- pricing
- agoda
- rate-management
- slack
capability:
exposes:
- type: mcp
namespace: agoda-rates
port: 8080
tools:
- name: update-agoda-rate
description: "Update room rates for a property on Agoda and notify the revenue team in Slack."
inputParameters:
- name: property_id
in: body
type: string
description: "Agoda property identifier."
- name: room_type_id
in: body
type: string
description: "Room type identifier."
- name: rate
in: body
type: number
description: "New nightly rate."
- name: currency
in: body
type: string
description: "ISO 4217 currency code."
steps:
- name: update-rate
type: call
call: "agoda-connectivity.update-rate"
with:
property_id: "{{property_id}}"
room_type_id: "{{room_type_id}}"
rate: "{{rate}}"
currency: "{{currency}}"
- name: notify-revenue
type: call
call: "slack.post-message"
with:
channel: "#revenue-updates"
text: "Agoda rate updated: property {{property_id}}, room {{room_type_id}} set to {{rate}} {{currency}}."
consumes:
- type: http
namespace: agoda-connectivity
baseUri: "https://supply-api.agoda.com/v2"
authentication:
type: bearer
token: "$secrets.agoda_connectivity_token"
resources:
- name: rates
path: "/properties/{{property_id}}/rooms/{{room_type_id}}/rates"
inputParameters:
- name: property_id
in: path
- name: room_type_id
in: path
operations:
- name: update-rate
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Looks up a reservation on the Agoda platform by confirmation number, returning booking status and guest details.
naftiko: "0.5"
info:
label: "Agoda Reservation Lookup"
description: "Looks up a reservation on the Agoda platform by confirmation number, returning booking status and guest details."
tags:
- reservations
- agoda
capability:
exposes:
- type: mcp
namespace: reservations
port: 8080
tools:
- name: get-agoda-reservation
description: "Retrieve an Agoda reservation by confirmation number."
inputParameters:
- name: confirmation_number
in: body
type: string
description: "Agoda confirmation number."
call: "agoda-api.get-reservation"
with:
confirmation_number: "{{confirmation_number}}"
consumes:
- type: http
namespace: agoda-api
baseUri: "https://api.agoda.com/v2"
authentication:
type: bearer
token: "$secrets.agoda_api_token"
resources:
- name: reservations
path: "/reservations/{{confirmation_number}}"
inputParameters:
- name: confirmation_number
in: path
operations:
- name: get-reservation
method: GET
Checks current room rates on Agoda for a specific property and date range, returning rate plans, availability, and pricing tiers.
naftiko: "0.5"
info:
label: "Agoda Room Rate Check"
description: "Checks current room rates on Agoda for a specific property and date range, returning rate plans, availability, and pricing tiers."
tags:
- pricing
- agoda
capability:
exposes:
- type: mcp
namespace: agoda-rates
port: 8080
tools:
- name: check-rates
description: "Check Agoda room rates for a property and date range."
inputParameters:
- name: property_id
in: body
type: string
description: "The Agoda property identifier."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date YYYY-MM-DD."
call: "agoda-rates.get-rates"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
consumes:
- type: http
namespace: agoda-rates
baseUri: "https://api.agoda.com/v1"
authentication:
type: bearer
token: "$secrets.agoda_api_token"
resources:
- name: rates
path: "/properties/{{property_id}}/rates"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
operations:
- name: get-rates
method: GET
Retrieves comprehensive property details from the Booking.com connectivity API by property ID, returning description, amenities, photos, and policies.
naftiko: "0.5"
info:
label: "Booking.com Property Details"
description: "Retrieves comprehensive property details from the Booking.com connectivity API by property ID, returning description, amenities, photos, and policies."
tags:
- inventory
- booking-com
capability:
exposes:
- type: mcp
namespace: booking-property
port: 8080
tools:
- name: get-property-details
description: "Retrieve full property details from Booking.com by property ID."
inputParameters:
- name: property_id
in: body
type: string
description: "The Booking.com property identifier."
call: "booking-property.get-details"
with:
property_id: "{{property_id}}"
consumes:
- type: http
namespace: booking-property
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: properties
path: "/properties/{{property_id}}"
inputParameters:
- name: property_id
in: path
operations:
- name: get-details
method: GET
On booking completion, tracks the conversion event in Segment, updates the guest profile in Salesforce, and logs revenue in Datadog for real-time dashboards.
naftiko: "0.5"
info:
label: "Booking Funnel Analytics Pipeline"
description: "On booking completion, tracks the conversion event in Segment, updates the guest profile in Salesforce, and logs revenue in Datadog for real-time dashboards."
tags:
- analytics
- segment
- salesforce
- datadog
- booking-com
capability:
exposes:
- type: mcp
namespace: booking-analytics
port: 8080
tools:
- name: track-booking-conversion
description: "Track a completed booking across analytics, CRM, and monitoring systems."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
- name: guest_id
in: body
type: string
description: "Guest identifier."
- name: revenue
in: body
type: number
description: "Booking revenue amount."
- name: currency
in: body
type: string
description: "Currency code."
steps:
- name: track-segment
type: call
call: "segment.track"
with:
userId: "{{guest_id}}"
event: "Booking Completed"
properties: "{\"reservation_id\":\"{{reservation_id}}\",\"revenue\":{{revenue}},\"currency\":\"{{currency}}\"}"
- name: update-contact
type: call
call: "salesforce.update-contact"
with:
guest_id: "{{guest_id}}"
last_booking_date: "2026-03-27"
last_booking_id: "{{reservation_id}}"
- name: log-revenue
type: call
call: "datadog.post-metric"
with:
metric: "booking.revenue"
value: "{{revenue}}"
tags: "currency:{{currency}},reservation:{{reservation_id}}"
consumes:
- type: http
namespace: segment
baseUri: "https://api.segment.io/v1"
authentication:
type: basic
username: "$secrets.segment_write_key"
password: ""
resources:
- name: track
path: "/track"
operations:
- name: track
method: POST
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact/{{guest_id}}"
inputParameters:
- name: guest_id
in: path
operations:
- name: update-contact
method: PATCH
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/series"
operations:
- name: post-metric
method: POST
Processes a reservation cancellation by updating the booking status, issuing a refund through Stripe, notifying the guest via SendGrid, and updating the Zendesk ticket.
naftiko: "0.5"
info:
label: "Cancellation Workflow"
description: "Processes a reservation cancellation by updating the booking status, issuing a refund through Stripe, notifying the guest via SendGrid, and updating the Zendesk ticket."
tags:
- reservations
- cancellation
- booking-com
- stripe
- sendgrid
- zendesk
capability:
exposes:
- type: mcp
namespace: cancellation
port: 8080
tools:
- name: process-cancellation
description: "Cancel a reservation end-to-end: update booking, refund payment, notify guest, update support ticket."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
- name: payment_intent_id
in: body
type: string
description: "Stripe payment intent for the booking."
- name: ticket_id
in: body
type: string
description: "Zendesk ticket ID if one exists."
steps:
- name: cancel-booking
type: call
call: "booking-connectivity.cancel-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: refund-payment
type: call
call: "stripe.create-refund"
with:
payment_intent: "{{payment_intent_id}}"
reason: "requested_by_customer"
- name: notify-guest
type: call
call: "sendgrid.send-email"
with:
to: "{{cancel-booking.guest_email}}"
subject: "Cancellation Confirmed - Reservation {{reservation_id}}"
body: "Your reservation {{reservation_id}} at {{cancel-booking.property_name}} has been cancelled. Refund of {{refund-payment.amount}} {{refund-payment.currency}} will be processed within 5-10 business days."
- name: update-ticket
type: call
call: "zendesk.update-ticket"
with:
ticket_id: "{{ticket_id}}"
status: "solved"
internal_note: "Cancellation processed. Refund ID: {{refund-payment.id}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}/cancel"
inputParameters:
- name: reservation_id
in: path
operations:
- name: cancel-reservation
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: refunds
path: "/refunds"
operations:
- name: create-refund
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: update-ticket
method: PUT
Searches vehicles on Rentalcars, creates a booking, processes payment via Stripe, attaches insurance, and confirms via SendGrid.
naftiko: "0.5"
info:
label: "Car Rental Booking with Insurance Orchestrator"
description: "Searches vehicles on Rentalcars, creates a booking, processes payment via Stripe, attaches insurance, and confirms via SendGrid."
tags:
- car-rental
- rentalcars
- stripe
- sendgrid
capability:
exposes:
- type: mcp
namespace: car-rental-booking
port: 8080
tools:
- name: book-car-with-insurance
description: "Book a rental car with optional insurance and payment processing."
inputParameters:
- name: vehicle_id
in: body
type: string
description: "Rentalcars vehicle ID."
- name: pickup_date
in: body
type: string
description: "Pickup date YYYY-MM-DD."
- name: customer_email
in: body
type: string
description: "Customer email."
- name: payment_method_id
in: body
type: string
description: "Stripe payment method ID."
steps:
- name: create-booking
type: call
call: "rentalcars.create-booking"
with:
vehicle_id: "{{vehicle_id}}"
pickup_date: "{{pickup_date}}"
- name: charge-payment
type: call
call: "stripe.create-payment-intent"
with:
amount: "{{create-booking.total_cents}}"
currency: "{{create-booking.currency}}"
payment_method: "{{payment_method_id}}"
confirm: true
- name: send-confirmation
type: call
call: "sendgrid.send-email"
with:
to: "{{customer_email}}"
subject: "Car Rental Confirmed — {{create-booking.confirmation_id}}"
body: "Your rental is booked! Vehicle: {{create-booking.vehicle_name}}. Pickup: {{pickup_date}}. Confirmation: {{create-booking.confirmation_id}}."
consumes:
- type: http
namespace: rentalcars
baseUri: "https://api.rentalcars.com/v1"
authentication:
type: bearer
token: "$secrets.rentalcars_api_token"
resources:
- name: bookings
path: "/bookings"
operations:
- name: create-booking
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents"
operations:
- name: create-payment-intent
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Searches for car rental options through the Kayak API by pickup location, dates, and vehicle preferences.
naftiko: "0.5"
info:
label: "Car Rental Search via Kayak"
description: "Searches for car rental options through the Kayak API by pickup location, dates, and vehicle preferences."
tags:
- car-rental
- kayak
- search
capability:
exposes:
- type: mcp
namespace: car-rental
port: 8080
tools:
- name: search-car-rentals
description: "Search car rental options on Kayak by location and dates."
inputParameters:
- name: pickup_location
in: body
type: string
description: "Pickup location code or airport IATA code."
- name: pickup_date
in: body
type: string
description: "Pickup date YYYY-MM-DD."
- name: dropoff_date
in: body
type: string
description: "Drop-off date YYYY-MM-DD."
call: "kayak-api.search-cars"
with:
pickup_location: "{{pickup_location}}"
pickup_date: "{{pickup_date}}"
dropoff_date: "{{dropoff_date}}"
consumes:
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: cars
path: "/cars/search"
inputParameters:
- name: pickup_location
in: query
- name: pickup_date
in: query
- name: dropoff_date
in: query
operations:
- name: search-cars
method: GET
When a Stripe chargeback is received, retrieves the reservation evidence from Booking.com, submits the dispute response to Stripe, and logs the case in Jira.
naftiko: "0.5"
info:
label: "Chargeback Dispute Handler"
description: "When a Stripe chargeback is received, retrieves the reservation evidence from Booking.com, submits the dispute response to Stripe, and logs the case in Jira."
tags:
- payments
- fraud
- stripe
- booking-com
- jira
capability:
exposes:
- type: mcp
namespace: chargeback-handling
port: 8080
tools:
- name: handle-chargeback
description: "Process a Stripe chargeback by gathering evidence, submitting a dispute, and logging in Jira."
inputParameters:
- name: dispute_id
in: body
type: string
description: "Stripe dispute identifier."
- name: reservation_id
in: body
type: string
description: "Associated reservation ID for evidence."
steps:
- name: get-dispute
type: call
call: "stripe.get-dispute"
with:
dispute_id: "{{dispute_id}}"
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: submit-evidence
type: call
call: "stripe.update-dispute"
with:
dispute_id: "{{dispute_id}}"
evidence_customer_name: "{{get-reservation.guest_name}}"
evidence_customer_email: "{{get-reservation.guest_email}}"
evidence_service_date: "{{get-reservation.checkin}}"
- name: log-case
type: call
call: "jira.create-issue"
with:
project: "FRAUD"
summary: "Chargeback dispute {{dispute_id}} - {{get-dispute.amount}} {{get-dispute.currency}}"
description: "Dispute for reservation {{reservation_id}}. Guest: {{get-reservation.guest_name}}. Amount: {{get-dispute.amount}} {{get-dispute.currency}}. Reason: {{get-dispute.reason}}."
issue_type: "Task"
priority: "High"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: disputes
path: "/disputes/{{dispute_id}}"
inputParameters:
- name: dispute_id
in: path
operations:
- name: get-dispute
method: GET
- name: update-dispute
method: POST
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
One day before check-in, retrieves the reservation, sends an SMS reminder via Twilio, and posts a push notification via Firebase Cloud Messaging.
naftiko: "0.5"
info:
label: "Check-in Reminder Orchestrator"
description: "One day before check-in, retrieves the reservation, sends an SMS reminder via Twilio, and posts a push notification via Firebase Cloud Messaging."
tags:
- notifications
- check-in
- booking-com
- twilio
- firebase
capability:
exposes:
- type: mcp
namespace: checkin-reminders
port: 8080
tools:
- name: send-checkin-reminder
description: "Send a multi-channel check-in reminder via SMS and push notification."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
steps:
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: send-sms
type: call
call: "twilio.send-sms"
with:
To: "{{get-reservation.guest_phone}}"
From: "$secrets.twilio_phone_number"
Body: "Reminder: Your check-in at {{get-reservation.property_name}} is tomorrow, {{get-reservation.checkin}}. Confirmation: {{get-reservation.pin}}."
- name: send-push
type: call
call: "firebase.send-notification"
with:
token: "{{get-reservation.device_token}}"
title: "Check-in Tomorrow"
body: "Your stay at {{get-reservation.property_name}} begins tomorrow. Tap to view details."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Messages.json"
operations:
- name: send-sms
method: POST
- type: http
namespace: firebase
baseUri: "https://fcm.googleapis.com/v1/projects/$secrets.firebase_project_id"
authentication:
type: bearer
token: "$secrets.firebase_token"
resources:
- name: notifications
path: "/messages:send"
operations:
- name: send-notification
method: POST
Searches Confluence for internal policy documents matching a keyword query.
naftiko: "0.5"
info:
label: "Confluence Policy Lookup"
description: "Searches Confluence for internal policy documents matching a keyword query."
tags:
- knowledge-management
- confluence
capability:
exposes:
- type: mcp
namespace: knowledge-management
port: 8080
tools:
- name: search-policies
description: "Search Confluence for policy documents by keyword."
inputParameters:
- name: query
in: body
type: string
description: "Search query string."
call: "confluence-api.search-content"
with:
cql: "type=page AND label=policy AND text~\"{{query}}\""
consumes:
- type: http
namespace: confluence-api
baseUri: "https://bookingholdings.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: search
path: "/content/search"
operations:
- name: search-content
method: GET
Publishes a booking event to a Confluent Kafka topic and logs the event dispatch in Datadog for observability.
naftiko: "0.5"
info:
label: "Confluent Kafka Booking Event Publisher"
description: "Publishes a booking event to a Confluent Kafka topic and logs the event dispatch in Datadog for observability."
tags:
- eventing
- confluent-kafka
- booking-com
- datadog
capability:
exposes:
- type: mcp
namespace: event-bus
port: 8080
tools:
- name: publish-booking-event
description: "Publish a booking event to Confluent Kafka and log dispatch in Datadog."
inputParameters:
- name: topic
in: body
type: string
description: "Kafka topic name."
- name: key
in: body
type: string
description: "Message key (e.g. reservation ID)."
- name: value
in: body
type: string
description: "JSON message payload."
steps:
- name: produce-event
type: call
call: "confluent.produce"
with:
topic: "{{topic}}"
key: "{{key}}"
value: "{{value}}"
- name: log-dispatch
type: call
call: "datadog.post-event"
with:
title: "Kafka event published to {{topic}}"
text: "Key: {{key}}. Offset: {{produce-event.offset}}."
tags: "service:event-bus,topic:{{topic}}"
consumes:
- type: http
namespace: confluent
baseUri: "https://pkc-booking.confluent.cloud/kafka/v3/clusters/$secrets.confluent_cluster_id"
authentication:
type: basic
username: "$secrets.confluent_api_key"
password: "$secrets.confluent_api_secret"
resources:
- name: records
path: "/topics/{{topic}}/records"
inputParameters:
- name: topic
in: path
operations:
- name: produce
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
resources:
- name: events
path: "/events"
operations:
- name: post-event
method: POST
Syncs property availability across Booking.com and Agoda via Confluent Kafka, validates consistency in Snowflake, and alerts on mismatches via Slack.
naftiko: "0.5"
info:
label: "Cross-Platform Availability Sync Pipeline"
description: "Syncs property availability across Booking.com and Agoda via Confluent Kafka, validates consistency in Snowflake, and alerts on mismatches via Slack."
tags:
- inventory
- booking-com
- agoda
- confluent-kafka
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: availability-sync
port: 8080
tools:
- name: sync-availability
description: "Synchronize property availability across platforms with validation."
inputParameters:
- name: property_id
in: body
type: string
description: "Property ID."
steps:
- name: get-booking-avail
type: call
call: "booking-api.get-availability"
with:
property_id: "{{property_id}}"
- name: publish-event
type: call
call: "kafka.produce-event"
with:
topic: "availability-sync"
key: "{{property_id}}"
value: "{{get-booking-avail.rooms}}"
- name: validate
type: call
call: "snowflake.execute-statement"
with:
statement: "CALL INVENTORY.VALIDATE_SYNC('{{property_id}}')"
- name: alert-mismatches
type: call
call: "slack.post-message"
with:
channel: "#inventory-ops"
text: "Availability sync for {{property_id}}: {{validate.mismatch_count}} mismatches found."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
operations:
- name: get-availability
method: GET
- type: http
namespace: kafka
baseUri: "https://kafka.bookingholdings.com/v3"
authentication:
type: bearer
token: "$secrets.kafka_rest_token"
resources:
- name: records
path: "/topics/{{topic}}/records"
inputParameters:
- name: topic
in: path
operations:
- name: produce-event
method: POST
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches the latest currency exchange rate from the Open Exchange Rates API for multi-currency pricing calculations.
naftiko: "0.5"
info:
label: "Currency Exchange Rate Fetch"
description: "Fetches the latest currency exchange rate from the Open Exchange Rates API for multi-currency pricing calculations."
tags:
- finance
- currency
- open-exchange-rates
capability:
exposes:
- type: mcp
namespace: currency
port: 8080
tools:
- name: get-exchange-rate
description: "Get the latest exchange rate between two currencies."
inputParameters:
- name: base
in: body
type: string
description: "Base currency code (e.g. USD)."
- name: target
in: body
type: string
description: "Target currency code (e.g. EUR)."
call: "oxr.get-latest"
with:
base: "{{base}}"
symbols: "{{target}}"
consumes:
- type: http
namespace: oxr
baseUri: "https://openexchangerates.org/api"
authentication:
type: apiKey
name: "app_id"
in: query
value: "$secrets.oxr_app_id"
resources:
- name: rates
path: "/latest.json"
inputParameters:
- name: base
in: query
- name: symbols
in: query
operations:
- name: get-latest
method: GET
When a Zendesk support ticket meets escalation criteria, retrieves the reservation details, enriches the ticket with booking context, and notifies the escalation team in Slack.
naftiko: "0.5"
info:
label: "Customer Support Ticket Escalation"
description: "When a Zendesk support ticket meets escalation criteria, retrieves the reservation details, enriches the ticket with booking context, and notifies the escalation team in Slack."
tags:
- support
- zendesk
- booking-com
- slack
- escalation
capability:
exposes:
- type: mcp
namespace: support-escalation
port: 8080
tools:
- name: escalate-ticket
description: "Escalate a Zendesk support ticket by enriching it with reservation data and notifying the escalation team."
inputParameters:
- name: ticket_id
in: body
type: string
description: "Zendesk ticket ID."
- name: reservation_id
in: body
type: string
description: "Associated reservation ID."
steps:
- name: get-ticket
type: call
call: "zendesk.get-ticket"
with:
ticket_id: "{{ticket_id}}"
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: update-ticket
type: call
call: "zendesk.update-ticket"
with:
ticket_id: "{{ticket_id}}"
priority: "urgent"
tags: "escalated,booking-{{reservation_id}}"
internal_note: "Property: {{get-reservation.property_name}}. Checkin: {{get-reservation.checkin}}. Guest: {{get-reservation.guest_name}}. Status: {{get-reservation.status}}."
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#cs-escalations"
text: "Escalated ticket {{ticket_id}}: {{get-ticket.subject}}. Reservation {{reservation_id}} at {{get-reservation.property_name}}. Guest: {{get-reservation.guest_name}}."
consumes:
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: get-ticket
method: GET
- name: update-ticket
method: PUT
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a Datadog alert fires for a booking service, creates a PagerDuty incident and posts context to the Slack on-call channel.
naftiko: "0.5"
info:
label: "Datadog Alert Incident Creator"
description: "When a Datadog alert fires for a booking service, creates a PagerDuty incident and posts context to the Slack on-call channel."
tags:
- observability
- datadog
- pagerduty
- slack
- incident-management
capability:
exposes:
- type: mcp
namespace: incident-response
port: 8080
tools:
- name: create-incident-from-alert
description: "Create a PagerDuty incident from a Datadog alert and notify Slack."
inputParameters:
- name: alert_id
in: body
type: string
description: "Datadog alert identifier."
- name: service_name
in: body
type: string
description: "Affected service name."
steps:
- name: get-alert
type: call
call: "datadog.get-event"
with:
event_id: "{{alert_id}}"
- name: create-incident
type: call
call: "pagerduty.create-incident"
with:
service_id: "{{service_name}}"
title: "{{get-alert.title}}"
body: "{{get-alert.text}}"
urgency: "high"
- name: notify-oncall
type: call
call: "slack.post-message"
with:
channel: "#oncall-booking"
text: "PagerDuty incident {{create-incident.incident_number}} created from Datadog alert: {{get-alert.title}}. Service: {{service_name}}."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
resources:
- name: events
path: "/events/{{event_id}}"
inputParameters:
- name: event_id
in: path
operations:
- name: get-event
method: GET
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Aggregates historical booking data from Snowflake, runs ML forecasting models in Databricks, stores predictions, and refreshes the Tableau forecast dashboard.
naftiko: "0.5"
info:
label: "Demand Forecasting Pipeline"
description: "Aggregates historical booking data from Snowflake, runs ML forecasting models in Databricks, stores predictions, and refreshes the Tableau forecast dashboard."
tags:
- analytics
- snowflake
- databricks
- tableau
capability:
exposes:
- type: mcp
namespace: demand-forecast
port: 8080
tools:
- name: generate-forecast
description: "Generate demand forecasts for a destination market."
inputParameters:
- name: market_code
in: body
type: string
description: "Destination market code."
- name: horizon_days
in: body
type: integer
description: "Forecast horizon in days."
steps:
- name: extract-data
type: call
call: "snowflake.execute-statement"
with:
statement: "CALL ANALYTICS.EXTRACT_DEMAND_DATA('{{market_code}}')"
- name: run-model
type: call
call: "databricks.submit-job"
with:
job_name: "demand-forecast"
parameters: "{{market_code}},{{horizon_days}}"
- name: store-predictions
type: call
call: "snowflake.execute-statement"
with:
statement: "CALL ANALYTICS.STORE_FORECAST('{{market_code}}', '{{run-model.run_id}}')"
- name: refresh-dashboard
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "demand-forecast"
consumes:
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: databricks
baseUri: "https://adb-booking.azuredatabricks.net/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: tableau
baseUri: "https://tableau.bookingholdings.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/default/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Pulls destination demand data from Snowflake, creates marketing campaigns in Google Ads, tracks performance in Google Analytics, and reports via Tableau.
naftiko: "0.5"
info:
label: "Destination Marketing Campaign Pipeline"
description: "Pulls destination demand data from Snowflake, creates marketing campaigns in Google Ads, tracks performance in Google Analytics, and reports via Tableau."
tags:
- marketing
- snowflake
- google-analytics
- tableau
capability:
exposes:
- type: mcp
namespace: destination-marketing
port: 8080
tools:
- name: launch-destination-campaign
description: "Launch a destination marketing campaign with analytics tracking."
inputParameters:
- name: destination
in: body
type: string
description: "Destination city."
- name: budget_usd
in: body
type: number
description: "Campaign budget in USD."
steps:
- name: get-demand-data
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT * FROM MARKETING.DESTINATION_DEMAND WHERE city = '{{destination}}'"
- name: track-campaign
type: call
call: "google-analytics.send-event"
with:
event_name: "campaign_launched"
destination: "{{destination}}"
budget: "{{budget_usd}}"
- name: refresh-report
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "marketing-campaigns"
consumes:
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: google-analytics
baseUri: "https://www.google-analytics.com"
authentication:
type: apiKey
name: "measurement_id"
in: query
value: "$secrets.ga_measurement_id"
resources:
- name: events
path: "/mp/collect"
operations:
- name: send-event
method: POST
- type: http
namespace: tableau
baseUri: "https://tableau.bookingholdings.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/default/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Adjusts property pricing on Booking.com based on occupancy data, competitor rates from Kayak, and demand signals, then logs the change in Datadog.
naftiko: "0.5"
info:
label: "Dynamic Pricing Adjustment"
description: "Adjusts property pricing on Booking.com based on occupancy data, competitor rates from Kayak, and demand signals, then logs the change in Datadog."
tags:
- pricing
- revenue-management
- booking-com
- kayak
- datadog
capability:
exposes:
- type: mcp
namespace: dynamic-pricing
port: 8080
tools:
- name: adjust-pricing
description: "Adjust property pricing based on occupancy, competitor rates, and demand, logging the change in Datadog."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: date
in: body
type: string
description: "Target date YYYY-MM-DD."
- name: occupancy_pct
in: body
type: number
description: "Current occupancy percentage."
steps:
- name: get-competitor-rate
type: call
call: "kayak-api.get-hotel-rate"
with:
property_id: "{{property_id}}"
checkin: "{{date}}"
checkout: "{{date}}"
- name: update-rate
type: call
call: "booking-connectivity.update-rate"
with:
property_id: "{{property_id}}"
date: "{{date}}"
occupancy_pct: "{{occupancy_pct}}"
competitor_rate: "{{get-competitor-rate.rate}}"
- name: log-change
type: call
call: "datadog.post-event"
with:
title: "Rate adjusted for {{property_id}} on {{date}}"
text: "Occupancy: {{occupancy_pct}}%. Competitor rate: {{get-competitor-rate.rate}}. New rate: {{update-rate.new_rate}}."
tags: "service:dynamic-pricing,property:{{property_id}}"
consumes:
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: hotel-rates
path: "/hotels/{{property_id}}/rates"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
operations:
- name: get-hotel-rate
method: GET
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: rates
path: "/properties/{{property_id}}/rates"
inputParameters:
- name: property_id
in: path
operations:
- name: update-rate
method: PUT
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
resources:
- name: events
path: "/events"
operations:
- name: post-event
method: POST
Searches the property index in Elasticsearch and enriches results with availability data from the Booking.com connectivity API.
naftiko: "0.5"
info:
label: "Elasticsearch Property Search"
description: "Searches the property index in Elasticsearch and enriches results with availability data from the Booking.com connectivity API."
tags:
- search
- elasticsearch
- booking-com
- property-management
capability:
exposes:
- type: mcp
namespace: property-search
port: 8080
tools:
- name: search-properties
description: "Search properties in Elasticsearch and enrich with live availability."
inputParameters:
- name: query
in: body
type: string
description: "Search query string."
- name: location
in: body
type: string
description: "Location filter (city or region)."
- name: checkin
in: body
type: string
description: "Check-in date for availability enrichment YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date for availability enrichment YYYY-MM-DD."
steps:
- name: search
type: call
call: "elasticsearch.search-properties"
with:
q: "{{query}}"
location: "{{location}}"
size: 10
- name: check-availability
type: call
call: "booking-connectivity.get-availability"
with:
property_id: "{{search.hits[0].property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
guests: 2
consumes:
- type: http
namespace: elasticsearch
baseUri: "https://search.booking.internal:9200"
authentication:
type: basic
username: "$secrets.elasticsearch_user"
password: "$secrets.elasticsearch_password"
resources:
- name: properties
path: "/properties/_search"
inputParameters:
- name: q
in: query
- name: location
in: query
- name: size
in: query
operations:
- name: search-properties
method: GET
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
- name: guests
in: query
operations:
- name: get-availability
method: GET
When a new hire is created in Workday, provisions accounts, creates a Jira onboarding task, sends IT setup instructions via SendGrid, and notifies the manager via Slack.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, provisions accounts, creates a Jira onboarding task, sends IT setup instructions via SendGrid, and notifies the manager via Slack."
tags:
- hr
- workday
- jira
- sendgrid
- slack
capability:
exposes:
- type: mcp
namespace: employee-onboarding
port: 8080
tools:
- name: onboard-employee
description: "Orchestrate new employee onboarding across systems."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
- name: manager_email
in: body
type: string
description: "Manager email."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "IT"
summary: "Onboarding: {{get-worker.displayName}}"
description: "New hire: {{get-worker.displayName}}. Department: {{get-worker.department}}. Start: {{get-worker.startDate}}."
issue_type: "Task"
- name: send-instructions
type: call
call: "sendgrid.send-email"
with:
to: "{{get-worker.email}}"
subject: "Welcome to Booking Holdings!"
body: "Welcome {{get-worker.displayName}}! Your onboarding task: {{create-task.key}}. Start date: {{get-worker.startDate}}."
- name: notify-manager
type: call
call: "slack.post-message"
with:
channel: "#new-hires"
text: "New hire: {{get-worker.displayName}} starting {{get-worker.startDate}} in {{get-worker.department}}. Jira: {{create-task.key}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Searches flights on Kayak, creates a reservation hold, processes payment via Stripe, and sends the e-ticket confirmation via SendGrid.
naftiko: "0.5"
info:
label: "Flight Booking End-to-End"
description: "Searches flights on Kayak, creates a reservation hold, processes payment via Stripe, and sends the e-ticket confirmation via SendGrid."
tags:
- flights
- kayak
- stripe
- sendgrid
- booking-flow
capability:
exposes:
- type: mcp
namespace: flight-booking
port: 8080
tools:
- name: book-flight
description: "Search, reserve, pay, and confirm a flight booking end-to-end."
inputParameters:
- name: origin
in: body
type: string
description: "Origin IATA airport code."
- name: destination
in: body
type: string
description: "Destination IATA airport code."
- name: depart_date
in: body
type: string
description: "Departure date YYYY-MM-DD."
- name: passenger_email
in: body
type: string
description: "Passenger email."
- name: payment_method_id
in: body
type: string
description: "Stripe payment method ID."
steps:
- name: search
type: call
call: "kayak-api.search-flights"
with:
origin: "{{origin}}"
destination: "{{destination}}"
depart_date: "{{depart_date}}"
- name: hold-seat
type: call
call: "kayak-api.create-hold"
with:
itinerary_id: "{{search.itineraries[0].id}}"
passenger_email: "{{passenger_email}}"
- name: charge-payment
type: call
call: "stripe.create-payment-intent"
with:
amount: "{{hold-seat.price_cents}}"
currency: "{{hold-seat.currency}}"
payment_method: "{{payment_method_id}}"
confirm: true
- name: send-eticket
type: call
call: "sendgrid.send-email"
with:
to: "{{passenger_email}}"
subject: "E-Ticket Confirmation: {{origin}} to {{destination}} on {{depart_date}}"
body: "Your flight is booked! Confirmation: {{hold-seat.confirmation_code}}. {{origin}} to {{destination}}, departing {{depart_date}}. Total: {{hold-seat.price}} {{hold-seat.currency}}."
consumes:
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: flights
path: "/flights/search"
inputParameters:
- name: origin
in: query
- name: destination
in: query
- name: depart_date
in: query
operations:
- name: search-flights
method: GET
- name: holds
path: "/flights/hold"
operations:
- name: create-hold
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents"
operations:
- name: create-payment-intent
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
On new reservation creation, scores the booking through Sift fraud detection, checks the payment via Stripe, and flags suspicious reservations in Jira for the fraud team.
naftiko: "0.5"
info:
label: "Fraud Detection Reservation Screener"
description: "On new reservation creation, scores the booking through Sift fraud detection, checks the payment via Stripe, and flags suspicious reservations in Jira for the fraud team."
tags:
- fraud
- sift
- stripe
- jira
- booking-com
capability:
exposes:
- type: mcp
namespace: fraud-detection
port: 8080
tools:
- name: screen-reservation
description: "Screen a new reservation for fraud by scoring through Sift, verifying payment in Stripe, and creating a Jira issue if flagged."
inputParameters:
- name: reservation_id
in: body
type: string
description: "The reservation identifier."
- name: guest_email
in: body
type: string
description: "The guest email address."
- name: payment_intent_id
in: body
type: string
description: "The Stripe payment intent ID."
steps:
- name: score-booking
type: call
call: "sift.score-event"
with:
user_id: "{{guest_email}}"
event_type: "create_order"
order_id: "{{reservation_id}}"
- name: verify-payment
type: call
call: "stripe.get-payment-intent"
with:
payment_intent_id: "{{payment_intent_id}}"
- name: flag-fraud
type: call
call: "jira.create-issue"
with:
project: "FRAUD"
summary: "High-risk reservation {{reservation_id}} - Sift score {{score-booking.score}}"
description: "Reservation {{reservation_id}} flagged. Sift score: {{score-booking.score}}. Payment status: {{verify-payment.status}}. Guest: {{guest_email}}."
issue_type: "Bug"
priority: "High"
consumes:
- type: http
namespace: sift
baseUri: "https://api.sift.com/v205"
authentication:
type: apiKey
name: "Api-Key"
in: header
value: "$secrets.sift_api_key"
resources:
- name: events
path: "/events"
operations:
- name: score-event
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents/{{payment_intent_id}}"
inputParameters:
- name: payment_intent_id
in: path
operations:
- name: get-payment-intent
method: GET
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Checks the latest deployment status for a Booking Holdings GitHub repository.
naftiko: "0.5"
info:
label: "GitHub Deployment Status"
description: "Checks the latest deployment status for a Booking Holdings GitHub repository."
tags:
- devops
- github
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: get-deployment-status
description: "Get latest deployment status for a GitHub repository."
inputParameters:
- name: repo
in: body
type: string
description: "Repository name in org/repo format."
call: "github-api.list-deployments"
with:
repo: "{{repo}}"
consumes:
- type: http
namespace: github-api
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: deployments
path: "/repos/{{repo}}/deployments"
inputParameters:
- name: repo
in: path
operations:
- name: list-deployments
method: GET
Geocodes an address to latitude and longitude coordinates using the Google Maps Geocoding API for property location validation.
naftiko: "0.5"
info:
label: "Google Maps Geocode Lookup"
description: "Geocodes an address to latitude and longitude coordinates using the Google Maps Geocoding API for property location validation."
tags:
- geolocation
- google-maps
- property-management
capability:
exposes:
- type: mcp
namespace: geolocation
port: 8080
tools:
- name: geocode-address
description: "Geocode an address to lat/lng using Google Maps."
inputParameters:
- name: address
in: body
type: string
description: "Full street address to geocode."
call: "google-maps.geocode"
with:
address: "{{address}}"
consumes:
- type: http
namespace: google-maps
baseUri: "https://maps.googleapis.com/maps/api"
authentication:
type: apiKey
name: "key"
in: query
value: "$secrets.google_maps_api_key"
resources:
- name: geocode
path: "/geocode/json"
inputParameters:
- name: address
in: query
operations:
- name: geocode
method: GET
Processes a group booking request by checking bulk availability, creating a Salesforce opportunity for the group deal, and notifying the sales team in Slack.
naftiko: "0.5"
info:
label: "Group Booking Request Processor"
description: "Processes a group booking request by checking bulk availability, creating a Salesforce opportunity for the group deal, and notifying the sales team in Slack."
tags:
- reservations
- groups
- booking-com
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: group-bookings
port: 8080
tools:
- name: process-group-request
description: "Handle a group booking inquiry: check availability, create CRM opportunity, and alert sales."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date YYYY-MM-DD."
- name: rooms_needed
in: body
type: integer
description: "Number of rooms requested."
- name: contact_name
in: body
type: string
description: "Group contact name."
- name: contact_email
in: body
type: string
description: "Group contact email."
steps:
- name: check-availability
type: call
call: "booking-connectivity.get-availability"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
guests: "{{rooms_needed}}"
- name: create-opportunity
type: call
call: "salesforce.create-opportunity"
with:
name: "Group Booking: {{contact_name}} - {{property_id}}"
stage: "Qualification"
close_date: "{{checkin}}"
amount: "{{check-availability.estimated_total}}"
description: "{{rooms_needed}} rooms at property {{property_id}} from {{checkin}} to {{checkout}}. Contact: {{contact_name}} ({{contact_email}})."
- name: alert-sales
type: call
call: "slack.post-message"
with:
channel: "#group-sales"
text: "New group request: {{rooms_needed}} rooms at {{property_id}} for {{checkin}}-{{checkout}}. Contact: {{contact_name}}. Estimated value: {{check-availability.estimated_total}}. Opportunity: {{create-opportunity.id}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
- name: guests
in: query
operations:
- name: get-availability
method: GET
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity"
operations:
- name: create-opportunity
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Receives a guest complaint from Zendesk, classifies urgency via OpenAI, routes to the appropriate team in Zendesk, and logs in Snowflake for analytics.
naftiko: "0.5"
info:
label: "Guest Complaint AI Triage"
description: "Receives a guest complaint from Zendesk, classifies urgency via OpenAI, routes to the appropriate team in Zendesk, and logs in Snowflake for analytics."
tags:
- support
- zendesk
- openai
- snowflake
capability:
exposes:
- type: mcp
namespace: complaint-triage
port: 8080
tools:
- name: triage-complaint
description: "AI-triage a guest complaint with routing and analytics."
inputParameters:
- name: ticket_id
in: body
type: string
description: "Zendesk ticket ID."
steps:
- name: get-ticket
type: call
call: "zendesk.get-ticket"
with:
ticket_id: "{{ticket_id}}"
- name: classify
type: call
call: "openai.classify"
with:
text: "{{get-ticket.description}}"
categories: "billing,property_issue,cancellation,safety,other"
- name: route-ticket
type: call
call: "zendesk.update-ticket"
with:
ticket_id: "{{ticket_id}}"
group: "{{classify.category}}"
priority: "{{classify.urgency}}"
- name: log-analytics
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO SUPPORT.TRIAGE_LOG VALUES ('{{ticket_id}}', '{{classify.category}}', '{{classify.urgency}}')"
consumes:
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: get-ticket
method: GET
- name: update-ticket
method: PUT
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: classify
method: POST
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
When a negative review is posted, creates a Zendesk ticket, looks up the reservation, drafts a response, and escalates to the partner via Salesforce case.
naftiko: "0.5"
info:
label: "Guest Complaint Resolution Pipeline"
description: "When a negative review is posted, creates a Zendesk ticket, looks up the reservation, drafts a response, and escalates to the partner via Salesforce case."
tags:
- guest-experience
- reviews
- zendesk
- booking-com
- salesforce
capability:
exposes:
- type: mcp
namespace: complaint-resolution
port: 8080
tools:
- name: handle-negative-review
description: "Process a negative guest review by creating tickets, retrieving reservation context, and escalating to the partner."
inputParameters:
- name: review_id
in: body
type: string
description: "Booking.com review identifier."
- name: property_id
in: body
type: string
description: "Property identifier."
- name: reservation_id
in: body
type: string
description: "Associated reservation ID."
steps:
- name: get-review
type: call
call: "booking-connectivity.get-review"
with:
property_id: "{{property_id}}"
review_id: "{{review_id}}"
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: create-ticket
type: call
call: "zendesk.create-ticket"
with:
subject: "Negative review from {{get-reservation.guest_name}} at {{get-reservation.property_name}}"
description: "Review score: {{get-review.score}}/10. Text: {{get-review.text}}. Reservation: {{reservation_id}}."
requester_email: "{{get-reservation.guest_email}}"
priority: "high"
- name: create-partner-case
type: call
call: "salesforce.create-case"
with:
subject: "Guest complaint: {{get-reservation.property_name}} - Review {{review_id}}"
description: "Guest {{get-reservation.guest_name}} left a {{get-review.score}}/10 review. Details: {{get-review.text}}."
property_id: "{{property_id}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reviews
path: "/properties/{{property_id}}/reviews/{{review_id}}"
inputParameters:
- name: property_id
in: path
- name: review_id
in: path
operations:
- name: get-review
method: GET
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets"
operations:
- name: create-ticket
method: POST
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
Fetches hotel, flight, and car rental bookings for a guest, assembles a complete itinerary, generates a PDF, and sends via SendGrid.
naftiko: "0.5"
info:
label: "Guest Itinerary Builder Pipeline"
description: "Fetches hotel, flight, and car rental bookings for a guest, assembles a complete itinerary, generates a PDF, and sends via SendGrid."
tags:
- guest-experience
- booking-com
- kayak
- rentalcars
- sendgrid
capability:
exposes:
- type: mcp
namespace: itinerary-builder
port: 8080
tools:
- name: build-itinerary
description: "Assemble and distribute a complete guest travel itinerary."
inputParameters:
- name: guest_email
in: body
type: string
description: "Guest email."
- name: trip_id
in: body
type: string
description: "Trip identifier."
steps:
- name: get-hotel
type: call
call: "booking-api.get-guest-reservations"
with:
guest_email: "{{guest_email}}"
trip_id: "{{trip_id}}"
- name: get-flights
type: call
call: "kayak-api.get-trip-flights"
with:
trip_id: "{{trip_id}}"
- name: get-cars
type: call
call: "rentalcars.get-trip-bookings"
with:
trip_id: "{{trip_id}}"
- name: send-itinerary
type: call
call: "sendgrid.send-email"
with:
to: "{{guest_email}}"
subject: "Your Complete Travel Itinerary"
body: "Hotel: {{get-hotel.property_name}} ({{get-hotel.checkin}} - {{get-hotel.checkout}}). Flights: {{get-flights.count}} segments. Car: {{get-cars.vehicle_name}}."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations"
inputParameters:
- name: guest_email
in: query
- name: trip_id
in: query
operations:
- name: get-guest-reservations
method: GET
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: trips
path: "/trips/{{trip_id}}/flights"
inputParameters:
- name: trip_id
in: path
operations:
- name: get-trip-flights
method: GET
- type: http
namespace: rentalcars
baseUri: "https://api.rentalcars.com/v1"
authentication:
type: bearer
token: "$secrets.rentalcars_api_token"
resources:
- name: bookings
path: "/trips/{{trip_id}}/bookings"
inputParameters:
- name: trip_id
in: path
operations:
- name: get-trip-bookings
method: GET
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Enrolls a guest in the loyalty program, syncs profile to Salesforce, sends a welcome email via SendGrid, and tracks in Segment.
naftiko: "0.5"
info:
label: "Guest Loyalty Enrollment Workflow"
description: "Enrolls a guest in the loyalty program, syncs profile to Salesforce, sends a welcome email via SendGrid, and tracks in Segment."
tags:
- loyalty
- salesforce
- sendgrid
- segment
capability:
exposes:
- type: mcp
namespace: loyalty-enrollment
port: 8080
tools:
- name: enroll-guest
description: "Enroll a guest in the loyalty program with CRM sync and notification."
inputParameters:
- name: guest_email
in: body
type: string
description: "Guest email."
- name: guest_name
in: body
type: string
description: "Guest full name."
steps:
- name: create-member
type: call
call: "loyalty.create-account"
with:
email: "{{guest_email}}"
name: "{{guest_name}}"
- name: sync-crm
type: call
call: "salesforce.create-contact"
with:
email: "{{guest_email}}"
name: "{{guest_name}}"
loyalty_id: "{{create-member.member_id}}"
- name: send-welcome
type: call
call: "sendgrid.send-email"
with:
to: "{{guest_email}}"
subject: "Welcome to our Loyalty Program!"
body: "Welcome {{guest_name}}! Your loyalty ID: {{create-member.member_id}}."
- name: track-event
type: call
call: "segment.track-event"
with:
user_id: "{{create-member.member_id}}"
event: "loyalty_enrolled"
consumes:
- type: http
namespace: loyalty
baseUri: "https://loyalty.bookingholdings.com/api/v1"
authentication:
type: bearer
token: "$secrets.loyalty_api_token"
resources:
- name: accounts
path: "/accounts"
operations:
- name: create-account
method: POST
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact"
operations:
- name: create-contact
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
- type: http
namespace: segment
baseUri: "https://api.segment.io/v1"
authentication:
type: bearer
token: "$secrets.segment_write_key"
resources:
- name: events
path: "/track"
operations:
- name: track-event
method: POST
Retrieves the loyalty points balance and tier status for a Booking.com Genius member and syncs the tier to Salesforce contact record.
naftiko: "0.5"
info:
label: "Guest Loyalty Points Check"
description: "Retrieves the loyalty points balance and tier status for a Booking.com Genius member and syncs the tier to Salesforce contact record."
tags:
- loyalty
- booking-com
- genius
- salesforce
capability:
exposes:
- type: mcp
namespace: loyalty
port: 8080
tools:
- name: get-genius-status
description: "Look up a guest's Genius loyalty tier and points balance and sync to Salesforce."
inputParameters:
- name: guest_id
in: body
type: string
description: "Booking.com guest identifier."
steps:
- name: get-member
type: call
call: "booking-loyalty.get-member"
with:
guest_id: "{{guest_id}}"
- name: sync-tier
type: call
call: "salesforce.update-contact"
with:
guest_id: "{{guest_id}}"
genius_tier: "{{get-member.tier}}"
genius_points: "{{get-member.points}}"
consumes:
- type: http
namespace: booking-loyalty
baseUri: "https://loyalty-api.booking.com/v1"
authentication:
type: bearer
token: "$secrets.booking_loyalty_token"
resources:
- name: members
path: "/members/{{guest_id}}"
inputParameters:
- name: guest_id
in: path
operations:
- name: get-member
method: GET
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact/{{guest_id}}"
inputParameters:
- name: guest_id
in: path
operations:
- name: update-contact
method: PATCH
Evaluates a guest's booking history, upgrades their loyalty tier in the CRM, sends a congratulatory email via SendGrid, and logs the event in Segment.
naftiko: "0.5"
info:
label: "Guest Loyalty Tier Upgrade Pipeline"
description: "Evaluates a guest's booking history, upgrades their loyalty tier in the CRM, sends a congratulatory email via SendGrid, and logs the event in Segment."
tags:
- loyalty
- booking-com
- sendgrid
- segment
capability:
exposes:
- type: mcp
namespace: loyalty
port: 8080
tools:
- name: process-tier-upgrade
description: "Evaluate and process a guest loyalty tier upgrade end-to-end."
inputParameters:
- name: guest_id
in: body
type: string
description: "Guest identifier."
steps:
- name: fetch-history
type: call
call: "booking-crm.get-booking-history"
with:
guest_id: "{{guest_id}}"
- name: upgrade-tier
type: call
call: "booking-crm.update-loyalty-tier"
with:
guest_id: "{{guest_id}}"
new_tier: "{{fetch-history.calculated_tier}}"
- name: send-notification
type: call
call: "sendgrid.send-email"
with:
to: "{{fetch-history.email}}"
subject: "Congratulations! You've reached {{upgrade-tier.new_tier}} status"
body: "Dear {{fetch-history.first_name}}, your loyalty tier has been upgraded to {{upgrade-tier.new_tier}} based on {{fetch-history.total_bookings}} bookings."
- name: log-event
type: call
call: "segment.track-event"
with:
user_id: "{{guest_id}}"
event: "loyalty_tier_upgrade"
properties_tier: "{{upgrade-tier.new_tier}}"
consumes:
- type: http
namespace: booking-crm
baseUri: "https://crm-api.booking.com/v2"
authentication:
type: bearer
token: "$secrets.booking_crm_token"
resources:
- name: booking-history
path: "/guests/{{guest_id}}/bookings"
inputParameters:
- name: guest_id
in: path
operations:
- name: get-booking-history
method: GET
- name: loyalty
path: "/guests/{{guest_id}}/loyalty"
inputParameters:
- name: guest_id
in: path
operations:
- name: update-loyalty-tier
method: PUT
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
- type: http
namespace: segment
baseUri: "https://api.segment.io/v1"
authentication:
type: bearer
token: "$secrets.segment_write_key"
resources:
- name: track
path: "/track"
operations:
- name: track-event
method: POST
Handles a guest no-show by marking the reservation, charging the no-show fee via Stripe, notifying the property via SendGrid, and creating a Zendesk ticket.
naftiko: "0.5"
info:
label: "Guest No-Show Handler"
description: "Handles a guest no-show by marking the reservation, charging the no-show fee via Stripe, notifying the property via SendGrid, and creating a Zendesk ticket."
tags:
- reservations
- booking-com
- stripe
- sendgrid
- zendesk
capability:
exposes:
- type: mcp
namespace: reservations
port: 8080
tools:
- name: process-no-show
description: "Process a guest no-show: mark reservation, charge fee, notify property, create ticket."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
- name: payment_intent_id
in: body
type: string
description: "Stripe payment intent."
steps:
- name: mark-no-show
type: call
call: "booking-connectivity.mark-no-show"
with:
reservation_id: "{{reservation_id}}"
- name: charge-fee
type: call
call: "stripe.create-charge"
with:
payment_intent: "{{payment_intent_id}}"
amount: "{{mark-no-show.no_show_fee_cents}}"
currency: "{{mark-no-show.currency}}"
- name: notify-property
type: call
call: "sendgrid.send-email"
with:
to: "{{mark-no-show.property_email}}"
subject: "No-Show Confirmed - Reservation {{reservation_id}}"
body: "Guest did not arrive for reservation {{reservation_id}}. No-show fee of {{charge-fee.amount}} {{charge-fee.currency}} has been charged."
- name: create-ticket
type: call
call: "zendesk.create-ticket"
with:
subject: "No-show processed for {{reservation_id}}"
description: "No-show fee charged: {{charge-fee.amount}} {{charge-fee.currency}}. Charge ID: {{charge-fee.id}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: no-show
path: "/reservations/{{reservation_id}}/no-show"
inputParameters:
- name: reservation_id
in: path
operations:
- name: mark-no-show
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: charges
path: "/charges"
operations:
- name: create-charge
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets"
operations:
- name: create-ticket
method: POST
Retrieves a guest profile from the Booking.com CRM by guest ID, returning contact details, preferences, and loyalty tier.
naftiko: "0.5"
info:
label: "Guest Profile Lookup"
description: "Retrieves a guest profile from the Booking.com CRM by guest ID, returning contact details, preferences, and loyalty tier."
tags:
- guest-management
- booking-com
capability:
exposes:
- type: mcp
namespace: guest-management
port: 8080
tools:
- name: get-guest-profile
description: "Retrieve a guest profile by guest ID including contact info, preferences, and loyalty tier."
inputParameters:
- name: guest_id
in: body
type: string
description: "The guest identifier."
call: "booking-crm.get-guest"
with:
guest_id: "{{guest_id}}"
consumes:
- type: http
namespace: booking-crm
baseUri: "https://crm-api.booking.com/v2"
authentication:
type: bearer
token: "$secrets.booking_crm_token"
resources:
- name: guests
path: "/guests/{{guest_id}}"
inputParameters:
- name: guest_id
in: path
operations:
- name: get-guest
method: GET
Processes a booking refund by canceling the reservation, issuing a Stripe refund, logging in Snowflake, and notifying the guest via SendGrid.
naftiko: "0.5"
info:
label: "Guest Refund Processing Workflow"
description: "Processes a booking refund by canceling the reservation, issuing a Stripe refund, logging in Snowflake, and notifying the guest via SendGrid."
tags:
- refunds
- booking-com
- stripe
- snowflake
- sendgrid
capability:
exposes:
- type: mcp
namespace: refund-processing
port: 8080
tools:
- name: process-refund
description: "Cancel a booking and process the refund with notification."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation ID."
- name: reason
in: body
type: string
description: "Cancellation reason."
- name: guest_email
in: body
type: string
description: "Guest email."
steps:
- name: cancel-reservation
type: call
call: "booking-api.cancel-reservation"
with:
reservation_id: "{{reservation_id}}"
reason: "{{reason}}"
- name: issue-refund
type: call
call: "stripe.create-refund"
with:
payment_intent: "{{cancel-reservation.payment_intent_id}}"
amount: "{{cancel-reservation.refund_amount_cents}}"
- name: log-refund
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO FINANCE.REFUNDS VALUES ('{{reservation_id}}', {{cancel-reservation.refund_amount_cents}}, '{{reason}}')"
- name: notify-guest
type: call
call: "sendgrid.send-email"
with:
to: "{{guest_email}}"
subject: "Refund Processed — Reservation {{reservation_id}}"
body: "Your refund of ${{cancel-reservation.refund_amount}} has been processed. Reason: {{reason}}. Refund ID: {{issue-refund.id}}."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}/cancel"
inputParameters:
- name: reservation_id
in: path
operations:
- name: cancel-reservation
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: refunds
path: "/refunds"
operations:
- name: create-refund
method: POST
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Retrieves guest reviews for a Booking.com property by property ID and returns aggregated scores and recent review text.
naftiko: "0.5"
info:
label: "Guest Review Fetch"
description: "Retrieves guest reviews for a Booking.com property by property ID and returns aggregated scores and recent review text."
tags:
- reviews
- booking-com
- guest-experience
capability:
exposes:
- type: mcp
namespace: reviews
port: 8080
tools:
- name: get-property-reviews
description: "Fetch guest reviews and aggregate scores for a Booking.com property."
inputParameters:
- name: property_id
in: body
type: string
description: "The Booking.com property identifier."
- name: limit
in: body
type: integer
description: "Maximum number of reviews to return."
call: "booking-connectivity.get-reviews"
with:
property_id: "{{property_id}}"
limit: "{{limit}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reviews
path: "/properties/{{property_id}}/reviews"
inputParameters:
- name: property_id
in: path
- name: limit
in: query
operations:
- name: get-reviews
method: GET
Searches properties on Booking.com, creates a reservation, processes payment via Stripe, and sends confirmation via SendGrid.
naftiko: "0.5"
info:
label: "Hotel Booking End-to-End"
description: "Searches properties on Booking.com, creates a reservation, processes payment via Stripe, and sends confirmation via SendGrid."
tags:
- booking-flow
- booking-com
- stripe
- sendgrid
capability:
exposes:
- type: mcp
namespace: hotel-booking
port: 8080
tools:
- name: book-hotel
description: "Search, reserve, pay, and confirm a hotel booking end-to-end."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property ID."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date YYYY-MM-DD."
- name: guest_email
in: body
type: string
description: "Guest email."
- name: payment_method_id
in: body
type: string
description: "Stripe payment method ID."
steps:
- name: check-availability
type: call
call: "booking-api.get-availability"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
- name: create-reservation
type: call
call: "booking-api.create-reservation"
with:
property_id: "{{property_id}}"
room_id: "{{check-availability.rooms[0].id}}"
guest_email: "{{guest_email}}"
- name: charge-payment
type: call
call: "stripe.create-payment-intent"
with:
amount: "{{check-availability.rooms[0].price_cents}}"
currency: "{{check-availability.currency}}"
payment_method: "{{payment_method_id}}"
confirm: true
- name: send-confirmation
type: call
call: "sendgrid.send-email"
with:
to: "{{guest_email}}"
subject: "Booking Confirmed — {{property_id}}"
body: "Your stay is confirmed! Check-in: {{checkin}}. Confirmation: {{create-reservation.confirmation_id}}."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
operations:
- name: get-availability
method: GET
- name: reservations
path: "/reservations"
operations:
- name: create-reservation
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents"
operations:
- name: create-payment-intent
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Synchronizes room inventory from the Booking.com channel manager to Priceline and Agoda, ensuring allotment consistency across all distribution channels.
naftiko: "0.5"
info:
label: "Inventory Sync Across Platforms"
description: "Synchronizes room inventory from the Booking.com channel manager to Priceline and Agoda, ensuring allotment consistency across all distribution channels."
tags:
- inventory
- channel-management
- booking-com
- priceline
- agoda
capability:
exposes:
- type: mcp
namespace: inventory-sync
port: 8080
tools:
- name: sync-inventory
description: "Sync room inventory from Booking.com channel manager to Priceline and Agoda."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: priceline_hotel_id
in: body
type: string
description: "Priceline hotel identifier."
- name: agoda_property_id
in: body
type: string
description: "Agoda property identifier."
- name: date_from
in: body
type: string
description: "Start date YYYY-MM-DD."
- name: date_to
in: body
type: string
description: "End date YYYY-MM-DD."
steps:
- name: get-inventory
type: call
call: "booking-connectivity.get-inventory"
with:
property_id: "{{property_id}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
- name: push-priceline
type: call
call: "priceline-partner.update-inventory"
with:
hotel_id: "{{priceline_hotel_id}}"
inventory: "{{get-inventory.rooms}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
- name: push-agoda
type: call
call: "agoda-connectivity.update-inventory"
with:
property_id: "{{agoda_property_id}}"
inventory: "{{get-inventory.rooms}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: inventory
path: "/properties/{{property_id}}/inventory"
inputParameters:
- name: property_id
in: path
- name: date_from
in: query
- name: date_to
in: query
operations:
- name: get-inventory
method: GET
- type: http
namespace: priceline-partner
baseUri: "https://api.priceline.com/partner/v2"
authentication:
type: apiKey
name: "X-Api-Key"
in: header
value: "$secrets.priceline_api_key"
resources:
- name: inventory
path: "/hotels/{{hotel_id}}/inventory"
inputParameters:
- name: hotel_id
in: path
operations:
- name: update-inventory
method: PUT
- type: http
namespace: agoda-connectivity
baseUri: "https://supply-api.agoda.com/v2"
authentication:
type: bearer
token: "$secrets.agoda_connectivity_token"
resources:
- name: inventory
path: "/properties/{{property_id}}/inventory"
inputParameters:
- name: property_id
in: path
operations:
- name: update-inventory
method: PUT
Creates a bug report in Jira for the Booking Holdings engineering team.
naftiko: "0.5"
info:
label: "Jira Bug Report Creator"
description: "Creates a bug report in Jira for the Booking Holdings engineering team."
tags:
- engineering
- jira
- bug-tracking
capability:
exposes:
- type: mcp
namespace: bug-tracking
port: 8080
tools:
- name: create-bug-report
description: "Create a Jira bug report for the engineering team."
inputParameters:
- name: project
in: body
type: string
description: "Jira project key."
- name: summary
in: body
type: string
description: "Bug summary."
- name: description
in: body
type: string
description: "Detailed bug description."
- name: priority
in: body
type: string
description: "Priority: Highest, High, Medium, Low, Lowest."
call: "jira.create-issue"
with:
project: "{{project}}"
summary: "{{summary}}"
description: "{{description}}"
issue_type: "Bug"
priority: "{{priority}}"
consumes:
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Searches Kayak flight inventory for available itineraries by origin, destination, and travel dates.
naftiko: "0.5"
info:
label: "Kayak Flight Search"
description: "Searches Kayak flight inventory for available itineraries by origin, destination, and travel dates."
tags:
- flights
- kayak
- search
capability:
exposes:
- type: mcp
namespace: flights
port: 8080
tools:
- name: search-flights
description: "Search available flights on Kayak by origin, destination, and travel dates."
inputParameters:
- name: origin
in: body
type: string
description: "IATA airport code for origin."
- name: destination
in: body
type: string
description: "IATA airport code for destination."
- name: depart_date
in: body
type: string
description: "Departure date YYYY-MM-DD."
- name: return_date
in: body
type: string
description: "Return date YYYY-MM-DD. Omit for one-way."
call: "kayak-api.search-flights"
with:
origin: "{{origin}}"
destination: "{{destination}}"
depart_date: "{{depart_date}}"
return_date: "{{return_date}}"
consumes:
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: flights
path: "/flights/search"
inputParameters:
- name: origin
in: query
- name: destination
in: query
- name: depart_date
in: query
- name: return_date
in: query
operations:
- name: search-flights
method: GET
Searches Kayak for available hotels by destination, dates, and guest count, returning matching properties with prices and ratings.
naftiko: "0.5"
info:
label: "Kayak Hotel Search"
description: "Searches Kayak for available hotels by destination, dates, and guest count, returning matching properties with prices and ratings."
tags:
- search
- kayak
capability:
exposes:
- type: mcp
namespace: kayak-hotels
port: 8080
tools:
- name: search-hotels
description: "Search Kayak for hotel availability."
inputParameters:
- name: destination
in: body
type: string
description: "Destination city or airport code."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date YYYY-MM-DD."
call: "kayak-hotels.search"
with:
destination: "{{destination}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
consumes:
- type: http
namespace: kayak-hotels
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: hotels
path: "/hotels/search"
inputParameters:
- name: destination
in: query
- name: checkin
in: query
- name: checkout
in: query
operations:
- name: search
method: GET
Checks the status of an active Kayak price alert for a given alert ID, returning current price and threshold.
naftiko: "0.5"
info:
label: "Kayak Price Alert Status"
description: "Checks the status of an active Kayak price alert for a given alert ID, returning current price and threshold."
tags:
- pricing
- kayak
capability:
exposes:
- type: mcp
namespace: pricing
port: 8080
tools:
- name: get-price-alert
description: "Check the status of a Kayak price alert."
inputParameters:
- name: alert_id
in: body
type: string
description: "Kayak price alert identifier."
call: "kayak-api.get-alert"
with:
alert_id: "{{alert_id}}"
consumes:
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: alerts
path: "/price-alerts/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-alert
method: GET
Fetches rates from Booking.com, Agoda, and Priceline for the same property, stores comparison in Snowflake, and alerts revenue management via Slack.
naftiko: "0.5"
info:
label: "Multi-Brand Price Comparison Pipeline"
description: "Fetches rates from Booking.com, Agoda, and Priceline for the same property, stores comparison in Snowflake, and alerts revenue management via Slack."
tags:
- pricing
- booking-com
- agoda
- priceline
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: price-comparison
port: 8080
tools:
- name: compare-prices
description: "Compare rates across Booking.com, Agoda, and Priceline."
inputParameters:
- name: property_id
in: body
type: string
description: "Property ID."
- name: checkin
in: body
type: string
description: "Check-in date."
steps:
- name: get-booking-rate
type: call
call: "booking-api.get-rate"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
- name: get-agoda-rate
type: call
call: "agoda-api.get-rate"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
- name: store-comparison
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO PRICING.COMPARISONS VALUES ('{{property_id}}', '{{checkin}}', {{get-booking-rate.price}}, {{get-agoda-rate.price}})"
- name: alert-revenue
type: call
call: "slack.post-message"
with:
channel: "#revenue-management"
text: "Rate comparison for {{property_id}} on {{checkin}}: Booking: ${{get-booking-rate.price}}. Agoda: ${{get-agoda-rate.price}}."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: rates
path: "/properties/{{property_id}}/rates"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
operations:
- name: get-rate
method: GET
- type: http
namespace: agoda-api
baseUri: "https://api.agoda.com/v1"
authentication:
type: bearer
token: "$secrets.agoda_api_token"
resources:
- name: rates
path: "/properties/{{property_id}}/rates"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
operations:
- name: get-rate
method: GET
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches a property rate from Booking.com and converts it to the guest's preferred currency using Open Exchange Rates, then returns the localized price.
naftiko: "0.5"
info:
label: "Multi-Currency Booking Price Calculator"
description: "Fetches a property rate from Booking.com and converts it to the guest's preferred currency using Open Exchange Rates, then returns the localized price."
tags:
- pricing
- booking-com
- open-exchange-rates
- currency
capability:
exposes:
- type: mcp
namespace: price-localization
port: 8080
tools:
- name: get-localized-price
description: "Fetch the property rate and convert to the guest's currency."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date YYYY-MM-DD."
- name: guest_currency
in: body
type: string
description: "Guest preferred currency code."
steps:
- name: get-rate
type: call
call: "booking-connectivity.get-availability"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
guests: 2
- name: get-fx-rate
type: call
call: "oxr.get-latest"
with:
base: "{{get-rate.currency}}"
symbols: "{{guest_currency}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
- name: guests
in: query
operations:
- name: get-availability
method: GET
- type: http
namespace: oxr
baseUri: "https://openexchangerates.org/api"
authentication:
type: apiKey
name: "app_id"
in: query
value: "$secrets.oxr_app_id"
resources:
- name: rates
path: "/latest.json"
inputParameters:
- name: base
in: query
- name: symbols
in: query
operations:
- name: get-latest
method: GET
Retrieves the health status and error rate for a specified application from New Relic APM.
naftiko: "0.5"
info:
label: "New Relic Service Health"
description: "Retrieves the health status and error rate for a specified application from New Relic APM."
tags:
- observability
- new-relic
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: get-service-health
description: "Get application health status and error rate from New Relic."
inputParameters:
- name: app_id
in: body
type: string
description: "New Relic application ID."
call: "newrelic-api.get-application"
with:
app_id: "{{app_id}}"
consumes:
- type: http
namespace: newrelic-api
baseUri: "https://api.newrelic.com/v2"
authentication:
type: bearer
token: "$secrets.newrelic_api_key"
resources:
- name: applications
path: "/applications/{{app_id}}.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-application
method: GET
Retrieves a transaction trace from New Relic for a specific application, returning response time breakdown, database calls, and external service calls.
naftiko: "0.5"
info:
label: "New Relic Transaction Trace"
description: "Retrieves a transaction trace from New Relic for a specific application, returning response time breakdown, database calls, and external service calls."
tags:
- observability
- new-relic
capability:
exposes:
- type: mcp
namespace: newrelic-trace
port: 8080
tools:
- name: get-transaction-trace
description: "Retrieve a New Relic transaction trace by application ID."
inputParameters:
- name: app_id
in: body
type: string
description: "New Relic application ID."
- name: trace_id
in: body
type: string
description: "Trace identifier."
call: "newrelic-trace.get-trace"
with:
app_id: "{{app_id}}"
trace_id: "{{trace_id}}"
consumes:
- type: http
namespace: newrelic-trace
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apiKey
name: "Api-Key"
in: header
value: "$secrets.newrelic_api_key"
resources:
- name: traces
path: "/applications/{{app_id}}/transactions/{{trace_id}}"
inputParameters:
- name: app_id
in: path
- name: trace_id
in: path
operations:
- name: get-trace
method: GET
Fetches upcoming restaurant reservations from OpenTable and syncs them to the guest itinerary in the Booking.com trip planner.
naftiko: "0.5"
info:
label: "OpenTable Reservation Sync"
description: "Fetches upcoming restaurant reservations from OpenTable and syncs them to the guest itinerary in the Booking.com trip planner."
tags:
- dining
- opentable
- booking-com
- itinerary
capability:
exposes:
- type: mcp
namespace: dining-sync
port: 8080
tools:
- name: sync-dining-reservations
description: "Pull OpenTable reservations for a guest and attach them to their Booking.com trip itinerary."
inputParameters:
- name: guest_email
in: body
type: string
description: "Guest email address linked to OpenTable."
- name: trip_id
in: body
type: string
description: "Booking.com trip planner ID."
steps:
- name: get-dining
type: call
call: "opentable-api.get-reservations"
with:
email: "{{guest_email}}"
- name: attach-to-trip
type: call
call: "booking-trips.add-activity"
with:
trip_id: "{{trip_id}}"
activity_type: "dining"
details: "{{get-dining.reservations}}"
consumes:
- type: http
namespace: opentable-api
baseUri: "https://platform.opentable.com/v2"
authentication:
type: bearer
token: "$secrets.opentable_api_token"
resources:
- name: reservations
path: "/reservations"
inputParameters:
- name: email
in: query
operations:
- name: get-reservations
method: GET
- type: http
namespace: booking-trips
baseUri: "https://trips-api.booking.com/v1"
authentication:
type: bearer
token: "$secrets.booking_trips_token"
resources:
- name: activities
path: "/trips/{{trip_id}}/activities"
inputParameters:
- name: trip_id
in: path
operations:
- name: add-activity
method: POST
Searches for restaurants on OpenTable by location and cuisine, returning names, ratings, and availability.
naftiko: "0.5"
info:
label: "OpenTable Restaurant Search"
description: "Searches for restaurants on OpenTable by location and cuisine, returning names, ratings, and availability."
tags:
- dining
- opentable
capability:
exposes:
- type: mcp
namespace: dining
port: 8080
tools:
- name: search-restaurants
description: "Search OpenTable restaurants by location and cuisine."
inputParameters:
- name: latitude
in: body
type: number
description: "Latitude of the search center."
- name: longitude
in: body
type: number
description: "Longitude of the search center."
- name: cuisine
in: body
type: string
description: "Cuisine type filter."
call: "opentable-api.search-restaurants"
with:
latitude: "{{latitude}}"
longitude: "{{longitude}}"
cuisine: "{{cuisine}}"
consumes:
- type: http
namespace: opentable-api
baseUri: "https://platform.opentable.com/v2"
authentication:
type: bearer
token: "$secrets.opentable_api_token"
resources:
- name: restaurants
path: "/restaurants/search"
operations:
- name: search-restaurants
method: GET
Generates a commission report for a partner property by pulling reservation data from Booking.com, calculating commissions, and emailing the report via SendGrid.
naftiko: "0.5"
info:
label: "Partner Commission Report"
description: "Generates a commission report for a partner property by pulling reservation data from Booking.com, calculating commissions, and emailing the report via SendGrid."
tags:
- finance
- commissions
- booking-com
- sendgrid
- partner-management
capability:
exposes:
- type: mcp
namespace: commission-reports
port: 8080
tools:
- name: generate-commission-report
description: "Pull partner reservations, calculate commissions, and email the report."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: month
in: body
type: string
description: "Report month in YYYY-MM format."
- name: partner_email
in: body
type: string
description: "Partner contact email."
steps:
- name: get-reservations
type: call
call: "booking-connectivity.get-reservations-by-month"
with:
property_id: "{{property_id}}"
month: "{{month}}"
- name: calculate-commissions
type: call
call: "booking-finance.calculate-commissions"
with:
reservations: "{{get-reservations.reservations}}"
property_id: "{{property_id}}"
- name: send-report
type: call
call: "sendgrid.send-email"
with:
to: "{{partner_email}}"
subject: "Commission Report - {{month}} - Property {{property_id}}"
body: "Your commission report for {{month}}: Total bookings: {{calculate-commissions.total_bookings}}. Gross revenue: {{calculate-commissions.gross_revenue}}. Commission: {{calculate-commissions.commission_amount}} {{calculate-commissions.currency}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/properties/{{property_id}}/reservations"
inputParameters:
- name: property_id
in: path
- name: month
in: query
operations:
- name: get-reservations-by-month
method: GET
- type: http
namespace: booking-finance
baseUri: "https://finance-api.booking.com/v1"
authentication:
type: bearer
token: "$secrets.booking_finance_token"
resources:
- name: commissions
path: "/commissions/calculate"
operations:
- name: calculate-commissions
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Checks Salesforce for partner contracts nearing expiration, then sends reminder emails to account managers via SendGrid and posts to the partnerships Slack channel.
naftiko: "0.5"
info:
label: "Partner Contract Renewal Alert"
description: "Checks Salesforce for partner contracts nearing expiration, then sends reminder emails to account managers via SendGrid and posts to the partnerships Slack channel."
tags:
- partner-management
- salesforce
- sendgrid
- slack
- contracts
capability:
exposes:
- type: mcp
namespace: contract-alerts
port: 8080
tools:
- name: alert-contract-renewal
description: "Check a partner contract's expiration in Salesforce and send renewal alerts."
inputParameters:
- name: contract_id
in: body
type: string
description: "Salesforce contract identifier."
steps:
- name: get-contract
type: call
call: "salesforce.get-contract"
with:
contract_id: "{{contract_id}}"
- name: email-manager
type: call
call: "sendgrid.send-email"
with:
to: "{{get-contract.owner_email}}"
subject: "Contract Renewal: {{get-contract.account_name}} expires {{get-contract.end_date}}"
body: "The contract for {{get-contract.account_name}} (ID: {{contract_id}}) expires on {{get-contract.end_date}}. Current value: {{get-contract.contract_value}}. Please initiate renewal discussions."
- name: notify-channel
type: call
call: "slack.post-message"
with:
channel: "#partnerships"
text: "Contract renewal alert: {{get-contract.account_name}} expires {{get-contract.end_date}}. Owner: {{get-contract.owner_name}}. Value: {{get-contract.contract_value}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contracts
path: "/sobjects/Contract/{{contract_id}}"
inputParameters:
- name: contract_id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Resolves a partner dispute by gathering reservation data, fetching Stripe transaction history, creating a Salesforce case, and notifying the partner relations team via Slack.
naftiko: "0.5"
info:
label: "Partner Dispute Resolution"
description: "Resolves a partner dispute by gathering reservation data, fetching Stripe transaction history, creating a Salesforce case, and notifying the partner relations team via Slack."
tags:
- disputes
- booking-com
- stripe
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: disputes
port: 8080
tools:
- name: resolve-dispute
description: "Gather evidence and create a case for a partner dispute."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
- name: partner_id
in: body
type: string
description: "Partner identifier."
steps:
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: get-transactions
type: call
call: "stripe.list-charges"
with:
payment_intent: "{{get-reservation.payment_intent_id}}"
- name: create-case
type: call
call: "salesforce.create-case"
with:
subject: "Partner dispute - Reservation {{reservation_id}}"
partner_id: "{{partner_id}}"
description: "Reservation total: {{get-reservation.total}}. Stripe charges: {{get-transactions.total_count}}."
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#partner-disputes"
text: "New dispute case {{create-case.case_number}} created for partner {{partner_id}}, reservation {{reservation_id}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: charges
path: "/charges"
operations:
- name: list-charges
method: GET
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Reconciles partner payments by fetching commission data from the partner portal, comparing against Stripe payouts, and generating a discrepancy report in Google Sheets.
naftiko: "0.5"
info:
label: "Partner Payment Reconciliation"
description: "Reconciles partner payments by fetching commission data from the partner portal, comparing against Stripe payouts, and generating a discrepancy report in Google Sheets."
tags:
- finance
- stripe
- google-sheets
- partner-portal
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: reconcile-payments
description: "Reconcile partner payments against Stripe payouts and report discrepancies."
inputParameters:
- name: partner_id
in: body
type: string
description: "Partner identifier."
- name: period
in: body
type: string
description: "Period in YYYY-MM format."
steps:
- name: fetch-commissions
type: call
call: "partner-portal.get-commissions"
with:
partner_id: "{{partner_id}}"
period: "{{period}}"
- name: fetch-payouts
type: call
call: "stripe.list-payouts"
with:
destination: "{{fetch-commissions.stripe_account_id}}"
created_gte: "{{period}}-01"
- name: write-report
type: call
call: "google-sheets.append-rows"
with:
spreadsheet_id: "{{fetch-commissions.report_spreadsheet_id}}"
range: "Reconciliation!A1"
values: "{{fetch-payouts.discrepancies}}"
consumes:
- type: http
namespace: partner-portal
baseUri: "https://partner-api.booking.com/v2"
authentication:
type: bearer
token: "$secrets.partner_portal_token"
resources:
- name: commissions
path: "/partners/{{partner_id}}/commissions"
inputParameters:
- name: partner_id
in: path
operations:
- name: get-commissions
method: GET
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payouts
path: "/payouts"
operations:
- name: list-payouts
method: GET
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: append-rows
method: POST
Pulls partner metrics from Booking.com analytics, reservation counts from the connectivity API, and review scores, then pushes a summary to a Google Sheets dashboard.
naftiko: "0.5"
info:
label: "Partner Performance Dashboard Refresh"
description: "Pulls partner metrics from Booking.com analytics, reservation counts from the connectivity API, and review scores, then pushes a summary to a Google Sheets dashboard."
tags:
- analytics
- partner-management
- booking-com
- google-sheets
capability:
exposes:
- type: mcp
namespace: partner-dashboard
port: 8080
tools:
- name: refresh-partner-dashboard
description: "Pull partner metrics and push to Google Sheets dashboard."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: spreadsheet_id
in: body
type: string
description: "Google Sheets spreadsheet ID."
- name: month
in: body
type: string
description: "Report month YYYY-MM."
steps:
- name: get-reservations
type: call
call: "booking-connectivity.get-reservations-by-month"
with:
property_id: "{{property_id}}"
month: "{{month}}"
- name: get-reviews
type: call
call: "booking-connectivity.get-reviews"
with:
property_id: "{{property_id}}"
limit: 100
- name: update-sheet
type: call
call: "google-sheets.update-values"
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "Dashboard!A1:F1"
values: "[[\"{{month}}\",\"{{property_id}}\",{{get-reservations.total_count}},\"{{get-reservations.total_revenue}}\",{{get-reviews.average_score}},{{get-reviews.total_reviews}}]]"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/properties/{{property_id}}/reservations"
inputParameters:
- name: property_id
in: path
- name: month
in: query
operations:
- name: get-reservations-by-month
method: GET
- name: reviews
path: "/properties/{{property_id}}/reviews"
inputParameters:
- name: property_id
in: path
- name: limit
in: query
operations:
- name: get-reviews
method: GET
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/{{spreadsheet_id}}/values/{{range}}"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: update-values
method: PUT
Aggregates partner KPIs from Snowflake, generates scorecards in Tableau, stores results in Elasticsearch, and distributes to partners via Salesforce.
naftiko: "0.5"
info:
label: "Partner Performance Scorecard Pipeline"
description: "Aggregates partner KPIs from Snowflake, generates scorecards in Tableau, stores results in Elasticsearch, and distributes to partners via Salesforce."
tags:
- partner-management
- snowflake
- tableau
- salesforce
capability:
exposes:
- type: mcp
namespace: partner-scorecard
port: 8080
tools:
- name: generate-scorecard
description: "Generate and distribute partner performance scorecards."
inputParameters:
- name: partner_id
in: body
type: string
description: "Partner identifier."
- name: period
in: body
type: string
description: "Reporting period YYYY-Q."
steps:
- name: calculate-kpis
type: call
call: "snowflake.execute-statement"
with:
statement: "CALL PARTNERS.CALCULATE_SCORECARD('{{partner_id}}', '{{period}}')"
- name: refresh-dashboard
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "partner-scorecards"
- name: notify-partner
type: call
call: "salesforce.create-task"
with:
subject: "Performance Scorecard — {{period}}"
description: "Partner {{partner_id}} scorecard ready. Score: {{calculate-kpis.overall_score}}/100."
consumes:
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: tableau
baseUri: "https://tableau.bookingholdings.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/default/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-task
method: POST
Onboards a new hotel partner by creating the property record in the connectivity API, provisioning a Salesforce account, setting up a Slack channel for partner support, and sending the welcome kit via SendGrid.
naftiko: "0.5"
info:
label: "Partner Property Onboarding"
description: "Onboards a new hotel partner by creating the property record in the connectivity API, provisioning a Salesforce account, setting up a Slack channel for partner support, and sending the welcome kit via SendGrid."
tags:
- partner-management
- booking-com
- salesforce
- slack
- sendgrid
- onboarding
capability:
exposes:
- type: mcp
namespace: partner-onboarding
port: 8080
tools:
- name: onboard-property
description: "Onboard a new hotel partner across connectivity platform, Salesforce CRM, Slack, and email."
inputParameters:
- name: property_name
in: body
type: string
description: "Name of the hotel property."
- name: contact_email
in: body
type: string
description: "Primary contact email."
- name: contact_name
in: body
type: string
description: "Primary contact name."
- name: country_code
in: body
type: string
description: "ISO 3166-1 alpha-2 country code."
steps:
- name: create-property
type: call
call: "booking-connectivity.create-property"
with:
name: "{{property_name}}"
country: "{{country_code}}"
contact_email: "{{contact_email}}"
- name: create-account
type: call
call: "salesforce.create-account"
with:
name: "{{property_name}}"
type: "Hotel Partner"
website: ""
billing_country: "{{country_code}}"
- name: create-channel
type: call
call: "slack.create-channel"
with:
name: "partner-{{create-property.property_id}}"
is_private: true
- name: send-welcome
type: call
call: "sendgrid.send-email"
with:
to: "{{contact_email}}"
subject: "Welcome to Booking.com, {{property_name}}!"
body: "Dear {{contact_name}}, your property {{property_name}} (ID: {{create-property.property_id}}) is now live. Your account manager will reach out shortly. Slack channel: {{create-channel.name}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: properties
path: "/properties"
operations:
- name: create-property
method: POST
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account"
operations:
- name: create-account
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Fetches property photos and details, runs quality scoring via AI, generates audit reports in Snowflake, and sends remediation tasks to partners via SendGrid.
naftiko: "0.5"
info:
label: "Partner Property Quality Audit Pipeline"
description: "Fetches property photos and details, runs quality scoring via AI, generates audit reports in Snowflake, and sends remediation tasks to partners via SendGrid."
tags:
- quality
- booking-com
- snowflake
- sendgrid
capability:
exposes:
- type: mcp
namespace: quality-audit
port: 8080
tools:
- name: audit-property-quality
description: "Run a quality audit on a partner property."
inputParameters:
- name: property_id
in: body
type: string
description: "Property ID."
- name: partner_email
in: body
type: string
description: "Partner contact email."
steps:
- name: get-property
type: call
call: "booking-api.get-property"
with:
property_id: "{{property_id}}"
- name: score-quality
type: call
call: "snowflake.execute-statement"
with:
statement: "CALL QUALITY.SCORE_PROPERTY('{{property_id}}')"
- name: store-audit
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO QUALITY.AUDITS VALUES ('{{property_id}}', {{score-quality.score}}, CURRENT_TIMESTAMP())"
- name: send-report
type: call
call: "sendgrid.send-email"
with:
to: "{{partner_email}}"
subject: "Property Quality Audit — {{property_id}}"
body: "Quality score: {{score-quality.score}}/100. Issues: {{score-quality.issues}}. Please address within 30 days."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: properties
path: "/properties/{{property_id}}"
inputParameters:
- name: property_id
in: path
operations:
- name: get-property
method: GET
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Extracts partner booking revenue from Snowflake, reconciles against Stripe payouts, logs discrepancies, and notifies finance via Slack.
naftiko: "0.5"
info:
label: "Partner Revenue Reconciliation Pipeline"
description: "Extracts partner booking revenue from Snowflake, reconciles against Stripe payouts, logs discrepancies, and notifies finance via Slack."
tags:
- finance
- snowflake
- stripe
- slack
capability:
exposes:
- type: mcp
namespace: revenue-recon
port: 8080
tools:
- name: reconcile-revenue
description: "Reconcile partner revenue against payment processor records."
inputParameters:
- name: partner_id
in: body
type: string
description: "Partner identifier."
- name: period
in: body
type: string
description: "Reconciliation period YYYY-MM."
steps:
- name: get-bookings
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT SUM(revenue) as total FROM BOOKINGS WHERE partner_id = '{{partner_id}}' AND period = '{{period}}'"
- name: get-payouts
type: call
call: "stripe.list-payouts"
with:
partner_id: "{{partner_id}}"
period: "{{period}}"
- name: log-recon
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO FINANCE.RECON_LOG VALUES ('{{partner_id}}', '{{period}}', {{get-bookings.total}}, {{get-payouts.total}})"
- name: notify-finance
type: call
call: "slack.post-message"
with:
channel: "#finance"
text: "Revenue recon: {{partner_id}} ({{period}}). Bookings: ${{get-bookings.total}}. Payouts: ${{get-payouts.total}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payouts
path: "/payouts"
inputParameters:
- name: partner_id
in: query
- name: period
in: query
operations:
- name: list-payouts
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Screens booking payments via Stripe Radar, logs results in Snowflake, creates Jira tickets for flagged transactions, and notifies the fraud team via Slack.
naftiko: "0.5"
info:
label: "Payment Fraud Screening Pipeline"
description: "Screens booking payments via Stripe Radar, logs results in Snowflake, creates Jira tickets for flagged transactions, and notifies the fraud team via Slack."
tags:
- fraud
- stripe
- snowflake
- jira
- slack
capability:
exposes:
- type: mcp
namespace: fraud-screening
port: 8080
tools:
- name: screen-payment
description: "Screen a booking payment for fraud with case management."
inputParameters:
- name: payment_intent_id
in: body
type: string
description: "Stripe payment intent ID."
steps:
- name: get-payment
type: call
call: "stripe.get-payment-intent"
with:
payment_intent_id: "{{payment_intent_id}}"
- name: log-screening
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO FRAUD.SCREENINGS VALUES ('{{payment_intent_id}}', '{{get-payment.risk_score}}', '{{get-payment.risk_level}}')"
- name: create-case
type: call
call: "jira.create-issue"
with:
project: "FRAUD"
summary: "Payment fraud alert: {{payment_intent_id}}"
description: "Risk: {{get-payment.risk_level}}. Score: {{get-payment.risk_score}}. Amount: ${{get-payment.amount}}."
issue_type: "Task"
- name: alert-team
type: call
call: "slack.post-message"
with:
channel: "#fraud-ops"
text: "Fraud alert: {{payment_intent_id}}. Risk: {{get-payment.risk_level}}. Jira: {{create-case.key}}."
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents/{{payment_intent_id}}"
inputParameters:
- name: payment_intent_id
in: path
operations:
- name: get-payment-intent
method: GET
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches saved payment methods for a customer account from Stripe, returning card details and default status.
naftiko: "0.5"
info:
label: "Payment Method Retrieval"
description: "Fetches saved payment methods for a customer account from Stripe, returning card details and default status."
tags:
- payments
- stripe
capability:
exposes:
- type: mcp
namespace: payments
port: 8080
tools:
- name: list-payment-methods
description: "List saved payment methods for a Stripe customer."
inputParameters:
- name: customer_id
in: body
type: string
description: "Stripe customer identifier."
call: "stripe.list-payment-methods"
with:
customer: "{{customer_id}}"
type: "card"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-methods
path: "/payment_methods"
operations:
- name: list-payment-methods
method: GET
Detects service degradation via Datadog, creates a Jira incident, spins up a Slack war room, and notifies stakeholders via SendGrid.
naftiko: "0.5"
info:
label: "Platform Incident Response Pipeline"
description: "Detects service degradation via Datadog, creates a Jira incident, spins up a Slack war room, and notifies stakeholders via SendGrid."
tags:
- incident-management
- datadog
- jira
- slack
- sendgrid
capability:
exposes:
- type: mcp
namespace: platform-ir
port: 8080
tools:
- name: respond-to-incident
description: "Coordinate incident response across monitoring, ticketing, and communication."
inputParameters:
- name: service_name
in: body
type: string
description: "Affected service name."
- name: severity
in: body
type: string
description: "Incident severity (SEV1, SEV2, SEV3)."
steps:
- name: get-metrics
type: call
call: "datadog.query-metrics"
with:
query: "avg:http.errors{service:{{service_name}}}.as_rate()"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "INC"
summary: "{{severity}}: {{service_name}} degradation"
description: "Error rate: {{get-metrics.value}}. Service: {{service_name}}."
issue_type: "Bug"
priority: "{{severity}}"
- name: create-channel
type: call
call: "slack.create-channel"
with:
name: "inc-{{service_name}}"
topic: "{{severity}} — {{service_name}}"
- name: notify-stakeholders
type: call
call: "sendgrid.send-email"
with:
to: "platform-oncall@bookingholdings.com"
subject: "{{severity}}: {{service_name}} incident"
body: "Incident opened. Jira: {{create-ticket.key}}. Slack: #{{create-channel.name}}. Error rate: {{get-metrics.value}}."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/query"
inputParameters:
- name: query
in: query
operations:
- name: query-metrics
method: GET
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
After checkout, retrieves the reservation details, creates a survey in Typeform, and sends the survey link to the guest via SendGrid.
naftiko: "0.5"
info:
label: "Post-Stay Survey Dispatcher"
description: "After checkout, retrieves the reservation details, creates a survey in Typeform, and sends the survey link to the guest via SendGrid."
tags:
- guest-experience
- booking-com
- typeform
- sendgrid
- surveys
capability:
exposes:
- type: mcp
namespace: post-stay-surveys
port: 8080
tools:
- name: send-post-stay-survey
description: "Send a post-stay survey to a guest after checkout."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
steps:
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: create-survey
type: call
call: "typeform.create-form"
with:
title: "How was your stay at {{get-reservation.property_name}}?"
reservation_id: "{{reservation_id}}"
- name: send-survey
type: call
call: "sendgrid.send-email"
with:
to: "{{get-reservation.guest_email}}"
subject: "How was your stay at {{get-reservation.property_name}}?"
body: "Dear {{get-reservation.guest_name}}, we hope you enjoyed your stay at {{get-reservation.property_name}} ({{get-reservation.checkin}} to {{get-reservation.checkout}}). Please share your feedback: {{create-survey.url}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: typeform
baseUri: "https://api.typeform.com"
authentication:
type: bearer
token: "$secrets.typeform_token"
resources:
- name: forms
path: "/forms"
operations:
- name: create-form
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Retrieves the current Express Deal price for a hotel from the Priceline partner API by destination and star rating.
naftiko: "0.5"
info:
label: "Priceline Deal Price Fetch"
description: "Retrieves the current Express Deal price for a hotel from the Priceline partner API by destination and star rating."
tags:
- pricing
- priceline
- deals
capability:
exposes:
- type: mcp
namespace: pricing
port: 8080
tools:
- name: get-express-deal
description: "Fetch Express Deal pricing from Priceline for a given destination and star rating."
inputParameters:
- name: destination_id
in: body
type: string
description: "Priceline destination identifier."
- name: star_rating
in: body
type: integer
description: "Minimum star rating for the deal."
call: "priceline-partner.get-deals"
with:
destination_id: "{{destination_id}}"
star_rating: "{{star_rating}}"
consumes:
- type: http
namespace: priceline-partner
baseUri: "https://api.priceline.com/partner/v2"
authentication:
type: apiKey
name: "X-Api-Key"
in: header
value: "$secrets.priceline_api_key"
resources:
- name: deals
path: "/hotels/express-deals"
inputParameters:
- name: destination_id
in: query
- name: star_rating
in: query
operations:
- name: get-deals
method: GET
Searches Priceline for Express Deal offers by destination and dates, returning opaque pricing with star ratings and neighborhood details.
naftiko: "0.5"
info:
label: "Priceline Express Deal Lookup"
description: "Searches Priceline for Express Deal offers by destination and dates, returning opaque pricing with star ratings and neighborhood details."
tags:
- deals
- priceline
capability:
exposes:
- type: mcp
namespace: priceline-deals
port: 8080
tools:
- name: get-express-deals
description: "Search Priceline Express Deals for a destination."
inputParameters:
- name: destination
in: body
type: string
description: "Destination city."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
call: "priceline-deals.search-deals"
with:
destination: "{{destination}}"
checkin: "{{checkin}}"
consumes:
- type: http
namespace: priceline-deals
baseUri: "https://api.priceline.com/v1"
authentication:
type: bearer
token: "$secrets.priceline_api_token"
resources:
- name: deals
path: "/express-deals/search"
inputParameters:
- name: destination
in: query
- name: checkin
in: query
operations:
- name: search-deals
method: GET
Fetches detailed hotel information from Priceline including amenities, photos, and location data.
naftiko: "0.5"
info:
label: "Priceline Hotel Details"
description: "Fetches detailed hotel information from Priceline including amenities, photos, and location data."
tags:
- hotel-details
- priceline
capability:
exposes:
- type: mcp
namespace: hotel-details
port: 8080
tools:
- name: get-hotel-details
description: "Get detailed hotel information from Priceline by hotel ID."
inputParameters:
- name: hotel_id
in: body
type: string
description: "Priceline hotel identifier."
call: "priceline-api.get-hotel"
with:
hotel_id: "{{hotel_id}}"
consumes:
- type: http
namespace: priceline-api
baseUri: "https://api.priceline.com/v2"
authentication:
type: bearer
token: "$secrets.priceline_api_token"
resources:
- name: hotels
path: "/hotels/{{hotel_id}}"
inputParameters:
- name: hotel_id
in: path
operations:
- name: get-hotel
method: GET
Retrieves a Priceline reservation by trip number and enriches it with Stripe payment details for a complete booking view.
naftiko: "0.5"
info:
label: "Priceline Reservation Lookup"
description: "Retrieves a Priceline reservation by trip number and enriches it with Stripe payment details for a complete booking view."
tags:
- reservations
- priceline
- stripe
capability:
exposes:
- type: mcp
namespace: priceline-reservations
port: 8080
tools:
- name: get-priceline-reservation
description: "Look up a Priceline reservation by trip number and enrich with payment details."
inputParameters:
- name: trip_number
in: body
type: string
description: "Priceline trip number."
steps:
- name: get-reservation
type: call
call: "priceline-partner.get-reservation"
with:
trip_number: "{{trip_number}}"
- name: get-payment
type: call
call: "stripe.get-payment-intent"
with:
payment_intent_id: "{{get-reservation.payment_intent_id}}"
consumes:
- type: http
namespace: priceline-partner
baseUri: "https://api.priceline.com/partner/v2"
authentication:
type: apiKey
name: "X-Api-Key"
in: header
value: "$secrets.priceline_api_key"
resources:
- name: reservations
path: "/reservations/{{trip_number}}"
inputParameters:
- name: trip_number
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents/{{payment_intent_id}}"
inputParameters:
- name: payment_intent_id
in: path
operations:
- name: get-payment-intent
method: GET
Queries the Booking.com connectivity API for real-time room availability at a given property for specified dates and guest count.
naftiko: "0.5"
info:
label: "Property Availability Lookup"
description: "Queries the Booking.com connectivity API for real-time room availability at a given property for specified dates and guest count."
tags:
- inventory
- booking-com
- availability
capability:
exposes:
- type: mcp
namespace: inventory
port: 8080
tools:
- name: check-availability
description: "Check real-time room availability for a Booking.com property by property ID, check-in/check-out dates, and guest count."
inputParameters:
- name: property_id
in: body
type: string
description: "The Booking.com property identifier."
- name: checkin
in: body
type: string
description: "Check-in date in YYYY-MM-DD format."
- name: checkout
in: body
type: string
description: "Check-out date in YYYY-MM-DD format."
- name: guests
in: body
type: integer
description: "Number of guests."
call: "booking-connectivity.get-availability"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
guests: "{{guests}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
- name: guests
in: query
operations:
- name: get-availability
method: GET
Sets blackout dates on a Booking.com property and syncs the closure to Priceline and Agoda to ensure consistent inventory blocking across channels.
naftiko: "0.5"
info:
label: "Property Blackout Date Manager"
description: "Sets blackout dates on a Booking.com property and syncs the closure to Priceline and Agoda to ensure consistent inventory blocking across channels."
tags:
- inventory
- booking-com
- priceline
- agoda
- blackout-dates
capability:
exposes:
- type: mcp
namespace: blackout-dates
port: 8080
tools:
- name: set-blackout-dates
description: "Set blackout dates across Booking.com, Priceline, and Agoda."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: priceline_hotel_id
in: body
type: string
description: "Priceline hotel identifier."
- name: agoda_property_id
in: body
type: string
description: "Agoda property identifier."
- name: date_from
in: body
type: string
description: "Start of blackout period YYYY-MM-DD."
- name: date_to
in: body
type: string
description: "End of blackout period YYYY-MM-DD."
- name: reason
in: body
type: string
description: "Reason for blackout (maintenance, event, etc.)."
steps:
- name: blackout-booking
type: call
call: "booking-connectivity.create-blackout"
with:
property_id: "{{property_id}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
reason: "{{reason}}"
- name: blackout-priceline
type: call
call: "priceline-partner.create-blackout"
with:
hotel_id: "{{priceline_hotel_id}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
- name: blackout-agoda
type: call
call: "agoda-connectivity.create-blackout"
with:
property_id: "{{agoda_property_id}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: blackout-dates
path: "/properties/{{property_id}}/blackout-dates"
inputParameters:
- name: property_id
in: path
operations:
- name: create-blackout
method: POST
- type: http
namespace: priceline-partner
baseUri: "https://api.priceline.com/partner/v2"
authentication:
type: apiKey
name: "X-Api-Key"
in: header
value: "$secrets.priceline_api_key"
resources:
- name: blackout-dates
path: "/hotels/{{hotel_id}}/blackout-dates"
inputParameters:
- name: hotel_id
in: path
operations:
- name: create-blackout
method: POST
- type: http
namespace: agoda-connectivity
baseUri: "https://supply-api.agoda.com/v2"
authentication:
type: bearer
token: "$secrets.agoda_connectivity_token"
resources:
- name: blackout-dates
path: "/properties/{{property_id}}/blackout-dates"
inputParameters:
- name: property_id
in: path
operations:
- name: create-blackout
method: POST
Verifies a property meets compliance requirements by checking the license registry, validating tax documentation in DocuSign, and updating the compliance status in Salesforce.
naftiko: "0.5"
info:
label: "Property Compliance Verification"
description: "Verifies a property meets compliance requirements by checking the license registry, validating tax documentation in DocuSign, and updating the compliance status in Salesforce."
tags:
- compliance
- booking-com
- docusign
- salesforce
capability:
exposes:
- type: mcp
namespace: compliance
port: 8080
tools:
- name: verify-property-compliance
description: "Check property license, validate tax docs, and update compliance status."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: account_id
in: body
type: string
description: "Salesforce account ID for the partner."
steps:
- name: check-license
type: call
call: "booking-connectivity.get-property-license"
with:
property_id: "{{property_id}}"
- name: check-tax-docs
type: call
call: "docusign.get-envelope-status"
with:
envelope_id: "{{check-license.tax_envelope_id}}"
- name: update-compliance
type: call
call: "salesforce.update-account"
with:
account_id: "{{account_id}}"
compliance_status: "verified"
license_valid: "{{check-license.is_valid}}"
tax_docs_signed: "{{check-tax-docs.status}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: licenses
path: "/properties/{{property_id}}/license"
inputParameters:
- name: property_id
in: path
operations:
- name: get-property-license
method: GET
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/envelopes/{{envelope_id}}"
inputParameters:
- name: envelope_id
in: path
operations:
- name: get-envelope-status
method: GET
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
Retrieves property descriptions, translates via Google Translate, validates quality, and publishes localized content to the content management system.
naftiko: "0.5"
info:
label: "Property Content Localization Pipeline"
description: "Retrieves property descriptions, translates via Google Translate, validates quality, and publishes localized content to the content management system."
tags:
- content
- google-translate
- booking-com
capability:
exposes:
- type: mcp
namespace: content-localization
port: 8080
tools:
- name: localize-content
description: "Translate and publish localized property content."
inputParameters:
- name: property_id
in: body
type: string
description: "Property ID."
- name: target_language
in: body
type: string
description: "Target language code (e.g. fr, de, ja)."
steps:
- name: get-content
type: call
call: "booking-api.get-property-content"
with:
property_id: "{{property_id}}"
- name: translate
type: call
call: "google-translate.translate-text"
with:
text: "{{get-content.description}}"
target: "{{target_language}}"
- name: publish-content
type: call
call: "booking-api.update-property-content"
with:
property_id: "{{property_id}}"
language: "{{target_language}}"
description: "{{translate.translated_text}}"
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: content
path: "/properties/{{property_id}}/content"
inputParameters:
- name: property_id
in: path
operations:
- name: get-property-content
method: GET
- name: update-property-content
method: PUT
- type: http
namespace: google-translate
baseUri: "https://translation.googleapis.com/language/translate/v2"
authentication:
type: apiKey
name: "key"
in: query
value: "$secrets.google_translate_key"
resources:
- name: translations
path: "/"
operations:
- name: translate-text
method: POST
Fetches a property description from Booking.com, translates it to the target language via Google Translate, and pushes the translated content back to the content API.
naftiko: "0.5"
info:
label: "Property Description Localization"
description: "Fetches a property description from Booking.com, translates it to the target language via Google Translate, and pushes the translated content back to the content API."
tags:
- localization
- booking-com
- google-translate
- content
capability:
exposes:
- type: mcp
namespace: content-localization
port: 8080
tools:
- name: localize-property-description
description: "Translate and update a property description for a target language."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: target_language
in: body
type: string
description: "Target language code."
steps:
- name: get-description
type: call
call: "booking-content.get-description"
with:
property_id: "{{property_id}}"
- name: translate
type: call
call: "google-translate.translate"
with:
q: "{{get-description.text}}"
target: "{{target_language}}"
source: "{{get-description.language}}"
- name: update-description
type: call
call: "booking-content.update-description"
with:
property_id: "{{property_id}}"
language: "{{target_language}}"
text: "{{translate.translatedText}}"
consumes:
- type: http
namespace: booking-content
baseUri: "https://content-api.booking.com/v1"
authentication:
type: bearer
token: "$secrets.booking_content_token"
resources:
- name: descriptions
path: "/properties/{{property_id}}/description"
inputParameters:
- name: property_id
in: path
operations:
- name: get-description
method: GET
- name: update-description
method: PUT
- type: http
namespace: google-translate
baseUri: "https://translation.googleapis.com/language/translate/v2"
authentication:
type: apiKey
name: "key"
in: query
value: "$secrets.google_translate_api_key"
resources:
- name: translations
path: ""
operations:
- name: translate
method: POST
Audits a property listing by fetching details from Booking.com, analyzing photo quality via an ML model, and creating a Jira ticket for any issues found.
naftiko: "0.5"
info:
label: "Property Listing Quality Audit"
description: "Audits a property listing by fetching details from Booking.com, analyzing photo quality via an ML model, and creating a Jira ticket for any issues found."
tags:
- quality
- booking-com
- azure-machine-learning
- jira
capability:
exposes:
- type: mcp
namespace: quality
port: 8080
tools:
- name: audit-listing
description: "Run a quality audit on a property listing and create issues for deficiencies."
inputParameters:
- name: property_id
in: body
type: string
description: "Property identifier."
steps:
- name: fetch-listing
type: call
call: "booking-connectivity.get-property"
with:
property_id: "{{property_id}}"
- name: analyze-photos
type: call
call: "azure-ml.score-photos"
with:
photo_urls: "{{fetch-listing.photo_urls}}"
- name: create-issue
type: call
call: "jira.create-issue"
with:
project: "QUALITY"
summary: "Listing quality issues for property {{property_id}}"
description: "Photo score: {{analyze-photos.score}}. Missing fields: {{fetch-listing.missing_fields}}"
issue_type: "Task"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: properties
path: "/properties/{{property_id}}"
inputParameters:
- name: property_id
in: path
operations:
- name: get-property
method: GET
- type: http
namespace: azure-ml
baseUri: "https://ml.booking.com/api/v1"
authentication:
type: bearer
token: "$secrets.azure_ml_token"
resources:
- name: photo-quality
path: "/models/photo-quality/score"
operations:
- name: score-photos
method: POST
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Verifies a new property onboarding by checking listing completeness, verifying tax documents in Box, and notifying the partner via Slack.
naftiko: "0.5"
info:
label: "Property Onboarding Verification"
description: "Verifies a new property onboarding by checking listing completeness, verifying tax documents in Box, and notifying the partner via Slack."
tags:
- onboarding
- booking-com
- box
- slack
capability:
exposes:
- type: mcp
namespace: onboarding
port: 8080
tools:
- name: verify-onboarding
description: "Verify property onboarding completeness and compliance."
inputParameters:
- name: property_id
in: body
type: string
description: "Property identifier."
- name: partner_slack_channel
in: body
type: string
description: "Partner Slack channel ID."
steps:
- name: check-listing
type: call
call: "booking-connectivity.get-property"
with:
property_id: "{{property_id}}"
- name: verify-documents
type: call
call: "box-api.search-files"
with:
query: "property-{{property_id}}-tax"
ancestor_folder_id: "0"
- name: notify-partner
type: call
call: "slack.post-message"
with:
channel: "{{partner_slack_channel}}"
text: "Property {{property_id}} onboarding verification complete. Listing fields: {{check-listing.completeness_pct}}%. Tax docs found: {{verify-documents.total_count}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: properties
path: "/properties/{{property_id}}"
inputParameters:
- name: property_id
in: path
operations:
- name: get-property
method: GET
- type: http
namespace: box-api
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_api_token"
resources:
- name: search
path: "/search"
operations:
- name: search-files
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Uploads a property photo to AWS S3, registers the image URL with the Booking.com content API, and notifies the content team in Slack.
naftiko: "0.5"
info:
label: "Property Photo Upload Pipeline"
description: "Uploads a property photo to AWS S3, registers the image URL with the Booking.com content API, and notifies the content team in Slack."
tags:
- content
- booking-com
- aws-s3
- slack
capability:
exposes:
- type: mcp
namespace: content-management
port: 8080
tools:
- name: upload-property-photo
description: "Upload a property photo to S3, register it in the content API, and notify the content team."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: photo_url
in: body
type: string
description: "Source URL of the photo to upload."
- name: caption
in: body
type: string
description: "Photo caption."
steps:
- name: upload-to-s3
type: call
call: "aws-s3.put-object"
with:
bucket: "booking-property-photos"
key: "properties/{{property_id}}/{{caption}}.jpg"
source_url: "{{photo_url}}"
- name: register-photo
type: call
call: "booking-content.add-photo"
with:
property_id: "{{property_id}}"
url: "{{upload-to-s3.url}}"
caption: "{{caption}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#content-uploads"
text: "New photo uploaded for property {{property_id}}: {{caption}}. URL: {{upload-to-s3.url}}."
consumes:
- type: http
namespace: aws-s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: awsv4
accessKeyId: "$secrets.aws_access_key_id"
secretAccessKey: "$secrets.aws_secret_access_key"
region: "eu-west-1"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: put-object
method: PUT
- type: http
namespace: booking-content
baseUri: "https://content-api.booking.com/v1"
authentication:
type: bearer
token: "$secrets.booking_content_token"
resources:
- name: photos
path: "/properties/{{property_id}}/photos"
inputParameters:
- name: property_id
in: path
operations:
- name: add-photo
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the aggregate guest rating and review count for a Booking.com property.
naftiko: "0.5"
info:
label: "Property Rating Fetch"
description: "Retrieves the aggregate guest rating and review count for a Booking.com property."
tags:
- reviews
- booking-com
capability:
exposes:
- type: mcp
namespace: reviews
port: 8080
tools:
- name: get-property-rating
description: "Get aggregate rating and review count for a property."
inputParameters:
- name: property_id
in: body
type: string
description: "The Booking.com property identifier."
call: "booking-connectivity.get-rating"
with:
property_id: "{{property_id}}"
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: ratings
path: "/properties/{{property_id}}/rating"
inputParameters:
- name: property_id
in: path
operations:
- name: get-rating
method: GET
Fetches guest reviews, runs content moderation via OpenAI, flags violations in Jira, and notifies the trust and safety team via Slack.
naftiko: "0.5"
info:
label: "Property Review Moderation Pipeline"
description: "Fetches guest reviews, runs content moderation via OpenAI, flags violations in Jira, and notifies the trust and safety team via Slack."
tags:
- trust-safety
- openai
- jira
- slack
capability:
exposes:
- type: mcp
namespace: review-moderation
port: 8080
tools:
- name: moderate-reviews
description: "Moderate guest reviews with AI screening and violation tracking."
inputParameters:
- name: property_id
in: body
type: string
description: "Property ID."
- name: review_id
in: body
type: string
description: "Review identifier."
steps:
- name: get-review
type: call
call: "booking-api.get-review"
with:
property_id: "{{property_id}}"
review_id: "{{review_id}}"
- name: screen-content
type: call
call: "openai.moderate"
with:
input: "{{get-review.text}}"
- name: flag-violation
type: call
call: "jira.create-issue"
with:
project: "TRUST"
summary: "Review violation: {{property_id}} / {{review_id}}"
description: "Categories: {{screen-content.categories}}. Score: {{screen-content.score}}."
issue_type: "Task"
- name: alert-team
type: call
call: "slack.post-message"
with:
channel: "#trust-safety"
text: "Review flagged: {{property_id}} / {{review_id}}. Violation: {{screen-content.categories}}. Jira: {{flag-violation.key}}."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reviews
path: "/properties/{{property_id}}/reviews/{{review_id}}"
inputParameters:
- name: property_id
in: path
- name: review_id
in: path
operations:
- name: get-review
method: GET
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: moderations
path: "/moderations"
operations:
- name: moderate
method: POST
- type: http
namespace: jira
baseUri: "https://bookingholdings.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Compares a property's rates across Booking.com, Priceline, and Kayak, then alerts the revenue team in Slack when parity violations exceed the threshold.
naftiko: "0.5"
info:
label: "Rate Parity Monitor"
description: "Compares a property's rates across Booking.com, Priceline, and Kayak, then alerts the revenue team in Slack when parity violations exceed the threshold."
tags:
- pricing
- rate-parity
- booking-com
- priceline
- kayak
- slack
capability:
exposes:
- type: mcp
namespace: rate-parity
port: 8080
tools:
- name: check-rate-parity
description: "Compare rates for a property across Booking.com, Priceline, and Kayak and alert on parity violations."
inputParameters:
- name: property_id
in: body
type: string
description: "Booking.com property identifier."
- name: priceline_hotel_id
in: body
type: string
description: "Priceline hotel identifier."
- name: checkin
in: body
type: string
description: "Check-in date YYYY-MM-DD."
- name: checkout
in: body
type: string
description: "Check-out date YYYY-MM-DD."
steps:
- name: booking-rate
type: call
call: "booking-connectivity.get-availability"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
guests: 2
- name: priceline-rate
type: call
call: "priceline-partner.get-hotel-rate"
with:
hotel_id: "{{priceline_hotel_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
- name: kayak-rate
type: call
call: "kayak-api.get-hotel-rate"
with:
property_id: "{{property_id}}"
checkin: "{{checkin}}"
checkout: "{{checkout}}"
- name: alert-parity
type: call
call: "slack.post-message"
with:
channel: "#rate-parity-alerts"
text: "Rate parity check for property {{property_id}}: Booking.com={{booking-rate.rate}}, Priceline={{priceline-rate.rate}}, Kayak={{kayak-rate.rate}}. Dates: {{checkin}} to {{checkout}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: availability
path: "/properties/{{property_id}}/availability"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
- name: guests
in: query
operations:
- name: get-availability
method: GET
- type: http
namespace: priceline-partner
baseUri: "https://api.priceline.com/partner/v2"
authentication:
type: apiKey
name: "X-Api-Key"
in: header
value: "$secrets.priceline_api_key"
resources:
- name: hotel-rates
path: "/hotels/{{hotel_id}}/rates"
inputParameters:
- name: hotel_id
in: path
- name: checkin
in: query
- name: checkout
in: query
operations:
- name: get-hotel-rate
method: GET
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: hotel-rates
path: "/hotels/{{property_id}}/rates"
inputParameters:
- name: property_id
in: path
- name: checkin
in: query
- name: checkout
in: query
operations:
- name: get-hotel-rate
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Searches car rentals on Kayak, creates the booking, adds insurance coverage, and sends confirmation via SendGrid.
naftiko: "0.5"
info:
label: "Rental Car Booking with Insurance"
description: "Searches car rentals on Kayak, creates the booking, adds insurance coverage, and sends confirmation via SendGrid."
tags:
- car-rental
- kayak
- stripe
- sendgrid
- booking-flow
capability:
exposes:
- type: mcp
namespace: car-rental-booking
port: 8080
tools:
- name: book-car-with-insurance
description: "Book a rental car with insurance, process payment, and send confirmation."
inputParameters:
- name: pickup_location
in: body
type: string
description: "Pickup location IATA code."
- name: pickup_date
in: body
type: string
description: "Pickup date YYYY-MM-DD."
- name: dropoff_date
in: body
type: string
description: "Drop-off date YYYY-MM-DD."
- name: renter_email
in: body
type: string
description: "Renter email address."
- name: payment_method_id
in: body
type: string
description: "Stripe payment method ID."
steps:
- name: search-cars
type: call
call: "kayak-api.search-cars"
with:
pickup_location: "{{pickup_location}}"
pickup_date: "{{pickup_date}}"
dropoff_date: "{{dropoff_date}}"
- name: create-booking
type: call
call: "kayak-api.book-car"
with:
offer_id: "{{search-cars.offers[0].id}}"
renter_email: "{{renter_email}}"
add_insurance: true
- name: charge-payment
type: call
call: "stripe.create-payment-intent"
with:
amount: "{{create-booking.total_cents}}"
currency: "{{create-booking.currency}}"
payment_method: "{{payment_method_id}}"
confirm: true
- name: send-confirmation
type: call
call: "sendgrid.send-email"
with:
to: "{{renter_email}}"
subject: "Car Rental Confirmed: {{pickup_location}} {{pickup_date}}-{{dropoff_date}}"
body: "Your rental is confirmed! Pickup: {{pickup_location}} on {{pickup_date}}. Drop-off: {{dropoff_date}}. Vehicle: {{create-booking.vehicle_name}}. Total: {{create-booking.total}} {{create-booking.currency}} (includes insurance). Confirmation: {{create-booking.confirmation_code}}."
consumes:
- type: http
namespace: kayak-api
baseUri: "https://api.kayak.com/v1"
authentication:
type: bearer
token: "$secrets.kayak_api_token"
resources:
- name: cars-search
path: "/cars/search"
inputParameters:
- name: pickup_location
in: query
- name: pickup_date
in: query
- name: dropoff_date
in: query
operations:
- name: search-cars
method: GET
- name: cars-book
path: "/cars/book"
operations:
- name: book-car
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents"
operations:
- name: create-payment-intent
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Checks car rental availability at a given location and date range, returning vehicle categories, prices, and supplier details.
naftiko: "0.5"
info:
label: "Rentalcars Availability Check"
description: "Checks car rental availability at a given location and date range, returning vehicle categories, prices, and supplier details."
tags:
- car-rental
- rentalcars
capability:
exposes:
- type: mcp
namespace: rentalcars-avail
port: 8080
tools:
- name: check-availability
description: "Check car rental availability by location and dates."
inputParameters:
- name: pickup_location
in: body
type: string
description: "Pickup location code."
- name: pickup_date
in: body
type: string
description: "Pickup date YYYY-MM-DD."
- name: dropoff_date
in: body
type: string
description: "Drop-off date YYYY-MM-DD."
call: "rentalcars-avail.search"
with:
pickup_location: "{{pickup_location}}"
pickup_date: "{{pickup_date}}"
dropoff_date: "{{dropoff_date}}"
consumes:
- type: http
namespace: rentalcars-avail
baseUri: "https://api.rentalcars.com/v1"
authentication:
type: bearer
token: "$secrets.rentalcars_api_token"
resources:
- name: availability
path: "/vehicles/search"
inputParameters:
- name: pickup_location
in: query
- name: pickup_date
in: query
- name: dropoff_date
in: query
operations:
- name: search
method: GET
Retrieves available rental vehicles from Rentalcars.com for a given location and date range.
naftiko: "0.5"
info:
label: "Rentalcars Vehicle Lookup"
description: "Retrieves available rental vehicles from Rentalcars.com for a given location and date range."
tags:
- car-rental
- rentalcars
capability:
exposes:
- type: mcp
namespace: car-rental
port: 8080
tools:
- name: search-vehicles
description: "Search available rental vehicles by location and dates."
inputParameters:
- name: pickup_location
in: body
type: string
description: "Pickup location code."
- name: pickup_date
in: body
type: string
description: "Pickup date in YYYY-MM-DD format."
- name: dropoff_date
in: body
type: string
description: "Drop-off date in YYYY-MM-DD format."
call: "rentalcars-api.search-vehicles"
with:
pickup_location: "{{pickup_location}}"
pickup_date: "{{pickup_date}}"
dropoff_date: "{{dropoff_date}}"
consumes:
- type: http
namespace: rentalcars-api
baseUri: "https://api.rentalcars.com/v2"
authentication:
type: bearer
token: "$secrets.rentalcars_api_token"
resources:
- name: vehicles
path: "/vehicles/search"
operations:
- name: search-vehicles
method: GET
Looks up a reservation in the booking platform, generates a confirmation summary, and dispatches the confirmation email via SendGrid.
naftiko: "0.5"
info:
label: "Reservation Confirmation Sender"
description: "Looks up a reservation in the booking platform, generates a confirmation summary, and dispatches the confirmation email via SendGrid."
tags:
- reservations
- booking-com
- sendgrid
- notifications
capability:
exposes:
- type: mcp
namespace: reservations
port: 8080
tools:
- name: send-confirmation
description: "Given a reservation ID, retrieve reservation details from Booking.com and send a confirmation email to the guest via SendGrid."
inputParameters:
- name: reservation_id
in: body
type: string
description: "The Booking.com reservation identifier."
steps:
- name: get-reservation
type: call
call: "booking-connectivity.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: send-email
type: call
call: "sendgrid.send-email"
with:
to: "{{get-reservation.guest_email}}"
subject: "Booking Confirmed: {{get-reservation.property_name}} - {{get-reservation.checkin}}"
body: "Dear {{get-reservation.guest_name}}, your reservation {{reservation_id}} at {{get-reservation.property_name}} is confirmed for {{get-reservation.checkin}} to {{get-reservation.checkout}}. Confirmation PIN: {{get-reservation.pin}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Processes a reservation modification by checking availability for new dates, adjusting the Stripe payment, confirming the change, and sending a confirmation email via SendGrid.
naftiko: "0.5"
info:
label: "Reservation Modification Workflow"
description: "Processes a reservation modification by checking availability for new dates, adjusting the Stripe payment, confirming the change, and sending a confirmation email via SendGrid."
tags:
- reservations
- booking-com
- stripe
- sendgrid
capability:
exposes:
- type: mcp
namespace: reservations
port: 8080
tools:
- name: modify-reservation
description: "Modify a reservation with new dates, adjust payment, and send confirmation."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation identifier."
- name: new_checkin
in: body
type: string
description: "New check-in date."
- name: new_checkout
in: body
type: string
description: "New check-out date."
steps:
- name: check-availability
type: call
call: "booking-connectivity.check-modification"
with:
reservation_id: "{{reservation_id}}"
checkin: "{{new_checkin}}"
checkout: "{{new_checkout}}"
- name: adjust-payment
type: call
call: "stripe.update-payment-intent"
with:
payment_intent_id: "{{check-availability.payment_intent_id}}"
amount: "{{check-availability.new_total_cents}}"
- name: confirm-modification
type: call
call: "booking-connectivity.confirm-modification"
with:
reservation_id: "{{reservation_id}}"
modification_id: "{{check-availability.modification_id}}"
- name: send-confirmation
type: call
call: "sendgrid.send-email"
with:
to: "{{check-availability.guest_email}}"
subject: "Reservation Modified - {{reservation_id}}"
body: "Your reservation has been updated. New dates: {{new_checkin}} to {{new_checkout}}. New total: {{check-availability.new_total_display}}."
consumes:
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: modifications
path: "/reservations/{{reservation_id}}/modify"
inputParameters:
- name: reservation_id
in: path
operations:
- name: check-modification
method: POST
- name: confirm-modification
method: PUT
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents/{{payment_intent_id}}"
inputParameters:
- name: payment_intent_id
in: path
operations:
- name: update-payment-intent
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Retrieves a hotel partner's Salesforce account record including contract status, tier, and account manager details.
naftiko: "0.5"
info:
label: "Salesforce Partner Account Lookup"
description: "Retrieves a hotel partner's Salesforce account record including contract status, tier, and account manager details."
tags:
- partner-management
- salesforce
- crm
capability:
exposes:
- type: mcp
namespace: partner-crm
port: 8080
tools:
- name: get-partner-account
description: "Look up a hotel partner's Salesforce account by account ID."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account identifier."
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
Rolls out seasonal pricing by fetching demand forecasts from Snowflake, updating rates in the inventory system, and posting a summary to Slack.
naftiko: "0.5"
info:
label: "Seasonal Pricing Rollout"
description: "Rolls out seasonal pricing by fetching demand forecasts from Snowflake, updating rates in the inventory system, and posting a summary to Slack."
tags:
- pricing
- snowflake
- booking-com
- slack
capability:
exposes:
- type: mcp
namespace: pricing
port: 8080
tools:
- name: rollout-seasonal-pricing
description: "Roll out seasonal pricing based on demand forecasts."
inputParameters:
- name: region
in: body
type: string
description: "Region code."
- name: season
in: body
type: string
description: "Season identifier."
steps:
- name: fetch-forecast
type: call
call: "snowflake.execute-query"
with:
query: "SELECT property_id, forecast_demand, current_rate FROM demand_forecasts WHERE region='{{region}}' AND season='{{season}}'"
- name: update-rates
type: call
call: "booking-connectivity.batch-update-rates"
with:
region: "{{region}}"
rate_adjustments: "{{fetch-forecast.results}}"
- name: post-summary
type: call
call: "slack.post-message"
with:
channel: "#pricing-updates"
text: "Seasonal pricing rollout complete for {{region}} ({{season}}). {{update-rates.updated_count}} properties updated."
consumes:
- type: http
namespace: snowflake
baseUri: "https://booking.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: queries
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: booking-connectivity
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: rates
path: "/rates/batch"
operations:
- name: batch-update-rates
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Tracks a user event in Segment analytics for booking funnel analysis.
naftiko: "0.5"
info:
label: "Segment User Event Tracker"
description: "Tracks a user event in Segment analytics for booking funnel analysis."
tags:
- analytics
- segment
- tracking
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: track-event
description: "Track a user event in Segment."
inputParameters:
- name: user_id
in: body
type: string
description: "User identifier."
- name: event
in: body
type: string
description: "Event name."
- name: properties
in: body
type: string
description: "JSON string of event properties."
call: "segment.track"
with:
userId: "{{user_id}}"
event: "{{event}}"
properties: "{{properties}}"
consumes:
- type: http
namespace: segment
baseUri: "https://api.segment.io/v1"
authentication:
type: basic
username: "$secrets.segment_write_key"
password: ""
resources:
- name: track
path: "/track"
operations:
- name: track
method: POST
Checks the delivery status of a transactional email sent via SendGrid by message ID.
naftiko: "0.5"
info:
label: "SendGrid Email Status"
description: "Checks the delivery status of a transactional email sent via SendGrid by message ID."
tags:
- communications
- sendgrid
capability:
exposes:
- type: mcp
namespace: communications
port: 8080
tools:
- name: get-email-status
description: "Check delivery status of a SendGrid email by message ID."
inputParameters:
- name: message_id
in: body
type: string
description: "SendGrid message identifier."
call: "sendgrid.get-message"
with:
message_id: "{{message_id}}"
consumes:
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: messages
path: "/messages/{{message_id}}"
inputParameters:
- name: message_id
in: path
operations:
- name: get-message
method: GET
Sends a message to a specified Slack channel using the Slack Web API.
naftiko: "0.5"
info:
label: "Slack Notification Sender"
description: "Sends a message to a specified Slack channel using the Slack Web API."
tags:
- notifications
- slack
capability:
exposes:
- type: mcp
namespace: notifications
port: 8080
tools:
- name: send-slack-message
description: "Post a message to a Slack channel."
inputParameters:
- name: channel
in: body
type: string
description: "Slack channel name or ID."
- name: text
in: body
type: string
description: "Message text."
call: "slack.post-message"
with:
channel: "{{channel}}"
text: "{{text}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Executes a SQL query against the Snowflake data warehouse and pushes the results summary to a Slack channel for team visibility.
naftiko: "0.5"
info:
label: "Snowflake Analytics Query"
description: "Executes a SQL query against the Snowflake data warehouse and pushes the results summary to a Slack channel for team visibility."
tags:
- analytics
- snowflake
- data-warehouse
- slack
capability:
exposes:
- type: mcp
namespace: data-warehouse
port: 8080
tools:
- name: run-analytics-query
description: "Execute a SQL query on Snowflake and post results summary to Slack."
inputParameters:
- name: statement
in: body
type: string
description: "SQL statement to execute."
- name: warehouse
in: body
type: string
description: "Snowflake warehouse name."
- name: database
in: body
type: string
description: "Snowflake database name."
- name: notify_channel
in: body
type: string
description: "Slack channel to post results summary."
steps:
- name: execute-query
type: call
call: "snowflake.execute-statement"
with:
statement: "{{statement}}"
warehouse: "{{warehouse}}"
database: "{{database}}"
- name: post-results
type: call
call: "slack.post-message"
with:
channel: "{{notify_channel}}"
text: "Snowflake query completed. Rows returned: {{execute-query.row_count}}. Database: {{database}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://bookingholdings.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves charge details from Stripe by charge ID, including amount, status, and payment method.
naftiko: "0.5"
info:
label: "Stripe Charge Lookup"
description: "Retrieves charge details from Stripe by charge ID, including amount, status, and payment method."
tags:
- payments
- stripe
capability:
exposes:
- type: mcp
namespace: payments
port: 8080
tools:
- name: get-charge
description: "Get charge details from Stripe by charge ID."
inputParameters:
- name: charge_id
in: body
type: string
description: "Stripe charge identifier."
call: "stripe.get-charge"
with:
charge_id: "{{charge_id}}"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: charges
path: "/charges/{{charge_id}}"
inputParameters:
- name: charge_id
in: path
operations:
- name: get-charge
method: GET
Issues a refund for a cancelled reservation through the Stripe payments API and logs the refund event in Segment analytics.
naftiko: "0.5"
info:
label: "Stripe Payment Refund"
description: "Issues a refund for a cancelled reservation through the Stripe payments API and logs the refund event in Segment analytics."
tags:
- payments
- stripe
- refunds
- segment
capability:
exposes:
- type: mcp
namespace: payments
port: 8080
tools:
- name: issue-refund
description: "Issue a Stripe refund for a payment intent and log the event in Segment."
inputParameters:
- name: payment_intent_id
in: body
type: string
description: "Stripe payment intent ID."
- name: amount
in: body
type: integer
description: "Refund amount in cents. Omit for full refund."
- name: reason
in: body
type: string
description: "Refund reason: duplicate, fraudulent, or requested_by_customer."
- name: guest_id
in: body
type: string
description: "Guest identifier for analytics tracking."
steps:
- name: process-refund
type: call
call: "stripe.create-refund"
with:
payment_intent: "{{payment_intent_id}}"
amount: "{{amount}}"
reason: "{{reason}}"
- name: track-refund
type: call
call: "segment.track"
with:
userId: "{{guest_id}}"
event: "Refund Processed"
properties: "{\"payment_intent\":\"{{payment_intent_id}}\",\"amount\":{{amount}},\"reason\":\"{{reason}}\",\"refund_id\":\"{{process-refund.id}}\"}"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: refunds
path: "/refunds"
operations:
- name: create-refund
method: POST
- type: http
namespace: segment
baseUri: "https://api.segment.io/v1"
authentication:
type: basic
username: "$secrets.segment_write_key"
password: ""
resources:
- name: track
path: "/track"
operations:
- name: track
method: POST
Retrieves the status of a Stripe refund by refund ID, returning amount, status, reason, and receipt URL.
naftiko: "0.5"
info:
label: "Stripe Refund Status"
description: "Retrieves the status of a Stripe refund by refund ID, returning amount, status, reason, and receipt URL."
tags:
- payments
- stripe
capability:
exposes:
- type: mcp
namespace: stripe-refunds
port: 8080
tools:
- name: get-refund-status
description: "Look up a Stripe refund by refund ID."
inputParameters:
- name: refund_id
in: body
type: string
description: "The Stripe refund identifier."
call: "stripe-refunds.get-refund"
with:
refund_id: "{{refund_id}}"
consumes:
- type: http
namespace: stripe-refunds
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: refunds
path: "/refunds/{{refund_id}}"
inputParameters:
- name: refund_id
in: path
operations:
- name: get-refund
method: GET
Generates an embed URL for a Tableau dashboard view, authenticated via trusted ticket.
naftiko: "0.5"
info:
label: "Tableau Report Embed"
description: "Generates an embed URL for a Tableau dashboard view, authenticated via trusted ticket."
tags:
- analytics
- tableau
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-embed-url
description: "Generate an embed URL for a Tableau dashboard."
inputParameters:
- name: view_name
in: body
type: string
description: "Tableau view name."
call: "tableau-api.get-trusted-ticket"
with:
username: "{{view_name}}"
consumes:
- type: http
namespace: tableau-api
baseUri: "https://tableau.booking.com"
authentication:
type: bearer
token: "$secrets.tableau_admin_token"
resources:
- name: trusted
path: "/trusted"
operations:
- name: get-trusted-ticket
method: POST
Translates property descriptions or guest messages using the Google Cloud Translation API.
naftiko: "0.5"
info:
label: "Translation Request via Google Translate"
description: "Translates property descriptions or guest messages using the Google Cloud Translation API."
tags:
- localization
- google-translate
- content
capability:
exposes:
- type: mcp
namespace: translation
port: 8080
tools:
- name: translate-text
description: "Translate text using Google Cloud Translation API."
inputParameters:
- name: text
in: body
type: string
description: "Text to translate."
- name: target_language
in: body
type: string
description: "Target language code (e.g. fr, de, ja)."
- name: source_language
in: body
type: string
description: "Source language code. Omit for auto-detect."
call: "google-translate.translate"
with:
q: "{{text}}"
target: "{{target_language}}"
source: "{{source_language}}"
consumes:
- type: http
namespace: google-translate
baseUri: "https://translation.googleapis.com/language/translate/v2"
authentication:
type: apiKey
name: "key"
in: query
value: "$secrets.google_translate_api_key"
resources:
- name: translations
path: ""
operations:
- name: translate
method: POST
When a booking is confirmed, offers travel insurance, processes the premium via Stripe, attaches the policy to the reservation, and sends details via SendGrid.
naftiko: "0.5"
info:
label: "Travel Insurance Attachment Workflow"
description: "When a booking is confirmed, offers travel insurance, processes the premium via Stripe, attaches the policy to the reservation, and sends details via SendGrid."
tags:
- insurance
- stripe
- sendgrid
- booking-com
capability:
exposes:
- type: mcp
namespace: travel-insurance
port: 8080
tools:
- name: attach-insurance
description: "Process and attach travel insurance to a booking."
inputParameters:
- name: reservation_id
in: body
type: string
description: "Reservation ID."
- name: guest_email
in: body
type: string
description: "Guest email."
- name: payment_method_id
in: body
type: string
description: "Stripe payment method ID."
steps:
- name: get-reservation
type: call
call: "booking-api.get-reservation"
with:
reservation_id: "{{reservation_id}}"
- name: charge-premium
type: call
call: "stripe.create-payment-intent"
with:
amount: "{{get-reservation.insurance_premium_cents}}"
currency: "{{get-reservation.currency}}"
payment_method: "{{payment_method_id}}"
confirm: true
- name: attach-policy
type: call
call: "booking-api.attach-insurance"
with:
reservation_id: "{{reservation_id}}"
payment_ref: "{{charge-premium.id}}"
- name: send-policy
type: call
call: "sendgrid.send-email"
with:
to: "{{guest_email}}"
subject: "Travel Insurance — Reservation {{reservation_id}}"
body: "Your travel insurance policy is attached. Policy: {{attach-policy.policy_number}}. Coverage: {{get-reservation.insurance_coverage}}."
consumes:
- type: http
namespace: booking-api
baseUri: "https://supply-api.booking.com/v3"
authentication:
type: bearer
token: "$secrets.booking_connectivity_token"
resources:
- name: reservations
path: "/reservations/{{reservation_id}}"
inputParameters:
- name: reservation_id
in: path
operations:
- name: get-reservation
method: GET
- name: insurance
path: "/reservations/{{reservation_id}}/insurance"
inputParameters:
- name: reservation_id
in: path
operations:
- name: attach-insurance
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payment-intents
path: "/payment_intents"
operations:
- name: create-payment-intent
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Sends an SMS notification to a guest via Twilio for check-in reminders or booking updates.
naftiko: "0.5"
info:
label: "Twilio SMS Guest Notification"
description: "Sends an SMS notification to a guest via Twilio for check-in reminders or booking updates."
tags:
- notifications
- twilio
- sms
capability:
exposes:
- type: mcp
namespace: sms-notifications
port: 8080
tools:
- name: send-guest-sms
description: "Send an SMS to a guest via Twilio."
inputParameters:
- name: phone_number
in: body
type: string
description: "Guest phone number in E.164 format."
- name: message
in: body
type: string
description: "SMS message body."
call: "twilio.send-sms"
with:
To: "{{phone_number}}"
From: "$secrets.twilio_phone_number"
Body: "{{message}}"
consumes:
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Messages.json"
operations:
- name: send-sms
method: POST
Retrieves employee details from Workday HCM and syncs their profile to the Salesforce internal contact record.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Retrieves employee details from Workday HCM and syncs their profile to the Salesforce internal contact record."
tags:
- hr
- workday
- salesforce
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-employee
description: "Look up an employee in Workday and sync profile to Salesforce."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee identifier."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: sync-contact
type: call
call: "salesforce.upsert-contact"
with:
employee_id: "{{employee_id}}"
name: "{{get-worker.full_name}}"
email: "{{get-worker.work_email}}"
department: "{{get-worker.department}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: salesforce
baseUri: "https://bookingholdings.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact/EmployeeId__c/{{employee_id}}"
inputParameters:
- name: employee_id
in: path
operations:
- name: upsert-contact
method: PATCH
Retrieves the current headcount report for a specified department from Workday HCM.
naftiko: "0.5"
info:
label: "Workday Headcount Report"
description: "Retrieves the current headcount report for a specified department from Workday HCM."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-headcount
description: "Get department headcount report from Workday."
inputParameters:
- name: department_id
in: body
type: string
description: "Workday department identifier."
call: "workday-api.get-headcount"
with:
department_id: "{{department_id}}"
consumes:
- type: http
namespace: workday-api
baseUri: "https://wd5-services.booking.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: reports
path: "/reports/headcount"
operations:
- name: get-headcount
method: GET
Creates a new Zendesk support ticket for guest inquiries.
naftiko: "0.5"
info:
label: "Zendesk Ticket Creator"
description: "Creates a new Zendesk support ticket for guest inquiries."
tags:
- support
- zendesk
capability:
exposes:
- type: mcp
namespace: support
port: 8080
tools:
- name: create-support-ticket
description: "Create a new Zendesk support ticket."
inputParameters:
- name: subject
in: body
type: string
description: "Ticket subject."
- name: description
in: body
type: string
description: "Ticket description."
- name: requester_email
in: body
type: string
description: "Requester email address."
- name: priority
in: body
type: string
description: "Ticket priority: low, normal, high, urgent."
call: "zendesk.create-ticket"
with:
subject: "{{subject}}"
description: "{{description}}"
requester_email: "{{requester_email}}"
priority: "{{priority}}"
consumes:
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets"
operations:
- name: create-ticket
method: POST
Retrieves a Zendesk support ticket by ticket ID, returning subject, status, assignee, priority, and conversation history.
naftiko: "0.5"
info:
label: "Zendesk Ticket Lookup"
description: "Retrieves a Zendesk support ticket by ticket ID, returning subject, status, assignee, priority, and conversation history."
tags:
- support
- zendesk
capability:
exposes:
- type: mcp
namespace: zendesk
port: 8080
tools:
- name: get-ticket
description: "Look up a Zendesk support ticket by ID."
inputParameters:
- name: ticket_id
in: body
type: string
description: "The Zendesk ticket identifier."
call: "zendesk.get-ticket"
with:
ticket_id: "{{ticket_id}}"
consumes:
- type: http
namespace: zendesk
baseUri: "https://bookingholdings.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: get-ticket
method: GET