Hyatt Capabilities

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

Sort
Expand

Retrieves booking funnel conversion data from Adobe Analytics for the Hyatt.com website, returning drop-off rates at each step.

naftiko: "0.5"
info:
  label: "Adobe Analytics Booking Funnel Reporter"
  description: "Retrieves booking funnel conversion data from Adobe Analytics for the Hyatt.com website, returning drop-off rates at each step."
  tags:
    - marketing
    - analytics
    - adobe-analytics
capability:
  exposes:
    - type: mcp
      namespace: booking-funnel
      port: 8080
      tools:
        - name: get-funnel-data
          description: "Retrieve booking funnel metrics from Adobe Analytics."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "The Adobe Analytics report suite ID."
            - name: date_range
              in: body
              type: string
              description: "Date range in YYYY-MM-DD/YYYY-MM-DD format."
          call: "adobe-analytics.get-report"
          with:
            rsid: "{{report_suite_id}}"
            date_range: "{{date_range}}"
          outputParameters:
            - name: search_to_select
              type: string
              mapping: "$.report.data.rows[0].value"
            - name: select_to_checkout
              type: string
              mapping: "$.report.data.rows[1].value"
            - name: checkout_to_confirm
              type: string
              mapping: "$.report.data.rows[2].value"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{rsid}}/reports"
          inputParameters:
            - name: rsid
              in: path
          operations:
            - name: get-report
              method: POST

Pulls approved time entries from Workday and syncs them to ADP for payroll processing, then confirms the sync via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Integration Sync"
  description: "Pulls approved time entries from Workday and syncs them to ADP for payroll processing, then confirms the sync via Microsoft Teams."
  tags:
    - hr
    - payroll
    - workday
    - adp
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-sync
      port: 8080
      tools:
        - name: sync-time-to-payroll
          description: "Sync Workday time entries to ADP payroll and confirm via Teams."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period identifier (e.g., 2026-03-15)."
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
          steps:
            - name: get-time-entries
              type: call
              call: "workday.get-time-entries"
              with:
                pay_period: "{{pay_period}}"
                location: "{{property_code}}"
            - name: submit-to-adp
              type: call
              call: "adp.submit-payroll"
              with:
                pay_period: "{{pay_period}}"
                entries: "{{get-time-entries.entries}}"
            - name: confirm-sync
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hr_payroll"
                text: "Payroll sync complete for {{property_code}}, period {{pay_period}}: {{submit-to-adp.employee_count}} employees processed."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-entries
          path: "/time/entries"
          inputParameters:
            - name: pay_period
              in: query
            - name: location
              in: query
          operations:
            - name: get-time-entries
              method: GET
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/payroll/payroll-processing"
          operations:
            - name: submit-payroll
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the status of a guest service request from the ALICE hospitality operations platform.

naftiko: "0.5"
info:
  label: "ALICE Guest Request Status Lookup"
  description: "Retrieves the status of a guest service request from the ALICE hospitality operations platform."
  tags:
    - guest-services
    - operations
    - alice
capability:
  exposes:
    - type: mcp
      namespace: guest-requests
      port: 8080
      tools:
        - name: get-request-status
          description: "Look up a guest service request status."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The ALICE request ID."
          call: "alice.get-request"
          with:
            id: "{{request_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.request.status"
            - name: assigned_to
              type: string
              mapping: "$.request.assignee"
            - name: room_number
              type: string
              mapping: "$.request.roomNumber"
  consumes:
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: requests
          path: "/requests/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-request
              method: GET

Retrieves a Hyatt employee's Azure AD profile, returning display name, job title, department, and office location.

naftiko: "0.5"
info:
  label: "Azure Active Directory User Lookup"
  description: "Retrieves a Hyatt employee's Azure AD profile, returning display name, job title, department, and office location."
  tags:
    - it-operations
    - identity
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-ad-user
          description: "Look up an employee in Azure Active Directory by UPN."
          inputParameters:
            - name: user_upn
              in: body
              type: string
              description: "The user principal name (email) of the employee."
          call: "azuread.get-user"
          with:
            user_upn: "{{user_upn}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: job_title
              type: string
              mapping: "$.jobTitle"
            - name: department
              type: string
              mapping: "$.department"
            - name: office_location
              type: string
              mapping: "$.officeLocation"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_upn}}"
          inputParameters:
            - name: user_upn
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves the latest build status from Azure DevOps for a Hyatt application pipeline, returning build result, duration, and triggered-by information.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Checker"
  description: "Retrieves the latest build status from Azure DevOps for a Hyatt application pipeline, returning build result, duration, and triggered-by information."
  tags:
    - it-operations
    - cicd
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: build-status
      port: 8080
      tools:
        - name: get-build-status
          description: "Check the latest Azure DevOps build status for a pipeline."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The pipeline definition ID."
          call: "azdevops.get-latest-build"
          with:
            project: "{{project}}"
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: triggered_by
              type: string
              mapping: "$.value[0].requestedBy.displayName"
  consumes:
    - type: http
      namespace: azdevops
      baseUri: "https://dev.azure.com/hyatt"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdevops_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds"
          inputParameters:
            - name: project
              in: path
            - name: definitions
              in: query
              value: "{{pipeline_id}}"
            - name: $top
              in: query
              value: "1"
            - name: api-version
              in: query
              value: "7.0"
          operations:
            - name: get-latest-build
              method: GET

Processes banquet event orders by creating the BEO in the catering system, generating a purchase order in SAP for food and beverage, and notifying the events team via Slack.

naftiko: "0.5"
info:
  label: "Banquet Event Order Processor"
  description: "Processes banquet event orders by creating the BEO in the catering system, generating a purchase order in SAP for food and beverage, and notifying the events team via Slack."
  tags:
    - events
    - catering
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: banquet-orders
      port: 8080
      tools:
        - name: process-beo
          description: "Process a banquet event order."
          inputParameters:
            - name: event_name
              in: body
              type: string
              description: "The event name."
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: guest_count
              in: body
              type: integer
              description: "Expected guest count."
            - name: menu_code
              in: body
              type: string
              description: "Selected menu package code."
          steps:
            - name: create-beo
              type: call
              call: "catering.create-beo"
              with:
                event_name: "{{event_name}}"
                property: "{{property_code}}"
                covers: "{{guest_count}}"
                menu: "{{menu_code}}"
            - name: create-fb-po
              type: call
              call: "sap.create-purchase-order"
              with:
                property: "{{property_code}}"
                category: "food_and_beverage"
                beo_ref: "{{create-beo.beo_number}}"
                covers: "{{guest_count}}"
            - name: notify-events-team
              type: call
              call: "slack.post-message"
              with:
                channel: "property-{{property_code}}-events"
                text: "New BEO: {{event_name}} ({{guest_count}} covers). BEO#: {{create-beo.beo_number}}. F&B PO: {{create-fb-po.po_number}}."
  consumes:
    - type: http
      namespace: catering
      baseUri: "https://catering.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.catering_token"
      resources:
        - name: beos
          path: "/beos"
          operations:
            - name: create-beo
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/ZMM_PO_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/PurchaseOrderSet"
          operations:
            - name: create-purchase-order
              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

Uploads a property compliance document to the designated Box folder and returns the shared link for audit purposes.

naftiko: "0.5"
info:
  label: "Box Document Archive Uploader"
  description: "Uploads a property compliance document to the designated Box folder and returns the shared link for audit purposes."
  tags:
    - documents
    - compliance
    - box
capability:
  exposes:
    - type: mcp
      namespace: document-archive
      port: 8080
      tools:
        - name: upload-to-box
          description: "Upload a document to Box and return a shared link."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "The Box folder ID for the property's compliance documents."
            - name: file_name
              in: body
              type: string
              description: "Name of the file to upload."
            - name: file_content
              in: body
              type: string
              description: "Base64-encoded file content."
          call: "box.upload-file"
          with:
            folder_id: "{{folder_id}}"
            file_name: "{{file_name}}"
            content: "{{file_content}}"
          outputParameters:
            - name: file_id
              type: string
              mapping: "$.entries[0].id"
            - name: shared_link
              type: string
              mapping: "$.entries[0].shared_link.url"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://upload.box.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST

Queries Cloudflare for recent WAF events targeting Hyatt web properties, returning blocked requests, attack types, and source IPs.

naftiko: "0.5"
info:
  label: "Cloudflare WAF Event Monitor"
  description: "Queries Cloudflare for recent WAF events targeting Hyatt web properties, returning blocked requests, attack types, and source IPs."
  tags:
    - security
    - it-operations
    - cloudflare
capability:
  exposes:
    - type: mcp
      namespace: waf-monitoring
      port: 8080
      tools:
        - name: get-waf-events
          description: "Retrieve recent Cloudflare WAF events for Hyatt domains."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone ID."
          call: "cloudflare.get-firewall-events"
          with:
            zone_id: "{{zone_id}}"
          outputParameters:
            - name: events
              type: string
              mapping: "$.result"
            - name: total_blocked
              type: string
              mapping: "$.result_info.total_count"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: firewall-events
          path: "/zones/{{zone_id}}/security/events"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: get-firewall-events
              method: GET

When a SAP Concur expense report is submitted by a hotel employee, retrieves the report details and notifies the approver via Microsoft Teams with a link to review.

naftiko: "0.5"
info:
  label: "Concur Expense Report Approval Notifier"
  description: "When a SAP Concur expense report is submitted by a hotel employee, retrieves the report details and notifies the approver via Microsoft Teams with a link to review."
  tags:
    - finance
    - expenses
    - sap-concur
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: notify-expense-approval
          description: "Fetch Concur expense report and notify the approver via Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-report.approver_email}}"
                text: "Expense report pending: {{get-report.employee_name}} submitted ${{get-report.total_amount}} ({{get-report.report_name}}). Review: {{get-report.approval_url}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Creates a new knowledge base article in Confluence for property operations procedures and returns the page URL.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Article Creator"
  description: "Creates a new knowledge base article in Confluence for property operations procedures and returns the page URL."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: create-kb-article
          description: "Create a Confluence knowledge base article."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "The Confluence space key."
            - name: title
              in: body
              type: string
              description: "Article title."
            - name: body
              in: body
              type: string
              description: "Article body content in HTML."
          call: "confluence.create-page"
          with:
            space_key: "{{space_key}}"
            title: "{{title}}"
            body: "{{body}}"
          outputParameters:
            - name: page_url
              type: string
              mapping: "$._links.webui"
            - name: page_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://hyatt.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Sets up new corporate travel accounts by creating a Salesforce account, provisioning negotiated rates in Opera PMS, and sending welcome materials via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Corporate Travel Account Setup Orchestrator"
  description: "Sets up new corporate travel accounts by creating a Salesforce account, provisioning negotiated rates in Opera PMS, and sending welcome materials via Microsoft Outlook."
  tags:
    - sales
    - corporate-travel
    - salesforce
    - oracle-cloud
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: corporate-accounts
      port: 8080
      tools:
        - name: setup-corporate-account
          description: "Set up a new corporate travel account."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "Company name."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact email."
            - name: negotiated_rate
              in: body
              type: number
              description: "Negotiated room rate."
          steps:
            - name: create-sf-account
              type: call
              call: "salesforce.create-account"
              with:
                name: "{{company_name}}"
                type: "corporate_travel"
                contact_email: "{{contact_email}}"
            - name: provision-rates
              type: call
              call: "opera.create-rate-plan"
              with:
                company_name: "{{company_name}}"
                rate: "{{negotiated_rate}}"
                sf_account_id: "{{create-sf-account.id}}"
            - name: send-welcome
              type: call
              call: "outlook.send-email"
              with:
                to: "{{contact_email}}"
                subject: "Welcome to Hyatt Corporate Travel Program"
                body: "{{company_name}}, your corporate travel account is active. Account ID: {{create-sf-account.id}}. Rate plan: {{provision-rates.rate_code}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.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: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: rate-plans
          path: "/rate-plans"
          operations:
            - name: create-rate-plan
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Pulls event attendee lists from Cvent and syncs them to a Google Sheet for property-level event coordination.

naftiko: "0.5"
info:
  label: "Cvent Event Attendee Sync"
  description: "Pulls event attendee lists from Cvent and syncs them to a Google Sheet for property-level event coordination."
  tags:
    - events
    - cvent
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: event-attendees
      port: 8080
      tools:
        - name: sync-attendees
          description: "Pull Cvent attendees and sync to Google Sheets."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The Cvent event ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID."
          steps:
            - name: get-attendees
              type: call
              call: "cvent.get-attendees"
              with:
                event_id: "{{event_id}}"
            - name: write-to-sheet
              type: call
              call: "gsheets.update-range"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "Attendees!A2:D"
                values: "{{get-attendees.attendee_list}}"
  consumes:
    - type: http
      namespace: cvent
      baseUri: "https://api.cvent.com/v1"
      authentication:
        type: bearer
        token: "$secrets.cvent_token"
      resources:
        - name: attendees
          path: "/events/{{event_id}}/attendees"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-attendees
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-range
              method: PUT

Queries Datadog for infrastructure health metrics of a Hyatt property's on-premise systems, returning CPU utilization, memory usage, and active alerts.

naftiko: "0.5"
info:
  label: "Datadog Property Infrastructure Monitor"
  description: "Queries Datadog for infrastructure health metrics of a Hyatt property's on-premise systems, returning CPU utilization, memory usage, and active alerts."
  tags:
    - it-operations
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-property-health
          description: "Retrieve infrastructure health metrics for a property from Datadog."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
          call: "datadog.query-metrics"
          with:
            query: "avg:system.cpu.user{property:{{property_code}}}"
          outputParameters:
            - name: cpu_utilization
              type: string
              mapping: "$.series[0].pointlist[-1][1]"
            - name: active_alerts
              type: string
              mapping: "$.alerts_count"
  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

Retrieves current occupancy from OPERA, checks competitor rates via a rate-shopping API, and updates room rates in OPERA to optimize RevPAR.

naftiko: "0.5"
info:
  label: "Dynamic Pricing Rate Adjuster"
  description: "Retrieves current occupancy from OPERA, checks competitor rates via a rate-shopping API, and updates room rates in OPERA to optimize RevPAR."
  tags:
    - revenue
    - pricing
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: dynamic-pricing
      port: 8080
      tools:
        - name: adjust-rates
          description: "Evaluate occupancy and competitor data and adjust room rates for a property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: rate_date
              in: body
              type: string
              description: "Target date for rate adjustment in YYYY-MM-DD format."
          steps:
            - name: get-occupancy
              type: call
              call: "opera.get-occupancy"
              with:
                property_code: "{{property_code}}"
                date: "{{rate_date}}"
            - name: get-comp-rates
              type: call
              call: "rateshopper.get-rates"
              with:
                market: "{{property_code}}"
                date: "{{rate_date}}"
            - name: update-rate
              type: call
              call: "opera.update-rate"
              with:
                property_code: "{{property_code}}"
                date: "{{rate_date}}"
                occupancy: "{{get-occupancy.occupancy_pct}}"
                comp_avg_rate: "{{get-comp-rates.average_rate}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: occupancy
          path: "/properties/{{property_code}}/occupancy"
          inputParameters:
            - name: property_code
              in: path
            - name: date
              in: query
          operations:
            - name: get-occupancy
              method: GET
        - name: rates
          path: "/properties/{{property_code}}/rates"
          inputParameters:
            - name: property_code
              in: path
          operations:
            - name: update-rate
              method: PUT
    - type: http
      namespace: rateshopper
      baseUri: "https://api.rateshopper.hyatt.com/v1"
      authentication:
        type: bearer
        token: "$secrets.rateshopper_token"
      resources:
        - name: market-rates
          path: "/markets/{{market}}/rates"
          inputParameters:
            - name: market
              in: path
            - name: date
              in: query
          operations:
            - name: get-rates
              method: GET

Retrieves real user monitoring data from Dynatrace for the Hyatt booking website, returning page load times, user actions, and error counts.

naftiko: "0.5"
info:
  label: "Dynatrace Real User Monitoring Retriever"
  description: "Retrieves real user monitoring data from Dynatrace for the Hyatt booking website, returning page load times, user actions, and error counts."
  tags:
    - it-operations
    - monitoring
    - dynatrace
capability:
  exposes:
    - type: mcp
      namespace: rum-monitoring
      port: 8080
      tools:
        - name: get-rum-data
          description: "Retrieve real user monitoring metrics from Dynatrace."
          inputParameters:
            - name: application_id
              in: body
              type: string
              description: "The Dynatrace application ID."
          call: "dynatrace.get-user-actions"
          with:
            application_id: "{{application_id}}"
          outputParameters:
            - name: avg_load_time
              type: string
              mapping: "$.userActions.averageLoadTime"
            - name: total_actions
              type: string
              mapping: "$.userActions.totalCount"
            - name: error_count
              type: string
              mapping: "$.userActions.errorCount"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://hyatt.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: user-actions
          path: "/userSessionQueryLanguage/table"
          inputParameters:
            - name: query
              in: query
              value: "SELECT AVG(duration), COUNT(*), COUNT(IF(type='ERROR',1)) FROM usersession WHERE applicationId='{{application_id}}'"
          operations:
            - name: get-user-actions
              method: GET

Retrieves an employee's schedule from Workday and returns their upcoming shifts, department, and property assignment.

naftiko: "0.5"
info:
  label: "Employee Shift Scheduler"
  description: "Retrieves an employee's schedule from Workday and returns their upcoming shifts, department, and property assignment."
  tags:
    - hr
    - scheduling
    - workday
capability:
  exposes:
    - type: mcp
      namespace: shift-scheduling
      port: 8080
      tools:
        - name: get-employee-schedule
          description: "Retrieve upcoming shift schedule for a hotel employee by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-schedule"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: shifts
              type: string
              mapping: "$.scheduleEntries"
            - name: department
              type: string
              mapping: "$.department"
            - name: property
              type: string
              mapping: "$.location"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: schedules
          path: "/workers/{{worker_id}}/schedule"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-schedule
              method: GET

Pulls campaign performance data from Facebook Ads for Hyatt property marketing campaigns, returning impressions, clicks, spend, and ROAS.

naftiko: "0.5"
info:
  label: "Facebook Marketing Campaign Reporter"
  description: "Pulls campaign performance data from Facebook Ads for Hyatt property marketing campaigns, returning impressions, clicks, spend, and ROAS."
  tags:
    - marketing
    - advertising
    - facebook
capability:
  exposes:
    - type: mcp
      namespace: fb-campaigns
      port: 8080
      tools:
        - name: get-campaign-performance
          description: "Retrieve Facebook Ads campaign performance metrics."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Facebook Ads campaign ID."
          call: "facebook.get-campaign-insights"
          with:
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: impressions
              type: string
              mapping: "$.data[0].impressions"
            - name: clicks
              type: string
              mapping: "$.data[0].clicks"
            - name: spend
              type: string
              mapping: "$.data[0].spend"
            - name: roas
              type: string
              mapping: "$.data[0].purchase_roas[0].value"
  consumes:
    - type: http
      namespace: facebook
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.facebook_ads_token"
      resources:
        - name: campaign-insights
          path: "/{{campaign_id}}/insights"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-insights
              method: GET

When food and beverage inventory drops below threshold in the POS system, generates a SAP purchase requisition, emails the supplier via Microsoft Outlook, and notifies the F&B director via Teams.

naftiko: "0.5"
info:
  label: "F&B Inventory Reorder Orchestrator"
  description: "When food and beverage inventory drops below threshold in the POS system, generates a SAP purchase requisition, emails the supplier via Microsoft Outlook, and notifies the F&B director via Teams."
  tags:
    - procurement
    - food-and-beverage
    - oracle
    - sap
    - microsoft-outlook
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fb-reorder
      port: 8080
      tools:
        - name: trigger-reorder
          description: "Trigger a food and beverage reorder workflow across SAP, Outlook, and Teams."
          inputParameters:
            - name: item_code
              in: body
              type: string
              description: "The inventory item code."
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: quantity_needed
              in: body
              type: string
              description: "Quantity to reorder."
          steps:
            - name: get-item-details
              type: call
              call: "opera.get-inventory-item"
              with:
                item_code: "{{item_code}}"
                property_code: "{{property_code}}"
            - name: create-pr
              type: call
              call: "sap.create-purchase-requisition"
              with:
                material: "{{item_code}}"
                quantity: "{{quantity_needed}}"
                plant: "{{property_code}}"
                vendor: "{{get-item-details.preferred_vendor}}"
            - name: email-supplier
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-item-details.vendor_email}}"
                subject: "Reorder Request: {{get-item-details.item_name}} for {{property_code}}"
                body: "Please supply {{quantity_needed}} units of {{get-item-details.item_name}}. PR: {{create-pr.pr_number}}"
            - name: notify-director
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fb_operations_{{property_code}}"
                text: "Reorder initiated: {{get-item-details.item_name}} x{{quantity_needed}}. PR: {{create-pr.pr_number}}. Supplier: {{get-item-details.preferred_vendor}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: inventory
          path: "/properties/{{property_code}}/inventory/{{item_code}}"
          inputParameters:
            - name: property_code
              in: path
            - name: item_code
              in: path
          operations:
            - name: get-inventory-item
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-requisitions
          path: "/A_PurchaseRequisition"
          operations:
            - name: create-purchase-requisition
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves website traffic metrics from Google Analytics for a Hyatt property's booking page, returning sessions, conversion rate, and top referral sources.

naftiko: "0.5"
info:
  label: "Google Analytics Property Traffic Reporter"
  description: "Retrieves website traffic metrics from Google Analytics for a Hyatt property's booking page, returning sessions, conversion rate, and top referral sources."
  tags:
    - marketing
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-property-traffic
          description: "Get web traffic data for a property's booking page from Google Analytics."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Google Analytics property ID."
            - name: date_range
              in: body
              type: string
              description: "Date range, e.g., last_7_days, last_30_days."
          call: "ga.get-report"
          with:
            property_id: "{{property_id}}"
            date_range: "{{date_range}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: conversion_rate
              type: string
              mapping: "$.rows[0].metricValues[1].value"
            - name: top_sources
              type: string
              mapping: "$.rows[*].dimensionValues[0].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: get-report
              method: POST

Searches for documents in the Hyatt shared Google Drive by name or keyword and returns matching file names, types, and direct links.

naftiko: "0.5"
info:
  label: "Google Drive Document Finder"
  description: "Searches for documents in the Hyatt shared Google Drive by name or keyword and returns matching file names, types, and direct links."
  tags:
    - documents
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: gdrive-search
      port: 8080
      tools:
        - name: search-documents
          description: "Search for documents in the Hyatt shared Google Drive."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Search query for file names or content."
          call: "gdrive.search-files"
          with:
            query: "{{search_query}}"
          outputParameters:
            - name: files
              type: string
              mapping: "$.files"
            - name: result_count
              type: string
              mapping: "$.files.length"
  consumes:
    - type: http
      namespace: gdrive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          inputParameters:
            - name: q
              in: query
              value: "name contains '{{query}}'"
          operations:
            - name: search-files
              method: GET

Generates driving directions from a guest's location to a Hyatt property using Google Maps Directions API.

naftiko: "0.5"
info:
  label: "Google Maps Property Directions Generator"
  description: "Generates driving directions from a guest's location to a Hyatt property using Google Maps Directions API."
  tags:
    - guest-services
    - hospitality
    - google-maps
capability:
  exposes:
    - type: mcp
      namespace: directions
      port: 8080
      tools:
        - name: get-directions-to-property
          description: "Get driving directions to a Hyatt property from a starting address."
          inputParameters:
            - name: origin
              in: body
              type: string
              description: "Starting address or coordinates."
            - name: property_address
              in: body
              type: string
              description: "Hyatt property address."
          call: "gmaps.get-directions"
          with:
            origin: "{{origin}}"
            destination: "{{property_address}}"
          outputParameters:
            - name: distance
              type: string
              mapping: "$.routes[0].legs[0].distance.text"
            - name: duration
              type: string
              mapping: "$.routes[0].legs[0].duration.text"
            - name: steps
              type: string
              mapping: "$.routes[0].legs[0].steps"
  consumes:
    - type: http
      namespace: gmaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        name: "key"
        in: query
        value: "$secrets.google_maps_api_key"
      resources:
        - name: directions
          path: "/directions/json"
          inputParameters:
            - name: origin
              in: query
            - name: destination
              in: query
          operations:
            - name: get-directions
              method: GET

Reconciles group billing by pulling folios from Opera PMS, comparing against the Salesforce contract, and generating the final invoice in SAP.

naftiko: "0.5"
info:
  label: "Group Billing Reconciliation Pipeline"
  description: "Reconciles group billing by pulling folios from Opera PMS, comparing against the Salesforce contract, and generating the final invoice in SAP."
  tags:
    - finance
    - group-bookings
    - oracle-cloud
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: group-billing
      port: 8080
      tools:
        - name: reconcile-group-billing
          description: "Reconcile group booking billing."
          inputParameters:
            - name: group_block_id
              in: body
              type: string
              description: "The group block ID in Opera."
            - name: sf_opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-group-folios
              type: call
              call: "opera.get-group-folios"
              with:
                block_id: "{{group_block_id}}"
            - name: get-contract-terms
              type: call
              call: "salesforce.get-opportunity"
              with:
                id: "{{sf_opportunity_id}}"
            - name: generate-invoice
              type: call
              call: "sap.create-invoice"
              with:
                customer: "{{get-contract-terms.Account.Name}}"
                amount: "{{get-group-folios.total_charges}}"
                contract_ref: "{{sf_opportunity_id}}"
                room_nights: "{{get-group-folios.total_room_nights}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: group-folios
          path: "/group-blocks/{{block_id}}/folios"
          inputParameters:
            - name: block_id
              in: path
          operations:
            - name: get-group-folios
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/ZFI_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/InvoiceSet"
          operations:
            - name: create-invoice
              method: POST

When a group reservation is confirmed in OPERA, creates a Cvent event shell, generates a Salesforce opportunity, and posts a summary to the sales team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Group Booking Event Coordinator"
  description: "When a group reservation is confirmed in OPERA, creates a Cvent event shell, generates a Salesforce opportunity, and posts a summary to the sales team's Microsoft Teams channel."
  tags:
    - reservations
    - events
    - oracle
    - cvent
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: group-bookings
      port: 8080
      tools:
        - name: coordinate-group-booking
          description: "Orchestrate group booking setup across OPERA, Cvent, Salesforce, and Teams."
          inputParameters:
            - name: group_block_id
              in: body
              type: string
              description: "The OPERA group block ID."
            - name: event_name
              in: body
              type: string
              description: "Name of the group event."
          steps:
            - name: get-group-block
              type: call
              call: "opera.get-group-block"
              with:
                block_id: "{{group_block_id}}"
            - name: create-cvent-event
              type: call
              call: "cvent.create-event"
              with:
                title: "{{event_name}}"
                start_date: "{{get-group-block.arrival_date}}"
                end_date: "{{get-group-block.departure_date}}"
                venue: "{{get-group-block.property_name}}"
            - name: create-opportunity
              type: call
              call: "salesforce.create-opportunity"
              with:
                name: "Group: {{event_name}} - {{get-group-block.property_name}}"
                amount: "{{get-group-block.estimated_revenue}}"
                close_date: "{{get-group-block.arrival_date}}"
            - name: notify-sales
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales_group_bookings"
                text: "New group booking: {{event_name}} at {{get-group-block.property_name}}. Rooms: {{get-group-block.room_count}}. Est. revenue: {{get-group-block.estimated_revenue}}. Cvent: {{create-cvent-event.url}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: group-blocks
          path: "/blocks/{{block_id}}"
          inputParameters:
            - name: block_id
              in: path
          operations:
            - name: get-group-block
              method: GET
    - type: http
      namespace: cvent
      baseUri: "https://api.cvent.com/v1"
      authentication:
        type: bearer
        token: "$secrets.cvent_token"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes group sales RFPs by pulling availability from Opera PMS, generating a proposal in Salesforce, and sending the response via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Group Sales RFP Response Pipeline"
  description: "Processes group sales RFPs by pulling availability from Opera PMS, generating a proposal in Salesforce, and sending the response via Microsoft Outlook."
  tags:
    - sales
    - group-bookings
    - oracle-cloud
    - salesforce
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: rfp-response
      port: 8080
      tools:
        - name: respond-to-rfp
          description: "Generate and send an RFP response for group sales."
          inputParameters:
            - name: rfp_id
              in: body
              type: string
              description: "The Cvent RFP ID."
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: dates
              in: body
              type: string
              description: "Requested dates."
            - name: room_nights
              in: body
              type: integer
              description: "Requested room nights."
          steps:
            - name: check-availability
              type: call
              call: "opera.check-group-availability"
              with:
                property: "{{property_code}}"
                dates: "{{dates}}"
                rooms_needed: "{{room_nights}}"
            - name: create-proposal
              type: call
              call: "salesforce.create-opportunity"
              with:
                name: "RFP {{rfp_id}} - {{property_code}}"
                room_nights: "{{room_nights}}"
                dates: "{{dates}}"
                available_rooms: "{{check-availability.available}}"
            - name: send-response
              type: call
              call: "outlook.send-email"
              with:
                to: "{{create-proposal.rfp_contact_email}}"
                subject: "Hyatt {{property_code}} - RFP Response"
                body: "We are pleased to propose {{check-availability.available}} rooms for your dates. Proposal ID: {{create-proposal.id}}."
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: availability
          path: "/properties/{{property}}/group-availability"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: check-group-availability
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.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: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Retrieves the check-in status of a guest reservation from Oracle Hospitality OPERA, including arrival time, room assignment, and special requests.

naftiko: "0.5"
info:
  label: "Guest Check-In Status Lookup"
  description: "Retrieves the check-in status of a guest reservation from Oracle Hospitality OPERA, including arrival time, room assignment, and special requests."
  tags:
    - reservations
    - hospitality
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: guest-checkin
      port: 8080
      tools:
        - name: get-checkin-status
          description: "Look up guest check-in status by confirmation number."
          inputParameters:
            - name: confirmation_number
              in: body
              type: string
              description: "The reservation confirmation number."
          call: "opera.get-checkin"
          with:
            confirmation_number: "{{confirmation_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.reservation.checkinStatus"
            - name: room_number
              type: string
              mapping: "$.reservation.assignedRoom"
            - name: special_requests
              type: string
              mapping: "$.reservation.specialRequests"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: checkins
          path: "/reservations/{{confirmation_number}}/checkin"
          inputParameters:
            - name: confirmation_number
              in: path
          operations:
            - name: get-checkin
              method: GET

Resolves guest complaints by logging the issue in ALICE, offering loyalty points compensation via the loyalty platform, and alerting the GM via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Guest Complaint Resolution Orchestrator"
  description: "Resolves guest complaints by logging the issue in ALICE, offering loyalty points compensation via the loyalty platform, and alerting the GM via Microsoft Teams."
  tags:
    - guest-experience
    - complaint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: complaint-resolution
      port: 8080
      tools:
        - name: resolve-complaint
          description: "Orchestrate guest complaint resolution."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: complaint_text
              in: body
              type: string
              description: "The complaint description."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: log-complaint
              type: call
              call: "alice.create-request"
              with:
                reservation: "{{reservation_id}}"
                type: "complaint"
                description: "{{complaint_text}}"
            - name: offer-compensation
              type: call
              call: "loyalty.award-points"
              with:
                reservation_id: "{{reservation_id}}"
                points: 5000
                reason: "service_recovery"
            - name: alert-gm
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-{{property_code}}-leadership"
                text: "Guest complaint for reservation {{reservation_id}}: {{complaint_text}}. ALICE ticket: {{log-complaint.request_id}}. 5000 points awarded as service recovery."
  consumes:
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: requests
          path: "/requests"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: loyalty
      baseUri: "https://loyalty.hyatt.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.loyalty_token"
      resources:
        - name: points
          path: "/members/awards"
          operations:
            - name: award-points
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Provisions digital room keys by verifying the reservation in Opera PMS, generating the key in the lock management system, and sending the key via push notification.

naftiko: "0.5"
info:
  label: "Guest Digital Key Provisioning Pipeline"
  description: "Provisions digital room keys by verifying the reservation in Opera PMS, generating the key in the lock management system, and sending the key via push notification."
  tags:
    - guest-experience
    - digital-key
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: digital-key
      port: 8080
      tools:
        - name: provision-digital-key
          description: "Provision a digital key for a guest."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: verify-reservation
              type: call
              call: "opera.get-reservation"
              with:
                property: "{{property_code}}"
                reservation: "{{reservation_id}}"
            - name: generate-key
              type: call
              call: "lock-system.create-key"
              with:
                room: "{{verify-reservation.room_number}}"
                property: "{{property_code}}"
                check_in: "{{verify-reservation.check_in}}"
                check_out: "{{verify-reservation.check_out}}"
            - name: send-key-notification
              type: call
              call: "push-service.send-notification"
              with:
                reservation_id: "{{reservation_id}}"
                title: "Your Digital Key is Ready"
                body: "Room {{verify-reservation.room_number}} is ready. Open the Hyatt app to access your digital key."
                deep_link: "hyatt://digital-key/{{generate-key.key_id}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: reservations
          path: "/properties/{{property}}/reservations/{{reservation}}"
          inputParameters:
            - name: property
              in: path
            - name: reservation
              in: path
          operations:
            - name: get-reservation
              method: GET
    - type: http
      namespace: lock-system
      baseUri: "https://locks.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.lock_system_token"
      resources:
        - name: keys
          path: "/keys"
          operations:
            - name: create-key
              method: POST
    - type: http
      namespace: push-service
      baseUri: "https://push.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.push_service_token"
      resources:
        - name: notifications
          path: "/notifications"
          operations:
            - name: send-notification
              method: POST

When a low-score guest survey arrives in Salesforce, opens a ServiceNow incident for guest recovery, notifies the GM via Microsoft Teams, and logs the case in Confluence.

naftiko: "0.5"
info:
  label: "Guest Feedback Escalation Pipeline"
  description: "When a low-score guest survey arrives in Salesforce, opens a ServiceNow incident for guest recovery, notifies the GM via Microsoft Teams, and logs the case in Confluence."
  tags:
    - guest-services
    - feedback
    - salesforce
    - servicenow
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: guest-feedback
      port: 8080
      tools:
        - name: escalate-feedback
          description: "Escalate negative guest feedback across ServiceNow, Teams, and Confluence."
          inputParameters:
            - name: survey_id
              in: body
              type: string
              description: "The Salesforce survey response ID."
          steps:
            - name: get-survey
              type: call
              call: "salesforce.get-survey"
              with:
                survey_id: "{{survey_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Guest recovery: {{get-survey.guest_name}} at {{get-survey.property_name}}"
                priority: "2"
                category: "guest_recovery"
                description: "Score: {{get-survey.overall_score}}/10. Feedback: {{get-survey.comments}}"
            - name: notify-gm
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "gm_alerts_{{get-survey.property_code}}"
                text: "Guest recovery needed: {{get-survey.guest_name}} scored {{get-survey.overall_score}}/10. Incident: {{create-incident.number}}"
            - name: log-case
              type: call
              call: "confluence.create-page"
              with:
                space_key: "GUEST_RECOVERY"
                title: "Recovery - {{get-survey.guest_name}} - {{get-survey.property_name}}"
                body: "Survey score: {{get-survey.overall_score}}. Comments: {{get-survey.comments}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: surveys
          path: "/sobjects/Survey_Response__c/{{survey_id}}"
          inputParameters:
            - name: survey_id
              in: path
          operations:
            - name: get-survey
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://hyatt.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Resolves guest folio disputes by pulling the folio from Opera PMS, processing an adjustment, and sending a corrected statement via SendGrid.

naftiko: "0.5"
info:
  label: "Guest Folio Dispute Resolution Pipeline"
  description: "Resolves guest folio disputes by pulling the folio from Opera PMS, processing an adjustment, and sending a corrected statement via SendGrid."
  tags:
    - finance
    - guest-services
    - oracle-cloud
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: folio-dispute
      port: 8080
      tools:
        - name: resolve-folio-dispute
          description: "Resolve a guest folio charge dispute."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: disputed_charge_id
              in: body
              type: string
              description: "The charge line item ID."
            - name: guest_email
              in: body
              type: string
              description: "Guest email address."
          steps:
            - name: get-folio
              type: call
              call: "opera.get-folio"
              with:
                reservation: "{{reservation_id}}"
            - name: process-adjustment
              type: call
              call: "opera.post-adjustment"
              with:
                reservation: "{{reservation_id}}"
                charge_id: "{{disputed_charge_id}}"
                type: "credit"
            - name: send-corrected-statement
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{guest_email}}"
                template_id: "folio_correction"
                dynamic_data:
                  reservation_id: "{{reservation_id}}"
                  adjustment_amount: "{{process-adjustment.credit_amount}}"
                  new_balance: "{{process-adjustment.new_balance}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: folios
          path: "/reservations/{{reservation}}/folio"
          inputParameters:
            - name: reservation
              in: path
          operations:
            - name: get-folio
              method: GET
        - name: adjustments
          path: "/reservations/{{reservation}}/adjustments"
          inputParameters:
            - name: reservation
              in: path
          operations:
            - name: post-adjustment
              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

Manages guest lost and found items by creating a record in ALICE, matching against guest profiles in Opera PMS, and sending a notification to the guest via SendGrid.

naftiko: "0.5"
info:
  label: "Guest Lost and Found Tracker"
  description: "Manages guest lost and found items by creating a record in ALICE, matching against guest profiles in Opera PMS, and sending a notification to the guest via SendGrid."
  tags:
    - guest-services
    - operations
    - oracle-cloud
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: lost-and-found
      port: 8080
      tools:
        - name: log-lost-item
          description: "Log a found item and attempt to match with a guest."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: item_description
              in: body
              type: string
              description: "Description of the found item."
            - name: room_number
              in: body
              type: string
              description: "Room where item was found."
          steps:
            - name: create-lf-record
              type: call
              call: "alice.create-lost-found"
              with:
                property: "{{property_code}}"
                item: "{{item_description}}"
                room: "{{room_number}}"
            - name: match-guest
              type: call
              call: "opera.get-recent-guest"
              with:
                property: "{{property_code}}"
                room: "{{room_number}}"
            - name: notify-guest
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{match-guest.email}}"
                template_id: "lost_and_found"
                dynamic_data:
                  guest_name: "{{match-guest.name}}"
                  item: "{{item_description}}"
                  property_name: "{{property_code}}"
                  reference: "{{create-lf-record.reference_id}}"
  consumes:
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: lost-found
          path: "/lost-and-found"
          operations:
            - name: create-lost-found
              method: POST
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: guests
          path: "/properties/{{property}}/rooms/{{room}}/recent-guest"
          inputParameters:
            - name: property
              in: path
            - name: room
              in: path
          operations:
            - name: get-recent-guest
              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

Sends post-stay surveys by pulling checkout data from Opera PMS, triggering a survey via Medallia, and syncing responses to Snowflake for analytics.

naftiko: "0.5"
info:
  label: "Guest Post-Stay Survey Pipeline"
  description: "Sends post-stay surveys by pulling checkout data from Opera PMS, triggering a survey via Medallia, and syncing responses to Snowflake for analytics."
  tags:
    - guest-experience
    - survey
    - oracle-cloud
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: post-stay-survey
      port: 8080
      tools:
        - name: send-post-stay-survey
          description: "Send a post-stay survey to a checked-out guest."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-checkout-data
              type: call
              call: "opera.get-checkout"
              with:
                property: "{{property_code}}"
                reservation: "{{reservation_id}}"
            - name: trigger-survey
              type: call
              call: "medallia.send-survey"
              with:
                email: "{{get-checkout-data.guest_email}}"
                guest_name: "{{get-checkout-data.guest_name}}"
                property: "{{property_code}}"
                stay_dates: "{{get-checkout-data.check_in}} - {{get-checkout-data.check_out}}"
            - name: log-to-analytics
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO survey_sends (reservation_id, property_code, guest_email, survey_id, sent_at) VALUES ('{{reservation_id}}', '{{property_code}}', '{{get-checkout-data.guest_email}}', '{{trigger-survey.survey_id}}', CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: checkouts
          path: "/properties/{{property}}/reservations/{{reservation}}/checkout"
          inputParameters:
            - name: property
              in: path
            - name: reservation
              in: path
          operations:
            - name: get-checkout
              method: GET
    - type: http
      namespace: medallia
      baseUri: "https://api.medallia.com/v1"
      authentication:
        type: bearer
        token: "$secrets.medallia_token"
      resources:
        - name: surveys
          path: "/surveys/send"
          operations:
            - name: send-survey
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://hyatt.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

On new booking in Oracle Hospitality OPERA, creates a Salesforce contact record, provisions a loyalty profile update in the CRM, and sends a confirmation via WhatsApp.

naftiko: "0.5"
info:
  label: "Guest Reservation Orchestrator"
  description: "On new booking in Oracle Hospitality OPERA, creates a Salesforce contact record, provisions a loyalty profile update in the CRM, and sends a confirmation via WhatsApp."
  tags:
    - reservations
    - hospitality
    - oracle
    - salesforce
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: guest-reservations
      port: 8080
      tools:
        - name: orchestrate-reservation
          description: "Given a reservation ID, orchestrate guest record creation in Salesforce, loyalty update, and WhatsApp confirmation."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The OPERA reservation confirmation number."
            - name: guest_email
              in: body
              type: string
              description: "Guest email address for profile lookup."
          steps:
            - name: get-reservation
              type: call
              call: "opera.get-reservation"
              with:
                reservation_id: "{{reservation_id}}"
            - name: upsert-contact
              type: call
              call: "salesforce.upsert-contact"
              with:
                email: "{{guest_email}}"
                first_name: "{{get-reservation.guest_first_name}}"
                last_name: "{{get-reservation.guest_last_name}}"
            - name: send-confirmation
              type: call
              call: "whatsapp.send-message"
              with:
                phone: "{{get-reservation.guest_phone}}"
                template: "reservation_confirmed"
                parameters: "{{get-reservation.confirmation_number}},{{get-reservation.check_in_date}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: reservations
          path: "/reservations/{{reservation_id}}"
          inputParameters:
            - name: reservation_id
              in: path
          operations:
            - name: get-reservation
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact"
          operations:
            - name: upsert-contact
              method: PATCH
    - type: http
      namespace: whatsapp
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{phone_number_id}}/messages"
          inputParameters:
            - name: phone_number_id
              in: path
          operations:
            - name: send-message
              method: POST

Automates room upgrades for eligible guests by checking loyalty tier, verifying availability in Opera PMS, and sending an upgrade notification via the mobile app push service.

naftiko: "0.5"
info:
  label: "Guest Room Upgrade Automation"
  description: "Automates room upgrades for eligible guests by checking loyalty tier, verifying availability in Opera PMS, and sending an upgrade notification via the mobile app push service."
  tags:
    - guest-experience
    - loyalty
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: room-upgrade
      port: 8080
      tools:
        - name: process-upgrade
          description: "Automatically process a room upgrade for an eligible guest."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: check-loyalty-tier
              type: call
              call: "loyalty.get-member-tier"
              with:
                reservation_id: "{{reservation_id}}"
            - name: check-upgrade-availability
              type: call
              call: "opera.get-upgrade-options"
              with:
                property: "{{property_code}}"
                reservation: "{{reservation_id}}"
                min_tier: "{{check-loyalty-tier.tier}}"
            - name: send-push-notification
              type: call
              call: "push-service.send-notification"
              with:
                reservation_id: "{{reservation_id}}"
                title: "Complimentary Room Upgrade"
                body: "You have been upgraded to {{check-upgrade-availability.upgrade_room_type}}. Enjoy your stay!"
  consumes:
    - type: http
      namespace: loyalty
      baseUri: "https://loyalty.hyatt.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.loyalty_token"
      resources:
        - name: tiers
          path: "/reservations/{{reservation_id}}/tier"
          inputParameters:
            - name: reservation_id
              in: path
          operations:
            - name: get-member-tier
              method: GET
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: upgrades
          path: "/properties/{{property}}/reservations/{{reservation}}/upgrade-options"
          inputParameters:
            - name: property
              in: path
            - name: reservation
              in: path
          operations:
            - name: get-upgrade-options
              method: GET
    - type: http
      namespace: push-service
      baseUri: "https://push.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.push_service_token"
      resources:
        - name: notifications
          path: "/notifications"
          operations:
            - name: send-notification
              method: POST

Recognizes guest special occasions by checking profile notes in Opera PMS, creating an amenity delivery in ALICE, and logging in the CRM for future stays.

naftiko: "0.5"
info:
  label: "Guest Special Occasion Recognition Pipeline"
  description: "Recognizes guest special occasions by checking profile notes in Opera PMS, creating an amenity delivery in ALICE, and logging in the CRM for future stays."
  tags:
    - guest-experience
    - personalization
    - oracle-cloud
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: special-occasions
      port: 8080
      tools:
        - name: recognize-occasion
          description: "Prepare special occasion recognition for a guest."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: occasion_type
              in: body
              type: string
              description: "Occasion type (birthday, anniversary, honeymoon)."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-guest-profile
              type: call
              call: "opera.get-guest-profile"
              with:
                reservation: "{{reservation_id}}"
            - name: create-amenity
              type: call
              call: "alice.create-request"
              with:
                property: "{{property_code}}"
                type: "amenity_delivery"
                room: "{{get-guest-profile.room_number}}"
                description: "{{occasion_type}} recognition: {{get-guest-profile.guest_name}}. Preferred: {{get-guest-profile.preferences}}."
            - name: log-in-crm
              type: call
              call: "salesforce.create-activity"
              with:
                contact_id: "{{get-guest-profile.crm_id}}"
                subject: "{{occasion_type}} recognition at {{property_code}}"
                description: "Amenity delivered: {{create-amenity.request_id}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: profiles
          path: "/reservations/{{reservation}}/guest-profile"
          inputParameters:
            - name: reservation
              in: path
          operations:
            - name: get-guest-profile
              method: GET
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: requests
          path: "/requests"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: activities
          path: "/sobjects/Task"
          operations:
            - name: create-activity
              method: POST

Optimizes housekeeping room assignments by pulling departure/arrival data from Opera PMS, staff availability from Workday, and distributing assignments via ALICE.

naftiko: "0.5"
info:
  label: "Housekeeping Room Assignment Optimizer"
  description: "Optimizes housekeeping room assignments by pulling departure/arrival data from Opera PMS, staff availability from Workday, and distributing assignments via ALICE."
  tags:
    - housekeeping
    - operations
    - oracle-cloud
    - workday
capability:
  exposes:
    - type: mcp
      namespace: housekeeping-optimizer
      port: 8080
      tools:
        - name: optimize-assignments
          description: "Optimize housekeeping room assignments."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: date
              in: body
              type: string
              description: "Date in YYYY-MM-DD."
          steps:
            - name: get-room-status
              type: call
              call: "opera.get-room-status"
              with:
                property: "{{property_code}}"
                date: "{{date}}"
            - name: get-staff-schedule
              type: call
              call: "workday.get-schedule"
              with:
                location: "property_{{property_code}}"
                department: "housekeeping"
            - name: distribute-assignments
              type: call
              call: "alice.create-bulk-tasks"
              with:
                property: "{{property_code}}"
                rooms: "{{get-room-status.rooms_to_clean}}"
                staff: "{{get-staff-schedule.available_staff}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: rooms
          path: "/properties/{{property}}/room-status?date={{date}}"
          inputParameters:
            - name: property
              in: path
            - name: date
              in: query
          operations:
            - name: get-room-status
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: schedules
          path: "/schedules?location={{location}}&department={{department}}"
          inputParameters:
            - name: location
              in: query
            - name: department
              in: query
          operations:
            - name: get-schedule
              method: GET
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: tasks
          path: "/tasks/bulk"
          operations:
            - name: create-bulk-tasks
              method: POST

Queries Oracle Hospitality OPERA for the current housekeeping status of a room, returning clean/dirty/inspected status and assigned housekeeper.

naftiko: "0.5"
info:
  label: "Housekeeping Room Status Lookup"
  description: "Queries Oracle Hospitality OPERA for the current housekeeping status of a room, returning clean/dirty/inspected status and assigned housekeeper."
  tags:
    - property-management
    - housekeeping
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: housekeeping
      port: 8080
      tools:
        - name: get-room-status
          description: "Look up the housekeeping status of a hotel room by property code and room number."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: room_number
              in: body
              type: string
              description: "The room number."
          call: "opera.get-room-status"
          with:
            property_code: "{{property_code}}"
            room_number: "{{room_number}}"
          outputParameters:
            - name: hk_status
              type: string
              mapping: "$.roomStatus.housekeepingStatus"
            - name: assigned_housekeeper
              type: string
              mapping: "$.roomStatus.assignedAttendant"
            - name: last_cleaned
              type: string
              mapping: "$.roomStatus.lastCleanedDateTime"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: rooms
          path: "/properties/{{property_code}}/rooms/{{room_number}}/status"
          inputParameters:
            - name: property_code
              in: path
            - name: room_number
              in: path
          operations:
            - name: get-room-status
              method: GET

When a sales-qualified lead is captured in HubSpot from a Hyatt meeting/events inquiry, creates a corresponding Salesforce opportunity and notifies the regional sales team.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce Opportunity Sync"
  description: "When a sales-qualified lead is captured in HubSpot from a Hyatt meeting/events inquiry, creates a corresponding Salesforce opportunity and notifies the regional sales team."
  tags:
    - sales
    - marketing
    - hubspot
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-sync
      port: 8080
      tools:
        - name: sync-lead-to-opportunity
          description: "Convert a HubSpot lead into a Salesforce opportunity and notify sales."
          inputParameters:
            - name: hubspot_contact_id
              in: body
              type: string
              description: "The HubSpot contact ID for the lead."
          steps:
            - name: get-lead
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{hubspot_contact_id}}"
            - name: create-opp
              type: call
              call: "salesforce.create-opportunity"
              with:
                name: "Meeting Inquiry: {{get-lead.company}} - {{get-lead.firstname}} {{get-lead.lastname}}"
                amount: "{{get-lead.estimated_value}}"
                stage: "Qualification"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regional_sales"
                text: "New opportunity from HubSpot: {{get-lead.company}} ({{get-lead.firstname}} {{get-lead.lastname}}). SF Opp: {{create-opp.id}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls engagement metrics from Instagram's Graph API for Hyatt property accounts, returning follower count, recent post reach, and engagement rate.

naftiko: "0.5"
info:
  label: "Instagram Social Engagement Reporter"
  description: "Pulls engagement metrics from Instagram's Graph API for Hyatt property accounts, returning follower count, recent post reach, and engagement rate."
  tags:
    - marketing
    - social-media
    - instagram
capability:
  exposes:
    - type: mcp
      namespace: social-engagement
      port: 8080
      tools:
        - name: get-instagram-metrics
          description: "Retrieve Instagram engagement metrics for a Hyatt property account."
          inputParameters:
            - name: instagram_account_id
              in: body
              type: string
              description: "The Instagram business account ID."
          call: "instagram.get-insights"
          with:
            account_id: "{{instagram_account_id}}"
          outputParameters:
            - name: followers
              type: string
              mapping: "$.followers_count"
            - name: reach
              type: string
              mapping: "$.insights.reach"
            - name: engagement_rate
              type: string
              mapping: "$.insights.engagement_rate"
  consumes:
    - type: http
      namespace: instagram
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.instagram_token"
      resources:
        - name: accounts
          path: "/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
            - name: fields
              in: query
              value: "followers_count,media_count,insights"
          operations:
            - name: get-insights
              method: GET

Provisions IT access for new property staff by creating Azure AD accounts, granting PMS access in Opera, and sending credentials via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "IT Access Provisioning for New Property Staff"
  description: "Provisions IT access for new property staff by creating Azure AD accounts, granting PMS access in Opera, and sending credentials via Microsoft Outlook."
  tags:
    - it
    - access-management
    - azure-active-directory
    - oracle-cloud
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: staff-provisioning
      port: 8080
      tools:
        - name: provision-staff-access
          description: "Provision IT system access for a new property staff member."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: role
              in: body
              type: string
              description: "Job role."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-ad-account
              type: call
              call: "azure-ad.create-user"
              with:
                display_name: "{{get-employee.full_name}}"
                mail: "{{get-employee.work_email}}"
                groups: "Property_{{property_code}}_{{role}}"
            - name: grant-pms-access
              type: call
              call: "opera.create-user"
              with:
                username: "{{get-employee.work_email}}"
                property: "{{property_code}}"
                role: "{{role}}"
            - name: send-credentials
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-employee.work_email}}"
                subject: "Your Hyatt IT Access Credentials"
                body: "Welcome {{get-employee.first_name}}. Your AD account and Opera PMS access for {{property_code}} have been provisioned."
  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: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Retrieves the current sprint status and velocity for a technology team's Jira board.

naftiko: "0.5"
info:
  label: "Jira Technology Project Status"
  description: "Retrieves the current sprint status and velocity for a technology team's Jira board."
  tags:
    - engineering
    - project
    - jira
capability:
  exposes:
    - type: mcp
      namespace: tech-projects
      port: 8080
      tools:
        - name: get-project-status
          description: "Get current sprint status for a technology project."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID."
          call: "jira.get-active-sprint"
          with:
            board: "{{board_id}}"
          outputParameters:
            - name: sprint_name
              type: string
              mapping: "$.values[0].name"
            - name: goal
              type: string
              mapping: "$.values[0].goal"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hyatt.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board}}/sprint?state=active"
          inputParameters:
            - name: board
              in: path
          operations:
            - name: get-active-sprint
              method: GET

Creates a job posting on LinkedIn Jobs from Workday requisition data and notifies the recruiting team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Publisher"
  description: "Creates a job posting on LinkedIn Jobs from Workday requisition data and notifies the recruiting team via Microsoft Teams."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: job-posting
      port: 8080
      tools:
        - name: publish-job-posting
          description: "Publish a Workday requisition to LinkedIn Jobs and notify recruiters."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-job
              type: call
              call: "linkedin.create-job"
              with:
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
                company_id: "hyatt"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "recruiting_ops"
                text: "Job posted to LinkedIn: {{get-requisition.job_title}} in {{get-requisition.location}}. LinkedIn ID: {{post-job.job_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/recruiting/v1/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: jobs
          path: "/simpleJobPostings"
          operations:
            - name: create-job
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a guest opts into World of Hyatt during booking, creates the loyalty account in Salesforce, sends a welcome email via Adobe Campaign, and updates the OPERA guest profile.

naftiko: "0.5"
info:
  label: "Loyalty Member Enrollment Orchestrator"
  description: "When a guest opts into World of Hyatt during booking, creates the loyalty account in Salesforce, sends a welcome email via Adobe Campaign, and updates the OPERA guest profile."
  tags:
    - loyalty
    - hospitality
    - salesforce
    - adobe-campaign
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: loyalty-enrollment
      port: 8080
      tools:
        - name: enroll-loyalty-member
          description: "Enroll a new guest in the World of Hyatt loyalty program."
          inputParameters:
            - name: guest_email
              in: body
              type: string
              description: "Guest email address."
            - name: first_name
              in: body
              type: string
              description: "Guest first name."
            - name: last_name
              in: body
              type: string
              description: "Guest last name."
            - name: reservation_id
              in: body
              type: string
              description: "Associated OPERA reservation ID."
          steps:
            - name: create-loyalty-account
              type: call
              call: "salesforce.create-loyalty"
              with:
                email: "{{guest_email}}"
                first_name: "{{first_name}}"
                last_name: "{{last_name}}"
            - name: send-welcome-email
              type: call
              call: "adobe-campaign.send-email"
              with:
                recipient_email: "{{guest_email}}"
                template: "loyalty_welcome"
                params: "{{first_name}},{{create-loyalty-account.member_id}}"
            - name: update-opera-profile
              type: call
              call: "opera.update-guest"
              with:
                reservation_id: "{{reservation_id}}"
                loyalty_member_id: "{{create-loyalty-account.member_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: loyalty
          path: "/sobjects/Loyalty_Member__c"
          operations:
            - name: create-loyalty
              method: POST
    - type: http
      namespace: adobe-campaign
      baseUri: "https://mc.adobe.io/hyatt/campaign"
      authentication:
        type: bearer
        token: "$secrets.adobe_campaign_token"
      resources:
        - name: emails
          path: "/email/send"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: guests
          path: "/reservations/{{reservation_id}}/guest"
          inputParameters:
            - name: reservation_id
              in: path
          operations:
            - name: update-guest
              method: PATCH

Retrieves a World of Hyatt member's loyalty points balance and tier status from Salesforce, returning current points, qualifying nights, and membership level.

naftiko: "0.5"
info:
  label: "Loyalty Points Balance Lookup"
  description: "Retrieves a World of Hyatt member's loyalty points balance and tier status from Salesforce, returning current points, qualifying nights, and membership level."
  tags:
    - loyalty
    - hospitality
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: loyalty-points
      port: 8080
      tools:
        - name: get-loyalty-balance
          description: "Look up a World of Hyatt member's points balance and tier status by member ID."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The World of Hyatt loyalty member ID."
          call: "salesforce.get-loyalty-member"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: points_balance
              type: string
              mapping: "$.records[0].Points_Balance__c"
            - name: tier_status
              type: string
              mapping: "$.records[0].Tier_Status__c"
            - name: qualifying_nights
              type: string
              mapping: "$.records[0].Qualifying_Nights__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: loyalty-members
          path: "/query"
          inputParameters:
            - name: q
              in: query
              value: "SELECT Points_Balance__c, Tier_Status__c, Qualifying_Nights__c FROM Loyalty_Member__c WHERE Member_ID__c = '{{member_id}}'"
          operations:
            - name: get-loyalty-member
              method: GET

Processes loyalty tier upgrades by updating the member profile, syncing benefits to Opera PMS, and sending a congratulatory email via SendGrid.

naftiko: "0.5"
info:
  label: "Loyalty Tier Upgrade Notification Pipeline"
  description: "Processes loyalty tier upgrades by updating the member profile, syncing benefits to Opera PMS, and sending a congratulatory email via SendGrid."
  tags:
    - loyalty
    - guest-experience
    - oracle-cloud
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: tier-upgrade
      port: 8080
      tools:
        - name: process-tier-upgrade
          description: "Process a World of Hyatt tier upgrade."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The loyalty member ID."
            - name: new_tier
              in: body
              type: string
              description: "The new tier level."
          steps:
            - name: update-member
              type: call
              call: "loyalty.update-tier"
              with:
                member_id: "{{member_id}}"
                tier: "{{new_tier}}"
            - name: sync-benefits
              type: call
              call: "opera.update-guest-profile"
              with:
                member_id: "{{member_id}}"
                tier: "{{new_tier}}"
                benefits: "{{update-member.tier_benefits}}"
            - name: send-congrats
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{update-member.email}}"
                template_id: "tier_upgrade_congrats"
                dynamic_data:
                  name: "{{update-member.first_name}}"
                  new_tier: "{{new_tier}}"
                  nights_earned: "{{update-member.qualifying_nights}}"
  consumes:
    - type: http
      namespace: loyalty
      baseUri: "https://loyalty.hyatt.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.loyalty_token"
      resources:
        - name: members
          path: "/members/{{member_id}}/tier"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: update-tier
              method: PUT
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: profiles
          path: "/guest-profiles/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: update-guest-profile
              method: PATCH
    - 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

Reports on meeting space utilization by pulling bookings from Cvent, comparing against capacity from the catering system, and updating Snowflake analytics.

naftiko: "0.5"
info:
  label: "Meeting Space Utilization Reporter"
  description: "Reports on meeting space utilization by pulling bookings from Cvent, comparing against capacity from the catering system, and updating Snowflake analytics."
  tags:
    - events
    - analytics
    - cvent
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: meeting-utilization
      port: 8080
      tools:
        - name: report-utilization
          description: "Generate meeting space utilization report."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: month
              in: body
              type: string
              description: "Month in YYYY-MM."
          steps:
            - name: get-bookings
              type: call
              call: "cvent.get-event-bookings"
              with:
                venue: "{{property_code}}"
                month: "{{month}}"
            - name: get-capacity
              type: call
              call: "catering.get-space-capacity"
              with:
                property: "{{property_code}}"
            - name: update-analytics
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO meeting_space_utilization (property_code, month, bookings, capacity, utilization_pct) VALUES ('{{property_code}}', '{{month}}', {{get-bookings.total_events}}, {{get-capacity.total_capacity}}, {{get-bookings.total_events}} / {{get-capacity.total_capacity}} * 100)"
  consumes:
    - type: http
      namespace: cvent
      baseUri: "https://api.cvent.com/v1"
      authentication:
        type: bearer
        token: "$secrets.cvent_token"
      resources:
        - name: events
          path: "/venues/{{venue}}/events?month={{month}}"
          inputParameters:
            - name: venue
              in: path
            - name: month
              in: query
          operations:
            - name: get-event-bookings
              method: GET
    - type: http
      namespace: catering
      baseUri: "https://catering.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.catering_token"
      resources:
        - name: spaces
          path: "/properties/{{property}}/spaces"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-space-capacity
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://hyatt.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Generates a property revenue report in Microsoft Excel via the Graph API, populating a template workbook with daily revenue data from OPERA.

naftiko: "0.5"
info:
  label: "Microsoft Excel Revenue Report Generator"
  description: "Generates a property revenue report in Microsoft Excel via the Graph API, populating a template workbook with daily revenue data from OPERA."
  tags:
    - revenue
    - reporting
    - microsoft-excel
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: revenue-reporting
      port: 8080
      tools:
        - name: generate-revenue-report
          description: "Pull OPERA revenue data and populate an Excel report template."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: month
              in: body
              type: string
              description: "Report month in YYYY-MM format."
          steps:
            - name: get-revenue-data
              type: call
              call: "opera.get-monthly-revenue"
              with:
                property_code: "{{property_code}}"
                month: "{{month}}"
            - name: update-workbook
              type: call
              call: "excel.update-range"
              with:
                workbook_id: "revenue_template_{{property_code}}"
                sheet_name: "MonthlyRevenue"
                range: "A2:F32"
                values: "{{get-revenue-data.daily_figures}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: revenue
          path: "/properties/{{property_code}}/revenue"
          inputParameters:
            - name: property_code
              in: path
            - name: month
              in: query
          operations:
            - name: get-monthly-revenue
              method: GET
    - type: http
      namespace: excel
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: workbooks
          path: "/me/drive/items/{{workbook_id}}/workbook/worksheets/{{sheet_name}}/range(address='{{range}}')"
          inputParameters:
            - name: workbook_id
              in: path
            - name: sheet_name
              in: path
            - name: range
              in: path
          operations:
            - name: update-range
              method: PATCH

Schedules a meeting on a Hyatt employee's Outlook calendar via the Microsoft Graph API and returns the meeting link.

naftiko: "0.5"
info:
  label: "Microsoft Outlook Meeting Scheduler"
  description: "Schedules a meeting on a Hyatt employee's Outlook calendar via the Microsoft Graph API and returns the meeting link."
  tags:
    - communications
    - scheduling
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: meeting-scheduler
      port: 8080
      tools:
        - name: schedule-meeting
          description: "Create a meeting on an employee's Outlook calendar."
          inputParameters:
            - name: organizer_upn
              in: body
              type: string
              description: "Organizer's user principal name."
            - name: subject
              in: body
              type: string
              description: "Meeting subject."
            - name: start_time
              in: body
              type: string
              description: "Start time in ISO 8601 format."
            - name: end_time
              in: body
              type: string
              description: "End time in ISO 8601 format."
            - name: attendees
              in: body
              type: string
              description: "Comma-separated list of attendee email addresses."
          call: "outlook.create-event"
          with:
            organizer_upn: "{{organizer_upn}}"
            subject: "{{subject}}"
            start_time: "{{start_time}}"
            end_time: "{{end_time}}"
            attendees: "{{attendees}}"
          outputParameters:
            - name: meeting_link
              type: string
              mapping: "$.onlineMeeting.joinUrl"
            - name: event_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/users/{{organizer_upn}}/events"
          inputParameters:
            - name: organizer_upn
              in: path
          operations:
            - name: create-event
              method: POST

Sends an announcement message to a Hyatt property's Microsoft Teams channel for staff communications.

naftiko: "0.5"
info:
  label: "Microsoft Teams Property Announcement Sender"
  description: "Sends an announcement message to a Hyatt property's Microsoft Teams channel for staff communications."
  tags:
    - communications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: staff-comms
      port: 8080
      tools:
        - name: send-property-announcement
          description: "Post an announcement to a property's Teams channel."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: message
              in: body
              type: string
              description: "The announcement message text."
          call: "msteams.post-channel-message"
          with:
            channel_id: "announcements_{{property_code}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Automates minibar replenishment by checking consumption via the smart minibar system, creating a restock task in ALICE, and updating inventory in SAP.

naftiko: "0.5"
info:
  label: "Minibar Replenishment Automation"
  description: "Automates minibar replenishment by checking consumption via the smart minibar system, creating a restock task in ALICE, and updating inventory in SAP."
  tags:
    - food-and-beverage
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: minibar
      port: 8080
      tools:
        - name: replenish-minibar
          description: "Automate minibar replenishment workflow."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: room_number
              in: body
              type: string
              description: "The room number."
          steps:
            - name: check-consumption
              type: call
              call: "minibar-system.get-status"
              with:
                property: "{{property_code}}"
                room: "{{room_number}}"
            - name: create-restock-task
              type: call
              call: "alice.create-request"
              with:
                property: "{{property_code}}"
                type: "minibar_restock"
                room: "{{room_number}}"
                description: "Items consumed: {{check-consumption.consumed_items}}"
            - name: update-inventory
              type: call
              call: "sap.post-goods-issue"
              with:
                property: "{{property_code}}"
                items: "{{check-consumption.consumed_items}}"
                cost_center: "fb_minibar_{{property_code}}"
  consumes:
    - type: http
      namespace: minibar-system
      baseUri: "https://minibar.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.minibar_token"
      resources:
        - name: status
          path: "/properties/{{property}}/rooms/{{room}}/status"
          inputParameters:
            - name: property
              in: path
            - name: room
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: requests
          path: "/requests"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/ZMM_GI_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-issues
          path: "/GoodsIssueSet"
          operations:
            - name: post-goods-issue
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for training materials, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for training materials, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and property assignment, orchestrate the full onboarding sequence."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in YYYY-MM-DD format."
            - name: property_code
              in: body
              type: string
              description: "Assigned Hyatt property code."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Onboarding: {{get-employee.full_name}} at {{property_code}}"
                category: "hr_onboarding"
                assigned_group: "HR_Onboarding_{{property_code}}"
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding"
                folder_path: "NewHires/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Hyatt, {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}. Training docs: {{provision-folder.url}}"
  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: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves application performance metrics from New Relic for Hyatt's booking platform, returning response time, error rate, and throughput.

naftiko: "0.5"
info:
  label: "New Relic Application Performance Lookup"
  description: "Retrieves application performance metrics from New Relic for Hyatt's booking platform, returning response time, error rate, and throughput."
  tags:
    - it-operations
    - monitoring
    - new-relic
capability:
  exposes:
    - type: mcp
      namespace: app-performance
      port: 8080
      tools:
        - name: get-app-performance
          description: "Get performance metrics from New Relic for a Hyatt application."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: "newrelic.get-app-metrics"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: response_time
              type: string
              mapping: "$.application.application_summary.response_time"
            - name: error_rate
              type: string
              mapping: "$.application.application_summary.error_rate"
            - name: throughput
              type: string
              mapping: "$.application.application_summary.throughput"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        name: "Api-Key"
        in: header
        value: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET

Checks rate parity across OTAs by comparing Opera PMS rates with Booking.com and Expedia, alerting revenue management via Slack on disparities.

naftiko: "0.5"
info:
  label: "Online Booking Channel Rate Parity Checker"
  description: "Checks rate parity across OTAs by comparing Opera PMS rates with Booking.com and Expedia, alerting revenue management via Slack on disparities."
  tags:
    - revenue
    - distribution
    - oracle-cloud
    - slack
capability:
  exposes:
    - type: mcp
      namespace: rate-parity
      port: 8080
      tools:
        - name: check-rate-parity
          description: "Check rate parity across booking channels."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: room_type
              in: body
              type: string
              description: "Room type to check."
            - name: check_date
              in: body
              type: string
              description: "Date to check."
          steps:
            - name: get-opera-rate
              type: call
              call: "opera.get-rate"
              with:
                property: "{{property_code}}"
                room_type: "{{room_type}}"
                date: "{{check_date}}"
            - name: get-ota-rates
              type: call
              call: "rate-shopper.get-rates"
              with:
                property: "{{property_code}}"
                room_type: "{{room_type}}"
                date: "{{check_date}}"
            - name: alert-revenue-mgmt
              type: call
              call: "slack.post-message"
              with:
                channel: "revenue-management"
                text: "Rate parity alert for {{property_code}} on {{check_date}}: Our rate ${{get-opera-rate.rate}}. Booking.com: ${{get-ota-rates.booking_com}}. Expedia: ${{get-ota-rates.expedia}}."
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: rates
          path: "/properties/{{property}}/rates?roomType={{room_type}}&date={{date}}"
          inputParameters:
            - name: property
              in: path
            - name: room_type
              in: query
            - name: date
              in: query
          operations:
            - name: get-rate
              method: GET
    - type: http
      namespace: rate-shopper
      baseUri: "https://rateshopper.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.rate_shopper_token"
      resources:
        - name: rates
          path: "/properties/{{property}}/channel-rates"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-rates
              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

Retrieves the current room rate and availability for a room type at a property from Oracle Opera PMS.

naftiko: "0.5"
info:
  label: "Opera PMS Room Rate Lookup"
  description: "Retrieves the current room rate and availability for a room type at a property from Oracle Opera PMS."
  tags:
    - revenue
    - rooms
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: room-rates
      port: 8080
      tools:
        - name: get-room-rate
          description: "Look up room rate and availability by property and room type."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: room_type
              in: body
              type: string
              description: "The room type code."
            - name: check_in_date
              in: body
              type: string
              description: "Check-in date in YYYY-MM-DD."
          call: "opera.get-rate"
          with:
            property: "{{property_code}}"
            room_type: "{{room_type}}"
            date: "{{check_in_date}}"
          outputParameters:
            - name: rate
              type: number
              mapping: "$.rateAmount"
            - name: available_rooms
              type: integer
              mapping: "$.availability"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: rates
          path: "/properties/{{property}}/rates?roomType={{room_type}}&date={{date}}"
          inputParameters:
            - name: property
              in: path
            - name: room_type
              in: query
            - name: date
              in: query
          operations:
            - name: get-rate
              method: GET

Creates a journal entry in Oracle Cloud Financials for property-level accounting, including revenue recognition and cost allocation.

naftiko: "0.5"
info:
  label: "Oracle Cloud Finance Journal Entry Creator"
  description: "Creates a journal entry in Oracle Cloud Financials for property-level accounting, including revenue recognition and cost allocation."
  tags:
    - finance
    - accounting
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: finance-journals
      port: 8080
      tools:
        - name: create-journal-entry
          description: "Create a journal entry in Oracle Cloud Financials."
          inputParameters:
            - name: ledger_name
              in: body
              type: string
              description: "The ledger name."
            - name: journal_lines
              in: body
              type: string
              description: "JSON array of journal line items with account, debit, credit."
            - name: description
              in: body
              type: string
              description: "Journal entry description."
          call: "oracle-cloud.create-journal"
          with:
            ledger_name: "{{ledger_name}}"
            journal_lines: "{{journal_lines}}"
            description: "{{description}}"
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://hyatt.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: journals
          path: "/generalAccountingJournals"
          operations:
            - name: create-journal
              method: POST

Retrieves the status and responder for a PagerDuty incident affecting hotel technology systems.

naftiko: "0.5"
info:
  label: "PagerDuty Hotel Systems Incident Lookup"
  description: "Retrieves the status and responder for a PagerDuty incident affecting hotel technology systems."
  tags:
    - it
    - incident-management
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: hotel-incidents
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a hotel systems PagerDuty incident."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The PagerDuty incident ID."
          call: "pagerduty.get-incident"
          with:
            id: "{{incident_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.incident.status"
            - name: service
              type: string
              mapping: "$.incident.service.summary"
            - name: responder
              type: string
              mapping: "$.incident.assignments[0].assignee.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-incident
              method: GET

Assigns a Pluralsight learning path to a hotel employee based on their role and notifies them via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pluralsight Training Assignment Creator"
  description: "Assigns a Pluralsight learning path to a hotel employee based on their role and notifies them via Microsoft Teams."
  tags:
    - hr
    - training
    - pluralsight
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: training
      port: 8080
      tools:
        - name: assign-training
          description: "Assign a Pluralsight learning path and notify the employee."
          inputParameters:
            - name: employee_email
              in: body
              type: string
              description: "Employee email address."
            - name: channel_id
              in: body
              type: string
              description: "The Pluralsight channel ID for the learning path."
          steps:
            - name: assign-channel
              type: call
              call: "pluralsight.assign-channel"
              with:
                email: "{{employee_email}}"
                channel_id: "{{channel_id}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{employee_email}}"
                text: "You've been assigned a new training path on Pluralsight. Start learning: {{assign-channel.channel_url}}"
  consumes:
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: channels
          path: "/channels/{{channel_id}}/assignments"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: assign-channel
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Schedules pool and spa maintenance by checking water quality sensor data from the BMS, creating work orders in ServiceNow, and notifying the facilities team via Slack.

naftiko: "0.5"
info:
  label: "Pool and Spa Maintenance Scheduler"
  description: "Schedules pool and spa maintenance by checking water quality sensor data from the BMS, creating work orders in ServiceNow, and notifying the facilities team via Slack."
  tags:
    - facilities
    - maintenance
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pool-maintenance
      port: 8080
      tools:
        - name: schedule-pool-maintenance
          description: "Schedule pool and spa maintenance."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-water-quality
              type: call
              call: "bms.get-pool-sensors"
              with:
                property: "{{property_code}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Pool maintenance: {{property_code}}"
                category: "facilities"
                description: "pH: {{get-water-quality.ph}}, Chlorine: {{get-water-quality.chlorine_ppm}}, Temp: {{get-water-quality.temperature}}F"
            - name: notify-facilities
              type: call
              call: "slack.post-message"
              with:
                channel: "property-{{property_code}}-facilities"
                text: "Pool maintenance scheduled. pH: {{get-water-quality.ph}}, Chlorine: {{get-water-quality.chlorine_ppm}}ppm. WO: {{create-work-order.number}}."
  consumes:
    - type: http
      namespace: bms
      baseUri: "https://bms.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.bms_token"
      resources:
        - name: pool
          path: "/properties/{{property}}/pool/sensors"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-pool-sensors
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              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

Triggers a refresh of the Hyatt portfolio performance Power BI dataset to update RevPAR, occupancy, and ADR dashboards.

naftiko: "0.5"
info:
  label: "Power BI Portfolio Performance Refresh"
  description: "Triggers a refresh of the Hyatt portfolio performance Power BI dataset to update RevPAR, occupancy, and ADR dashboards."
  tags:
    - analytics
    - revenue
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: portfolio-dashboard
      port: 8080
      tools:
        - name: refresh-portfolio-dashboard
          description: "Trigger portfolio performance dashboard refresh."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.refresh-dataset"
          with:
            id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{id}}/refreshes"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When a vendor invoice arrives in SAP, validates it against the PO in Oracle Cloud, routes for approval in Microsoft Power Automate, and notifies the finance team via Teams.

naftiko: "0.5"
info:
  label: "Procurement Invoice Approval Pipeline"
  description: "When a vendor invoice arrives in SAP, validates it against the PO in Oracle Cloud, routes for approval in Microsoft Power Automate, and notifies the finance team via Teams."
  tags:
    - procurement
    - finance
    - sap
    - oracle-cloud
    - microsoft-power-automate
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: invoice-approval
      port: 8080
      tools:
        - name: process-invoice
          description: "Validate and route a vendor invoice for approval."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: validate-po
              type: call
              call: "oracle-cloud.get-po"
              with:
                po_number: "{{get-invoice.po_reference}}"
            - name: trigger-approval
              type: call
              call: "power-automate.trigger-flow"
              with:
                flow_id: "invoice_approval"
                invoice_amount: "{{get-invoice.total_amount}}"
                vendor: "{{get-invoice.vendor_name}}"
                po_match: "{{validate-po.status}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "finance_ap"
                text: "Invoice {{invoice_id}} from {{get-invoice.vendor_name}} (${{get-invoice.total_amount}}) routed for approval. PO match: {{validate-po.status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_id}}')"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: oracle-cloud
      baseUri: "https://hyatt.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders"
          inputParameters:
            - name: q
              in: query
              value: "OrderNumber={{po_number}}"
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: power-automate
      baseUri: "https://prod-00.westus.logic.azure.com/workflows"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flows
          path: "/{{flow_id}}/triggers/manual/paths/invoke"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates property brand standard audits by pulling the checklist from ServiceNow, documenting findings in SharePoint, and creating corrective action items in Jira.

naftiko: "0.5"
info:
  label: "Property Brand Audit Orchestrator"
  description: "Orchestrates property brand standard audits by pulling the checklist from ServiceNow, documenting findings in SharePoint, and creating corrective action items in Jira."
  tags:
    - brand-standards
    - compliance
    - servicenow
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: brand-audit
      port: 8080
      tools:
        - name: conduct-brand-audit
          description: "Conduct a property brand standard audit."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: audit_date
              in: body
              type: string
              description: "Audit date in YYYY-MM-DD."
          steps:
            - name: get-audit-checklist
              type: call
              call: "servicenow.get-template"
              with:
                template: "brand_standard_audit"
            - name: archive-findings
              type: call
              call: "sharepoint.upload-document"
              with:
                site_id: "brand_standards"
                folder_path: "Audits/{{property_code}}/{{audit_date}}"
                file_name: "brand_audit_results.json"
            - name: create-corrective-actions
              type: call
              call: "jira.create-issue"
              with:
                project: "BRAND"
                issue_type: "Task"
                summary: "Brand audit corrective actions: {{property_code}} - {{audit_date}}"
                labels: "brand-audit,{{property_code}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: templates
          path: "/table/checklist_template?sysparm_query=name={{template}}"
          inputParameters:
            - name: template
              in: query
          operations:
            - name: get-template
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: uploads
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-document
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://hyatt.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

Pulls energy usage data from the building management system API and logs it to a Google Sheet for sustainability tracking.

naftiko: "0.5"
info:
  label: "Property Energy Consumption Reporter"
  description: "Pulls energy usage data from the building management system API and logs it to a Google Sheet for sustainability tracking."
  tags:
    - sustainability
    - property-management
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: energy-tracking
      port: 8080
      tools:
        - name: report-energy-usage
          description: "Retrieve energy data and log to Google Sheets for sustainability tracking."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: month
              in: body
              type: string
              description: "Reporting month in YYYY-MM format."
          steps:
            - name: get-energy-data
              type: call
              call: "bms.get-consumption"
              with:
                property_code: "{{property_code}}"
                month: "{{month}}"
            - name: log-to-sheet
              type: call
              call: "gsheets.append-row"
              with:
                spreadsheet_id: "energy_tracking"
                range: "Monthly!A:E"
                values: "{{property_code}},{{month}},{{get-energy-data.electricity_kwh}},{{get-energy-data.gas_therms}},{{get-energy-data.water_gallons}}"
  consumes:
    - type: http
      namespace: bms
      baseUri: "https://bms-api.hyatt.com/v1"
      authentication:
        type: bearer
        token: "$secrets.bms_token"
      resources:
        - name: consumption
          path: "/properties/{{property_code}}/consumption"
          inputParameters:
            - name: property_code
              in: path
            - name: month
              in: query
          operations:
            - name: get-consumption
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-row
              method: POST

Optimizes property energy usage by pulling BMS data, comparing against occupancy from Opera PMS, and adjusting HVAC setpoints based on occupancy patterns.

naftiko: "0.5"
info:
  label: "Property Energy Optimization Pipeline"
  description: "Optimizes property energy usage by pulling BMS data, comparing against occupancy from Opera PMS, and adjusting HVAC setpoints based on occupancy patterns."
  tags:
    - sustainability
    - energy
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: energy-optimization
      port: 8080
      tools:
        - name: optimize-energy
          description: "Optimize property energy based on occupancy."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-energy-data
              type: call
              call: "bms.get-energy-consumption"
              with:
                property: "{{property_code}}"
            - name: get-occupancy
              type: call
              call: "opera.get-occupancy"
              with:
                property: "{{property_code}}"
            - name: adjust-setpoints
              type: call
              call: "bms.update-hvac-schedule"
              with:
                property: "{{property_code}}"
                occupancy_rate: "{{get-occupancy.rate}}"
                current_consumption: "{{get-energy-data.kwh}}"
  consumes:
    - type: http
      namespace: bms
      baseUri: "https://bms.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.bms_token"
      resources:
        - name: energy
          path: "/properties/{{property}}/energy"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-energy-consumption
              method: GET
        - name: hvac
          path: "/properties/{{property}}/hvac/schedule"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: update-hvac-schedule
              method: PUT
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: occupancy
          path: "/properties/{{property}}/occupancy"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-occupancy
              method: GET

Tracks food and beverage waste by pulling waste logs from the kitchen management system, recording metrics in Snowflake, and sending weekly reports via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Property F&B Waste Reduction Tracker"
  description: "Tracks food and beverage waste by pulling waste logs from the kitchen management system, recording metrics in Snowflake, and sending weekly reports via Microsoft Outlook."
  tags:
    - sustainability
    - food-and-beverage
    - snowflake
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: fb-waste
      port: 8080
      tools:
        - name: track-fb-waste
          description: "Track and report F&B waste for a property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: week_ending
              in: body
              type: string
              description: "Week ending date in YYYY-MM-DD."
          steps:
            - name: get-waste-logs
              type: call
              call: "kitchen-mgmt.get-waste-report"
              with:
                property: "{{property_code}}"
                week: "{{week_ending}}"
            - name: record-metrics
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO fb_waste_metrics (property_code, week_ending, total_waste_kg, waste_cost, diversion_rate) VALUES ('{{property_code}}', '{{week_ending}}', {{get-waste-logs.total_kg}}, {{get-waste-logs.total_cost}}, {{get-waste-logs.diversion_rate}})"
            - name: send-report
              type: call
              call: "outlook.send-email"
              with:
                to: "fb_director_{{property_code}}@hyatt.com"
                subject: "F&B Waste Report: {{property_code}} - Week {{week_ending}}"
                body: "Total waste: {{get-waste-logs.total_kg}}kg (${{get-waste-logs.total_cost}}). Diversion rate: {{get-waste-logs.diversion_rate}}%. Top waste category: {{get-waste-logs.top_category}}."
  consumes:
    - type: http
      namespace: kitchen-mgmt
      baseUri: "https://kitchen.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kitchen_mgmt_token"
      resources:
        - name: waste
          path: "/properties/{{property}}/waste?week={{week}}"
          inputParameters:
            - name: property
              in: path
            - name: week
              in: query
          operations:
            - name: get-waste-report
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://hyatt.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Orchestrates fire safety system checks by pulling sensor data from BMS, logging inspection results in ServiceNow, and notifying the safety officer via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Property Fire Safety System Check Orchestrator"
  description: "Orchestrates fire safety system checks by pulling sensor data from BMS, logging inspection results in ServiceNow, and notifying the safety officer via Microsoft Teams."
  tags:
    - safety
    - compliance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fire-safety
      port: 8080
      tools:
        - name: check-fire-safety
          description: "Check fire safety systems at a property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-sensor-status
              type: call
              call: "bms.get-fire-systems"
              with:
                property: "{{property_code}}"
            - name: log-inspection
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Fire safety inspection: {{property_code}}"
                category: "fire_safety"
                description: "Smoke detectors: {{get-sensor-status.smoke_ok}}. Sprinklers: {{get-sensor-status.sprinkler_ok}}. Alarms: {{get-sensor-status.alarm_ok}}."
            - name: notify-safety-officer
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-{{property_code}}-safety"
                text: "Fire safety check complete. Smoke: {{get-sensor-status.smoke_ok}}, Sprinkler: {{get-sensor-status.sprinkler_ok}}, Alarm: {{get-sensor-status.alarm_ok}}. Task: {{log-inspection.number}}."
  consumes:
    - type: http
      namespace: bms
      baseUri: "https://bms.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.bms_token"
      resources:
        - name: fire
          path: "/properties/{{property}}/fire-systems"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-fire-systems
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates food safety audits by pulling inspection checklists from ServiceNow, checking staff certifications in Workday, and archiving results in SharePoint.

naftiko: "0.5"
info:
  label: "Property Food Safety Audit Coordinator"
  description: "Coordinates food safety audits by pulling inspection checklists from ServiceNow, checking staff certifications in Workday, and archiving results in SharePoint."
  tags:
    - food-safety
    - compliance
    - servicenow
    - workday
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: food-safety-audit
      port: 8080
      tools:
        - name: coordinate-food-audit
          description: "Coordinate a property food safety audit."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: audit_date
              in: body
              type: string
              description: "Audit date in YYYY-MM-DD."
          steps:
            - name: get-checklist
              type: call
              call: "servicenow.get-template"
              with:
                template: "food_safety_audit"
            - name: verify-certifications
              type: call
              call: "workday.get-certifications"
              with:
                location: "property_{{property_code}}"
                cert_type: "food_handler"
            - name: archive-results
              type: call
              call: "sharepoint.upload-document"
              with:
                site_id: "food_safety"
                folder_path: "Audits/{{property_code}}/{{audit_date}}"
                file_name: "food_safety_audit_{{property_code}}.json"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: templates
          path: "/table/checklist_template?sysparm_query=name={{template}}"
          inputParameters:
            - name: template
              in: query
          operations:
            - name: get-template
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/certifications?location={{location}}&type={{cert_type}}"
          inputParameters:
            - name: location
              in: query
            - name: cert_type
              in: query
          operations:
            - name: get-certifications
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: uploads
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-document
              method: PUT

Generates the GM daily briefing by pulling occupancy from Opera PMS, guest satisfaction from Revinate, open issues from ServiceNow, and emailing via Outlook.

naftiko: "0.5"
info:
  label: "Property GM Daily Briefing Generator"
  description: "Generates the GM daily briefing by pulling occupancy from Opera PMS, guest satisfaction from Revinate, open issues from ServiceNow, and emailing via Outlook."
  tags:
    - operations
    - reporting
    - oracle-cloud
    - revinate
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: gm-briefing
      port: 8080
      tools:
        - name: generate-gm-briefing
          description: "Generate the daily GM briefing for a property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-occupancy
              type: call
              call: "opera.get-daily-stats"
              with:
                property: "{{property_code}}"
            - name: get-satisfaction
              type: call
              call: "revinate.get-daily-score"
              with:
                property: "{{property_code}}"
            - name: get-open-issues
              type: call
              call: "servicenow.get-incidents"
              with:
                query: "assignment_group.name=Property_{{property_code}}^state!=6"
            - name: send-briefing
              type: call
              call: "outlook.send-email"
              with:
                to: "gm_{{property_code}}@hyatt.com"
                subject: "Daily Briefing: {{property_code}}"
                body: "Occupancy: {{get-occupancy.occupancy_rate}}%. ADR: ${{get-occupancy.adr}}. RevPAR: ${{get-occupancy.revpar}}. Guest satisfaction: {{get-satisfaction.score}}/5. Open issues: {{get-open-issues.count}}."
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: stats
          path: "/properties/{{property}}/daily-stats"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-daily-stats
              method: GET
    - type: http
      namespace: revinate
      baseUri: "https://api.revinate.com/v2"
      authentication:
        type: bearer
        token: "$secrets.revinate_token"
      resources:
        - name: daily
          path: "/properties/{{property}}/daily-score"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-daily-score
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query={{query}}"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: get-incidents
              method: GET
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Handles property maintenance emergencies by creating a ServiceNow urgent ticket, dispatching a technician via ALICE, and notifying engineering leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Property Maintenance Emergency Handler"
  description: "Handles property maintenance emergencies by creating a ServiceNow urgent ticket, dispatching a technician via ALICE, and notifying engineering leadership via Microsoft Teams."
  tags:
    - maintenance
    - emergency
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: maintenance-emergency
      port: 8080
      tools:
        - name: handle-emergency
          description: "Handle a property maintenance emergency."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: issue_type
              in: body
              type: string
              description: "Issue type (plumbing, electrical, hvac, fire)."
            - name: location
              in: body
              type: string
              description: "Location within property (room number or area)."
          steps:
            - name: create-urgent-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "EMERGENCY: {{issue_type}} at {{property_code}} - {{location}}"
                urgency: "1"
                category: "facilities"
            - name: dispatch-engineer
              type: call
              call: "alice.create-request"
              with:
                property: "{{property_code}}"
                type: "engineering_emergency"
                location: "{{location}}"
                description: "{{issue_type}} emergency"
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-{{property_code}}-engineering"
                text: "EMERGENCY: {{issue_type}} at {{location}}. ServiceNow: {{create-urgent-ticket.number}}. ALICE dispatch: {{dispatch-engineer.request_id}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: requests
          path: "/requests"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a ServiceNow maintenance ticket for a Hyatt property issue, assigns it to the local engineering team, and notifies the property manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Property Maintenance Ticket Creator"
  description: "Creates a ServiceNow maintenance ticket for a Hyatt property issue, assigns it to the local engineering team, and notifies the property manager via Microsoft Teams."
  tags:
    - property-management
    - maintenance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: property-maintenance
      port: 8080
      tools:
        - name: create-maintenance-ticket
          description: "Create a maintenance work order for a property issue and notify the property manager."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code (e.g., CHIRC for Chicago Regency)."
            - name: issue_description
              in: body
              type: string
              description: "Description of the maintenance issue."
            - name: priority
              in: body
              type: string
              description: "Priority level: critical, high, medium, low."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-work-order"
              with:
                short_description: "Maintenance: {{property_code}} - {{issue_description}}"
                priority: "{{priority}}"
                assignment_group: "Property_Engineering_{{property_code}}"
                category: "facilities_maintenance"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property_ops_{{property_code}}"
                text: "New maintenance ticket {{create-ticket.number}}: {{issue_description}} (Priority: {{priority}})"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates new property pre-launch activities by creating a project in Jira, provisioning Opera PMS profiles, and notifying corporate teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Property Opening Pre-Launch Coordinator"
  description: "Coordinates new property pre-launch activities by creating a project in Jira, provisioning Opera PMS profiles, and notifying corporate teams via Microsoft Teams."
  tags:
    - property-development
    - launch
    - jira
    - oracle-cloud
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: property-launch
      port: 8080
      tools:
        - name: coordinate-pre-launch
          description: "Coordinate pre-launch activities for a new property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The new property code."
            - name: property_name
              in: body
              type: string
              description: "Property name."
            - name: opening_date
              in: body
              type: string
              description: "Opening date in YYYY-MM-DD."
          steps:
            - name: create-project
              type: call
              call: "jira.create-project"
              with:
                name: "Pre-Launch: {{property_name}} ({{property_code}})"
                key: "PL{{property_code}}"
                template: "property_opening"
            - name: provision-pms
              type: call
              call: "opera.create-property"
              with:
                code: "{{property_code}}"
                name: "{{property_name}}"
                opening_date: "{{opening_date}}"
            - name: notify-corporate
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-development"
                text: "Pre-launch initiated for {{property_name}} ({{property_code}}). Opening: {{opening_date}}. Jira: {{create-project.key}}. PMS provisioned."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hyatt.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: projects
          path: "/project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: properties
          path: "/properties"
          operations:
            - name: create-property
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks property renovation progress by pulling milestones from Jira, comparing budget spend in SAP, and reporting to stakeholders via a Power BI dashboard refresh.

naftiko: "0.5"
info:
  label: "Property Renovation Progress Tracker"
  description: "Tracks property renovation progress by pulling milestones from Jira, comparing budget spend in SAP, and reporting to stakeholders via a Power BI dashboard refresh."
  tags:
    - property-development
    - renovation
    - jira
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: renovation-tracker
      port: 8080
      tools:
        - name: track-renovation
          description: "Track property renovation progress."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira renovation project key."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-milestones
              type: call
              call: "jira.get-issues"
              with:
                jql: "project = '{{project_key}}' AND type = Milestone ORDER BY dueDate"
            - name: get-budget-spend
              type: call
              call: "sap.get-project-actuals"
              with:
                project_code: "REN_{{property_code}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "renovation-progress"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hyatt.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: get-issues
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/ZPS_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: actuals
          path: "/ProjectActualsSet('{{project_code}}')"
          inputParameters:
            - name: project_code
              in: path
          operations:
            - name: get-project-actuals
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Generates property revenue forecasts by pulling booking pace from Opera PMS, historical data from Snowflake, and publishing the forecast to Power BI.

naftiko: "0.5"
info:
  label: "Property Revenue Forecast Pipeline"
  description: "Generates property revenue forecasts by pulling booking pace from Opera PMS, historical data from Snowflake, and publishing the forecast to Power BI."
  tags:
    - revenue
    - forecasting
    - oracle-cloud
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: revenue-forecast
      port: 8080
      tools:
        - name: generate-revenue-forecast
          description: "Generate property revenue forecast."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: forecast_month
              in: body
              type: string
              description: "Forecast month in YYYY-MM."
          steps:
            - name: get-booking-pace
              type: call
              call: "opera.get-booking-pace"
              with:
                property: "{{property_code}}"
                month: "{{forecast_month}}"
            - name: get-historical
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT avg_revpar, avg_occupancy, avg_adr FROM property_history WHERE property_code = '{{property_code}}' AND month_name = '{{forecast_month}}'"
            - name: refresh-forecast-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "property-revenue-forecast"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: pace
          path: "/properties/{{property}}/booking-pace?month={{month}}"
          inputParameters:
            - name: property
              in: path
            - name: month
              in: query
          operations:
            - name: get-booking-pace
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://hyatt.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Handles property security incidents by creating a case in ServiceNow, alerting security leadership via Microsoft Teams, and logging evidence in SharePoint.

naftiko: "0.5"
info:
  label: "Property Security Incident Handler"
  description: "Handles property security incidents by creating a case in ServiceNow, alerting security leadership via Microsoft Teams, and logging evidence in SharePoint."
  tags:
    - security
    - operations
    - servicenow
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: security-incidents
      port: 8080
      tools:
        - name: handle-security-incident
          description: "Handle a property security incident."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: incident_type
              in: body
              type: string
              description: "Incident type."
            - name: location
              in: body
              type: string
              description: "Location within property."
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Security incident: {{property_code}} - {{incident_type}}"
                urgency: "1"
                category: "security"
                location: "{{location}}"
            - name: alert-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "security-operations"
                text: "SECURITY ALERT: {{incident_type}} at {{property_code}} ({{location}}). Case: {{create-case.number}}."
            - name: create-evidence-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "security_operations"
                folder_path: "Incidents/{{property_code}}/{{create-case.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST

Responds to social media crises by monitoring mentions via Twitter API, creating a ServiceNow incident, and escalating to the communications team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Property Social Media Crisis Handler"
  description: "Responds to social media crises by monitoring mentions via Twitter API, creating a ServiceNow incident, and escalating to the communications team via Microsoft Teams."
  tags:
    - communications
    - social-media
    - twitter
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-crisis
      port: 8080
      tools:
        - name: handle-social-crisis
          description: "Handle a social media crisis for a property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: post_url
              in: body
              type: string
              description: "URL of the problematic social post."
            - name: severity
              in: body
              type: string
              description: "Severity (low, medium, high, critical)."
          steps:
            - name: get-post-details
              type: call
              call: "twitter.get-tweet"
              with:
                url: "{{post_url}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Social media crisis: {{property_code}} - {{severity}}"
                description: "Post: {{post_url}}. Content: {{get-post-details.text}}. Engagement: {{get-post-details.retweet_count}} retweets."
                category: "communications"
            - name: escalate-comms
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "corporate-communications"
                text: "SOCIAL MEDIA ALERT ({{severity}}): {{property_code}}. Post: {{post_url}}. Retweets: {{get-post-details.retweet_count}}. Case: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_bearer_token"
      resources:
        - name: tweets
          path: "/tweets"
          operations:
            - name: get-tweet
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates Wi-Fi infrastructure upgrades by creating a project in Jira, scheduling downtime in ServiceNow, and notifying affected properties via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Property Wi-Fi Infrastructure Upgrade Coordinator"
  description: "Coordinates Wi-Fi infrastructure upgrades by creating a project in Jira, scheduling downtime in ServiceNow, and notifying affected properties via Microsoft Teams."
  tags:
    - it
    - network
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: wifi-upgrade
      port: 8080
      tools:
        - name: coordinate-wifi-upgrade
          description: "Coordinate a property Wi-Fi infrastructure upgrade."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: upgrade_date
              in: body
              type: string
              description: "Upgrade date."
          steps:
            - name: create-project
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                issue_type: "Task"
                summary: "Wi-Fi upgrade: {{property_code}} - {{upgrade_date}}"
            - name: schedule-maintenance-window
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Wi-Fi upgrade: {{property_code}}"
                scheduled_date: "{{upgrade_date}}"
                category: "network"
            - name: notify-property
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-{{property_code}}-it"
                text: "Wi-Fi infrastructure upgrade scheduled for {{upgrade_date}}. Change request: {{schedule-maintenance-window.number}}. Jira: {{create-project.key}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hyatt.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: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages restaurant reservation waitlists by checking availability in OpenTable, sending SMS notifications to guests via Twilio when tables open, and logging in the POS system.

naftiko: "0.5"
info:
  label: "Restaurant Reservation Waitlist Manager"
  description: "Manages restaurant reservation waitlists by checking availability in OpenTable, sending SMS notifications to guests via Twilio when tables open, and logging in the POS system."
  tags:
    - food-and-beverage
    - reservations
    - twilio
capability:
  exposes:
    - type: mcp
      namespace: restaurant-waitlist
      port: 8080
      tools:
        - name: manage-waitlist
          description: "Manage restaurant reservation waitlist."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: restaurant_id
              in: body
              type: string
              description: "The restaurant ID."
            - name: guest_phone
              in: body
              type: string
              description: "Guest phone number."
            - name: party_size
              in: body
              type: integer
              description: "Party size."
          steps:
            - name: check-availability
              type: call
              call: "opentable.check-tables"
              with:
                restaurant: "{{restaurant_id}}"
                party_size: "{{party_size}}"
            - name: notify-guest
              type: call
              call: "twilio.send-sms"
              with:
                to: "{{guest_phone}}"
                body: "Your table for {{party_size}} at Hyatt {{property_code}} is ready. Please proceed to the host stand. Expected wait: {{check-availability.wait_minutes}} min."
            - name: log-seating
              type: call
              call: "pos-system.create-cover"
              with:
                restaurant: "{{restaurant_id}}"
                party_size: "{{party_size}}"
                table: "{{check-availability.assigned_table}}"
  consumes:
    - type: http
      namespace: opentable
      baseUri: "https://platform.opentable.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.opentable_token"
      resources:
        - name: tables
          path: "/restaurants/{{restaurant}}/availability"
          inputParameters:
            - name: restaurant
              in: path
          operations:
            - name: check-tables
              method: GET
    - type: http
      namespace: twilio
      baseUri: "https://api.twilio.com/2010-04-01"
      authentication:
        type: basic
        username: "$secrets.twilio_account_sid"
        password: "$secrets.twilio_auth_token"
      resources:
        - name: messages
          path: "/Accounts/$secrets.twilio_account_sid/Messages.json"
          operations:
            - name: send-sms
              method: POST
    - type: http
      namespace: pos-system
      baseUri: "https://pos.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pos_token"
      resources:
        - name: covers
          path: "/covers"
          operations:
            - name: create-cover
              method: POST

Pulls daily revenue figures from Oracle Hospitality OPERA and returns property-level ADR, occupancy rate, and RevPAR for a given date range.

naftiko: "0.5"
info:
  label: "Revenue Dashboard Data Retriever"
  description: "Pulls daily revenue figures from Oracle Hospitality OPERA and returns property-level ADR, occupancy rate, and RevPAR for a given date range."
  tags:
    - revenue
    - hospitality
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: revenue-analytics
      port: 8080
      tools:
        - name: get-revenue-metrics
          description: "Retrieve ADR, occupancy, and RevPAR for a property over a date range."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Hyatt property code."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "opera.get-revenue-stats"
          with:
            property_code: "{{property_code}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: adr
              type: string
              mapping: "$.statistics.averageDailyRate"
            - name: occupancy_rate
              type: string
              mapping: "$.statistics.occupancyPercentage"
            - name: revpar
              type: string
              mapping: "$.statistics.revPAR"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: statistics
          path: "/properties/{{property_code}}/statistics"
          inputParameters:
            - name: property_code
              in: path
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-revenue-stats
              method: GET

Retrieves the guest sentiment score and key themes from Revinate reputation management platform for a Hyatt property.

naftiko: "0.5"
info:
  label: "Revinate Guest Sentiment Score"
  description: "Retrieves the guest sentiment score and key themes from Revinate reputation management platform for a Hyatt property."
  tags:
    - guest-experience
    - reputation
    - revinate
capability:
  exposes:
    - type: mcp
      namespace: guest-sentiment
      port: 8080
      tools:
        - name: get-sentiment-score
          description: "Get guest sentiment score from Revinate."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Revinate property ID."
          call: "revinate.get-score"
          with:
            property: "{{property_id}}"
          outputParameters:
            - name: overall_score
              type: number
              mapping: "$.score.overall"
            - name: top_positive_theme
              type: string
              mapping: "$.themes.positive[0]"
            - name: top_negative_theme
              type: string
              mapping: "$.themes.negative[0]"
  consumes:
    - type: http
      namespace: revinate
      baseUri: "https://api.revinate.com/v2"
      authentication:
        type: bearer
        token: "$secrets.revinate_token"
      resources:
        - name: scores
          path: "/properties/{{property}}/sentiment"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: get-score
              method: GET

When a Salesforce guest support case is escalated, creates a corresponding ServiceNow incident and links the two records for cross-platform tracking.

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to ServiceNow"
  description: "When a Salesforce guest support case is escalated, creates a corresponding ServiceNow incident and links the two records for cross-platform tracking."
  tags:
    - guest-services
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: case-escalation
      port: 8080
      tools:
        - name: escalate-case
          description: "Escalate a Salesforce case to ServiceNow and link the records."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Escalated: {{get-case.Subject}}"
                description: "{{get-case.Description}}"
                priority: "{{get-case.Priority}}"
                correlation_id: "{{case_id}}"
            - name: update-case
              type: call
              call: "salesforce.update-case"
              with:
                case_id: "{{case_id}}"
                servicenow_number: "{{create-incident.number}}"
                status: "Escalated"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
            - name: update-case
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves group booking details from Salesforce including room block size, contracted rate, and event dates.

naftiko: "0.5"
info:
  label: "Salesforce Group Booking Lookup"
  description: "Retrieves group booking details from Salesforce including room block size, contracted rate, and event dates."
  tags:
    - sales
    - group-bookings
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: group-bookings
      port: 8080
      tools:
        - name: get-group-booking
          description: "Look up a group booking by opportunity ID."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: "salesforce.get-opportunity"
          with:
            id: "{{opportunity_id}}"
          outputParameters:
            - name: group_name
              type: string
              mapping: "$.Name"
            - name: room_nights
              type: integer
              mapping: "$.Room_Nights__c"
            - name: contracted_rate
              type: number
              mapping: "$.Contracted_Rate__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-opportunity
              method: GET

Triggers a refresh of a Salesforce Lightning dashboard for hotel sales and returns the current snapshot data.

naftiko: "0.5"
info:
  label: "Salesforce Lightning Dashboard Refresher"
  description: "Triggers a refresh of a Salesforce Lightning dashboard for hotel sales and returns the current snapshot data."
  tags:
    - sales
    - reporting
    - salesforce-lightning
capability:
  exposes:
    - type: mcp
      namespace: sales-dashboards
      port: 8080
      tools:
        - name: refresh-dashboard
          description: "Trigger and retrieve a Salesforce Lightning dashboard refresh."
          inputParameters:
            - name: dashboard_id
              in: body
              type: string
              description: "The Salesforce dashboard ID."
          call: "salesforce.refresh-dashboard"
          with:
            dashboard_id: "{{dashboard_id}}"
          outputParameters:
            - name: last_refreshed
              type: string
              mapping: "$.lastRefreshDate"
            - name: components
              type: string
              mapping: "$.componentData"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: dashboards
          path: "/analytics/dashboards/{{dashboard_id}}"
          inputParameters:
            - name: dashboard_id
              in: path
          operations:
            - name: refresh-dashboard
              method: PUT

Retrieves the general ledger balance for a property cost center from SAP Financials for a given fiscal period.

naftiko: "0.5"
info:
  label: "SAP Property GL Balance Lookup"
  description: "Retrieves the general ledger balance for a property cost center from SAP Financials for a given fiscal period."
  tags:
    - finance
    - accounting
    - sap
capability:
  exposes:
    - type: mcp
      namespace: property-finance
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Look up GL balance for a property cost center."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The property cost center code."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYY-MM."
          call: "sap.get-balance"
          with:
            cost_center: "{{cost_center}}"
            period: "{{fiscal_period}}"
          outputParameters:
            - name: revenue
              type: number
              mapping: "$.d.Revenue"
            - name: expenses
              type: number
              mapping: "$.d.TotalExpenses"
            - name: net_income
              type: number
              mapping: "$.d.NetIncome"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/ZFI_GL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: balances
          path: "/GLBalanceSet(CostCenter='{{cost_center}}',Period='{{period}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: period
              in: path
          operations:
            - name: get-balance
              method: GET

Retrieves a SAP purchase order for hotel procurement, returning vendor, total amount, delivery status, and line items.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Retrieves a SAP purchase order for hotel procurement, returning vendor, total amount, delivery status, and line items."
  tags:
    - procurement
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Forecasts seasonal staffing needs by pulling booking pace from Opera PMS, historical headcount from Workday, and publishing hiring requisitions via the recruiting platform.

naftiko: "0.5"
info:
  label: "Seasonal Staffing Forecast Pipeline"
  description: "Forecasts seasonal staffing needs by pulling booking pace from Opera PMS, historical headcount from Workday, and publishing hiring requisitions via the recruiting platform."
  tags:
    - hr
    - staffing
    - oracle-cloud
    - workday
capability:
  exposes:
    - type: mcp
      namespace: staffing-forecast
      port: 8080
      tools:
        - name: forecast-staffing
          description: "Forecast seasonal staffing needs for a property."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: season
              in: body
              type: string
              description: "Season (spring, summer, fall, winter)."
          steps:
            - name: get-booking-forecast
              type: call
              call: "opera.get-seasonal-forecast"
              with:
                property: "{{property_code}}"
                season: "{{season}}"
            - name: get-current-headcount
              type: call
              call: "workday.get-headcount"
              with:
                location: "property_{{property_code}}"
            - name: create-requisitions
              type: call
              call: "recruiting.create-bulk-reqs"
              with:
                property: "{{property_code}}"
                forecast_occupancy: "{{get-booking-forecast.avg_occupancy}}"
                current_headcount: "{{get-current-headcount.count}}"
                season: "{{season}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: forecast
          path: "/properties/{{property}}/seasonal-forecast?season={{season}}"
          inputParameters:
            - name: property
              in: path
            - name: season
              in: query
          operations:
            - name: get-seasonal-forecast
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/headcount?location={{location}}"
          inputParameters:
            - name: location
              in: query
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: recruiting
      baseUri: "https://recruiting.hyatt.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.recruiting_token"
      resources:
        - name: requisitions
          path: "/requisitions/bulk"
          operations:
            - name: create-bulk-reqs
              method: POST

Sends personalized pre-arrival emails to guests via SendGrid with property details and upsell offers.

naftiko: "0.5"
info:
  label: "SendGrid Guest Pre-Arrival Email"
  description: "Sends personalized pre-arrival emails to guests via SendGrid with property details and upsell offers."
  tags:
    - guest-experience
    - email
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: pre-arrival-email
      port: 8080
      tools:
        - name: send-pre-arrival
          description: "Send a pre-arrival email to a guest."
          inputParameters:
            - name: guest_email
              in: body
              type: string
              description: "Guest email address."
            - name: guest_name
              in: body
              type: string
              description: "Guest first name."
            - name: property_name
              in: body
              type: string
              description: "Property name."
            - name: check_in_date
              in: body
              type: string
              description: "Check-in date."
          call: "sendgrid.send-email"
          with:
            to: "{{guest_email}}"
            template_id: "pre_arrival"
            dynamic_data:
              name: "{{guest_name}}"
              property: "{{property_name}}"
              check_in: "{{check_in_date}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.messageId"
  consumes:
    - 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 ServiceNow incident by number and returns its current state, assigned group, priority, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves a ServiceNow incident by number and returns its current state, assigned group, priority, and resolution notes."
  tags:
    - it-operations
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: incident-status
      port: 8080
      tools:
        - name: get-incident-status
          description: "Look up a ServiceNow incident by number and return key fields."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: resolution_notes
              type: string
              mapping: "$.result.close_notes"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hyatt.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: sysparm_query
              in: query
              value: "number={{incident_number}}"
          operations:
            - name: get-incident
              method: GET

Retrieves a document from a property's SharePoint site by file name and path, returning the download URL and metadata.

naftiko: "0.5"
info:
  label: "SharePoint Property Document Retriever"
  description: "Retrieves a document from a property's SharePoint site by file name and path, returning the download URL and metadata."
  tags:
    - documents
    - property-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: property-docs
      port: 8080
      tools:
        - name: get-property-document
          description: "Retrieve a document from a property's SharePoint site."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID for the property."
            - name: file_path
              in: body
              type: string
              description: "Path to the file within the document library."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
          outputParameters:
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
            - name: file_name
              type: string
              mapping: "$.name"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET

Sends operational notifications to property-specific Slack channels for real-time team communication.

naftiko: "0.5"
info:
  label: "Slack Property Operations Notifier"
  description: "Sends operational notifications to property-specific Slack channels for real-time team communication."
  tags:
    - communications
    - operations
    - slack
capability:
  exposes:
    - type: mcp
      namespace: property-notifications
      port: 8080
      tools:
        - name: send-property-notification
          description: "Send an operational notification to a property Slack channel."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: message
              in: body
              type: string
              description: "The notification message."
          call: "slack.post-message"
          with:
            channel: "property-{{property_code}}-ops"
            text: "{{message}}"
          outputParameters:
            - name: message_ts
              type: string
              mapping: "$.ts"
  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 predefined analytics query against the Hyatt Snowflake data warehouse to retrieve guest stay history, spend patterns, and loyalty metrics.

naftiko: "0.5"
info:
  label: "Snowflake Guest Analytics Query"
  description: "Executes a predefined analytics query against the Hyatt Snowflake data warehouse to retrieve guest stay history, spend patterns, and loyalty metrics."
  tags:
    - analytics
    - data
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: guest-analytics
      port: 8080
      tools:
        - name: query-guest-analytics
          description: "Run a guest analytics query in Snowflake."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The World of Hyatt loyalty member ID."
          call: "snowflake.execute-query"
          with:
            statement: "SELECT total_stays, total_spend, avg_stay_duration, preferred_brand FROM GUEST_ANALYTICS.MEMBER_SUMMARY WHERE member_id = '{{member_id}}'"
          outputParameters:
            - name: total_stays
              type: string
              mapping: "$.data[0][0]"
            - name: total_spend
              type: string
              mapping: "$.data[0][1]"
            - name: avg_stay_duration
              type: string
              mapping: "$.data[0][2]"
            - name: preferred_brand
              type: string
              mapping: "$.data[0][3]"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://hyatt.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for RevPAR, occupancy rate, and ADR metrics by property and date range.

naftiko: "0.5"
info:
  label: "Snowflake RevPAR Analytics Query"
  description: "Queries Snowflake for RevPAR, occupancy rate, and ADR metrics by property and date range."
  tags:
    - analytics
    - revenue
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: revpar-analytics
      port: 8080
      tools:
        - name: query-revpar
          description: "Query RevPAR analytics from Snowflake."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: date_range
              in: body
              type: string
              description: "Date range in YYYY-MM-DD/YYYY-MM-DD."
          call: "snowflake.execute-query"
          with:
            statement: "SELECT revpar, occupancy_rate, adr FROM property_performance WHERE property_code = '{{property_code}}' AND date BETWEEN '{{date_range}}'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://hyatt.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a spa appointment is booked through the OPERA POS module, sends a confirmation to the guest via WhatsApp and logs the appointment in Google Sheets for the spa manager.

naftiko: "0.5"
info:
  label: "Spa Appointment Booking Notifier"
  description: "When a spa appointment is booked through the OPERA POS module, sends a confirmation to the guest via WhatsApp and logs the appointment in Google Sheets for the spa manager."
  tags:
    - guest-services
    - hospitality
    - oracle
    - whatsapp
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: spa-bookings
      port: 8080
      tools:
        - name: notify-spa-booking
          description: "Confirm a spa booking via WhatsApp and log it in Google Sheets."
          inputParameters:
            - name: appointment_id
              in: body
              type: string
              description: "The OPERA spa appointment ID."
          steps:
            - name: get-appointment
              type: call
              call: "opera.get-spa-appointment"
              with:
                appointment_id: "{{appointment_id}}"
            - name: send-confirmation
              type: call
              call: "whatsapp.send-message"
              with:
                phone: "{{get-appointment.guest_phone}}"
                template: "spa_confirmation"
                parameters: "{{get-appointment.service_name}},{{get-appointment.date_time}}"
            - name: log-in-sheets
              type: call
              call: "gsheets.append-row"
              with:
                spreadsheet_id: "spa_schedule"
                range: "Appointments!A:E"
                values: "{{get-appointment.date_time}},{{get-appointment.guest_name}},{{get-appointment.service_name}},{{get-appointment.therapist}},{{get-appointment.amount}}"
  consumes:
    - type: http
      namespace: opera
      baseUri: "https://hyatt-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.opera_token"
      resources:
        - name: spa-appointments
          path: "/spa/appointments/{{appointment_id}}"
          inputParameters:
            - name: appointment_id
              in: path
          operations:
            - name: get-spa-appointment
              method: GET
    - type: http
      namespace: whatsapp
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{phone_number_id}}/messages"
          inputParameters:
            - name: phone_number_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-row
              method: POST

Manages end-to-end spa appointment booking across Hyatt properties, coordinating therapist availability, guest preferences, and confirmation notifications.

naftiko: "0.5"
info:
  label: "Spa Appointment Booking Orchestrator"
  description: "Manages end-to-end spa appointment booking across Hyatt properties, coordinating therapist availability, guest preferences, and confirmation notifications."
  tags:
    - hospitality
    - spa-services
    - booking
capability:
  exposes:
    - type: mcp
      namespace: spa-booking
      port: 8080
      tools:
        - name: book-spa-appointment
          description: "Book a spa appointment for a hotel guest."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Hyatt property identifier."
            - name: guest_id
              in: body
              type: string
              description: "The guest loyalty profile ID."
            - name: service_type
              in: body
              type: string
              description: "Type of spa service requested."
            - name: preferred_datetime
              in: body
              type: string
              description: "Preferred appointment datetime in ISO 8601 format."
          call: "spa-reservation-api.create-booking"
          with:
            property: "{{property_id}}"
            guest: "{{guest_id}}"
            service: "{{service_type}}"
            datetime: "{{preferred_datetime}}"
          outputParameters:
            - name: confirmation_number
              type: string
              mapping: "$.booking.confirmationNumber"
            - name: therapist_name
              type: string
              mapping: "$.booking.therapistAssigned"
            - name: appointment_time
              type: string
              mapping: "$.booking.confirmedDatetime"
  consumes:
    - type: http
      namespace: spa-reservation-api
      baseUri: "https://api.hyatt.com/spa/v1"
      authentication:
        type: bearer
        token: "$secrets.hyatt_spa_api_token"
      resources:
        - name: bookings
          path: "/properties/{{property}}/bookings"
          inputParameters:
            - name: property
              in: path
          operations:
            - name: create-booking
              method: POST

Searches Splunk for guest Wi-Fi usage and authentication logs by property code and time range.

naftiko: "0.5"
info:
  label: "Splunk Guest Wi-Fi Log Search"
  description: "Searches Splunk for guest Wi-Fi usage and authentication logs by property code and time range."
  tags:
    - it
    - network
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: wifi-logs
      port: 8080
      tools:
        - name: search-wifi-logs
          description: "Search guest Wi-Fi logs in Splunk."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
            - name: hours_back
              in: body
              type: integer
              description: "Hours to search back."
          call: "splunk.search"
          with:
            search: "search index=network property={{property_code}} source=wifi earliest=-{{hours_back}}h | stats count by status"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.hyatt.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Retrieves recent guest reviews and overall rating from TripAdvisor for a Hyatt property.

naftiko: "0.5"
info:
  label: "TripAdvisor Property Review Monitor"
  description: "Retrieves recent guest reviews and overall rating from TripAdvisor for a Hyatt property."
  tags:
    - guest-experience
    - reviews
    - tripadvisor
capability:
  exposes:
    - type: mcp
      namespace: tripadvisor-reviews
      port: 8080
      tools:
        - name: get-property-reviews
          description: "Fetch recent TripAdvisor reviews for a property."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The TripAdvisor location ID."
          call: "tripadvisor.get-reviews"
          with:
            location_id: "{{property_id}}"
          outputParameters:
            - name: overall_rating
              type: number
              mapping: "$.rating"
            - name: review_count
              type: integer
              mapping: "$.num_reviews"
            - name: latest_review
              type: string
              mapping: "$.reviews[0].text"
  consumes:
    - type: http
      namespace: tripadvisor
      baseUri: "https://api.tripadvisor.com/api/partner/2.0"
      authentication:
        type: apiKey
        key: "$secrets.tripadvisor_api_key"
      resources:
        - name: reviews
          path: "/location/{{location_id}}/reviews"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-reviews
              method: GET

Searches recent Twitter mentions of Hyatt brand handles and returns recent tweets, sentiment indicators, and engagement counts.

naftiko: "0.5"
info:
  label: "Twitter Brand Mention Monitor"
  description: "Searches recent Twitter mentions of Hyatt brand handles and returns recent tweets, sentiment indicators, and engagement counts."
  tags:
    - marketing
    - social-media
    - twitter
capability:
  exposes:
    - type: mcp
      namespace: twitter-monitoring
      port: 8080
      tools:
        - name: get-brand-mentions
          description: "Search recent Twitter mentions of Hyatt brands."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Twitter search query (e.g., @Hyatt OR #WorldOfHyatt)."
          call: "twitter.search-tweets"
          with:
            query: "{{query}}"
          outputParameters:
            - name: tweets
              type: string
              mapping: "$.data"
            - name: result_count
              type: string
              mapping: "$.meta.result_count"
  consumes:
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_bearer_token"
      resources:
        - name: tweets
          path: "/tweets/search/recent"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-tweets
              method: GET

Processes vendor invoices by matching against SAP purchase orders, routing for approval in Workday, and posting the payment in Oracle Cloud Financials.

naftiko: "0.5"
info:
  label: "Vendor Invoice Approval Pipeline"
  description: "Processes vendor invoices by matching against SAP purchase orders, routing for approval in Workday, and posting the payment in Oracle Cloud Financials."
  tags:
    - finance
    - accounts-payable
    - sap
    - workday
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: invoice-approval
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Process and approve a vendor invoice."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The vendor invoice number."
            - name: vendor_id
              in: body
              type: string
              description: "The vendor ID."
          steps:
            - name: match-po
              type: call
              call: "sap.match-invoice-to-po"
              with:
                invoice: "{{invoice_number}}"
                vendor: "{{vendor_id}}"
            - name: route-approval
              type: call
              call: "workday.create-approval"
              with:
                type: "invoice_approval"
                amount: "{{match-po.invoice_amount}}"
                vendor: "{{vendor_id}}"
                po_number: "{{match-po.po_number}}"
            - name: post-payment
              type: call
              call: "oracle-financials.post-payment"
              with:
                invoice: "{{invoice_number}}"
                amount: "{{match-po.invoice_amount}}"
                approval_ref: "{{route-approval.approval_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hyatt-s4.sap.com/sap/opu/odata/sap/ZFI_AP_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/InvoiceMatchSet"
          operations:
            - name: match-invoice-to-po
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: approvals
          path: "/approvals"
          operations:
            - name: create-approval
              method: POST
    - type: http
      namespace: oracle-financials
      baseUri: "https://hyatt-fa.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: payments
          path: "/payablesPayments"
          operations:
            - name: post-payment
              method: POST

Prepares for VIP guest arrivals by pulling loyalty profile from the WoH system, creating special requests in ALICE, and notifying the front desk via Slack.

naftiko: "0.5"
info:
  label: "VIP Guest Arrival Preparation Orchestrator"
  description: "Prepares for VIP guest arrivals by pulling loyalty profile from the WoH system, creating special requests in ALICE, and notifying the front desk via Slack."
  tags:
    - guest-experience
    - vip
    - slack
capability:
  exposes:
    - type: mcp
      namespace: vip-arrival
      port: 8080
      tools:
        - name: prepare-vip-arrival
          description: "Prepare for a VIP guest arrival."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
            - name: property_code
              in: body
              type: string
              description: "The property code."
          steps:
            - name: get-loyalty-profile
              type: call
              call: "loyalty.get-member-profile"
              with:
                reservation_id: "{{reservation_id}}"
            - name: create-amenity-request
              type: call
              call: "alice.create-request"
              with:
                reservation: "{{reservation_id}}"
                type: "amenity_delivery"
                description: "VIP amenity: {{get-loyalty-profile.tier}} tier welcome package. Preferences: {{get-loyalty-profile.preferences}}"
            - name: notify-front-desk
              type: call
              call: "slack.post-message"
              with:
                channel: "property-{{property_code}}-front-desk"
                text: "VIP arrival today: {{get-loyalty-profile.guest_name}} ({{get-loyalty-profile.tier}}). Reservation: {{reservation_id}}. Lifetime nights: {{get-loyalty-profile.lifetime_nights}}. Amenity request: {{create-amenity-request.request_id}}."
  consumes:
    - type: http
      namespace: loyalty
      baseUri: "https://loyalty.hyatt.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.loyalty_token"
      resources:
        - name: profiles
          path: "/reservations/{{reservation_id}}/member-profile"
          inputParameters:
            - name: reservation_id
              in: path
          operations:
            - name: get-member-profile
              method: GET
    - type: http
      namespace: alice
      baseUri: "https://api.aliceapp.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alice_token"
      resources:
        - name: requests
          path: "/requests"
          operations:
            - name: create-request
              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 employee benefits enrollment details from Workday including health plan, 401k contribution, and PTO balance.

naftiko: "0.5"
info:
  label: "Workday Employee Benefits Lookup"
  description: "Retrieves employee benefits enrollment details from Workday including health plan, 401k contribution, and PTO balance."
  tags:
    - hr
    - benefits
    - workday
capability:
  exposes:
    - type: mcp
      namespace: employee-benefits
      port: 8080
      tools:
        - name: get-benefits
          description: "Look up employee benefits enrollment."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday.get-benefits"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: health_plan
              type: string
              mapping: "$.benefits.healthPlan"
            - name: retirement_contribution
              type: string
              mapping: "$.benefits.retirementContribution"
            - name: pto_balance
              type: number
              mapping: "$.benefits.ptoBalance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/workers/{{worker_id}}/benefits"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-benefits
              method: GET

Retrieves a payroll summary for an employee from Workday, returning gross pay, net pay, deductions, and pay period.

naftiko: "0.5"
info:
  label: "Workday Payroll Summary Retriever"
  description: "Retrieves a payroll summary for an employee from Workday, returning gross pay, net pay, deductions, and pay period."
  tags:
    - hr
    - payroll
    - workday
capability:
  exposes:
    - type: mcp
      namespace: payroll
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Retrieve the latest payroll summary for an employee."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-payslip"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: gross_pay
              type: string
              mapping: "$.payslip.grossPay"
            - name: net_pay
              type: string
              mapping: "$.payslip.netPay"
            - name: deductions
              type: string
              mapping: "$.payslip.totalDeductions"
            - name: pay_period
              type: string
              mapping: "$.payslip.payPeriod"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payslips
          path: "/workers/{{worker_id}}/paySlips"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-payslip
              method: GET

Retrieves video performance analytics from YouTube for Hyatt property promotional videos, returning views, watch time, and engagement rate.

naftiko: "0.5"
info:
  label: "YouTube Property Video Performance Tracker"
  description: "Retrieves video performance analytics from YouTube for Hyatt property promotional videos, returning views, watch time, and engagement rate."
  tags:
    - marketing
    - social-media
    - youtube
capability:
  exposes:
    - type: mcp
      namespace: youtube-analytics
      port: 8080
      tools:
        - name: get-video-performance
          description: "Retrieve YouTube video performance metrics for a property video."
          inputParameters:
            - name: video_id
              in: body
              type: string
              description: "The YouTube video ID."
          call: "youtube.get-analytics"
          with:
            video_id: "{{video_id}}"
          outputParameters:
            - name: views
              type: string
              mapping: "$.items[0].statistics.viewCount"
            - name: watch_time
              type: string
              mapping: "$.items[0].statistics.watchTimeMinutes"
            - name: likes
              type: string
              mapping: "$.items[0].statistics.likeCount"
  consumes:
    - type: http
      namespace: youtube
      baseUri: "https://www.googleapis.com/youtube/v3"
      authentication:
        type: apiKey
        name: "key"
        in: query
        value: "$secrets.youtube_api_key"
      resources:
        - name: videos
          path: "/videos"
          inputParameters:
            - name: id
              in: query
              value: "{{video_id}}"
            - name: part
              in: query
              value: "statistics"
          operations:
            - name: get-analytics
              method: GET

Enriches a Salesforce account with firmographic data from ZoomInfo, updating company size, revenue, and industry classification for sales targeting.

naftiko: "0.5"
info:
  label: "ZoomInfo Account Enrichment"
  description: "Enriches a Salesforce account with firmographic data from ZoomInfo, updating company size, revenue, and industry classification for sales targeting."
  tags:
    - sales
    - data-enrichment
    - zoominfo
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: account-enrichment
      port: 8080
      tools:
        - name: enrich-account
          description: "Enrich a Salesforce account record with ZoomInfo firmographic data."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: company_name
              in: body
              type: string
              description: "Company name for ZoomInfo lookup."
          steps:
            - name: search-zoominfo
              type: call
              call: "zoominfo.search-company"
              with:
                company_name: "{{company_name}}"
            - name: update-account
              type: call
              call: "salesforce.update-account"
              with:
                account_id: "{{account_id}}"
                employees: "{{search-zoominfo.employeeCount}}"
                revenue: "{{search-zoominfo.revenue}}"
                industry: "{{search-zoominfo.industry}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/search/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hyatt.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