Booking Holdings Capabilities

Naftiko 0.5 capability definitions for Booking Holdings - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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