Carnival Corporation Capabilities

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

Sort
Expand

Retrieves booking funnel conversion data from Adobe Analytics for cruise line websites.

naftiko: "0.5"
info:
  label: "Adobe Analytics Cruise Booking Funnel"
  description: "Retrieves booking funnel conversion data from Adobe Analytics for cruise line websites."
  tags:
    - marketing
    - adobe-analytics
    - reporting
    - maritime
capability:
  exposes:
    - type: mcp
      namespace: digital-analytics
      port: 8080
      tools:
        - name: get-booking-funnel
          description: "Given a date range, retrieve cruise booking funnel metrics."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          call: "adobe-analytics.get-funnel-report"
          with:
            report_suite: "carnival-booking"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: search_to_select_rate
              type: string
              mapping: "$.report.data.steps[0].conversion_rate"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api/carnival"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-funnel-report
              method: POST

Given a guest booking ID, retrieves itinerary details from Salesforce and uses the Anthropic API to generate a personalized voyage summary for the guest welcome communication.

naftiko: "0.5"
info:
  label: "AI-Assisted Guest Itinerary Summarizer"
  description: "Given a guest booking ID, retrieves itinerary details from Salesforce and uses the Anthropic API to generate a personalized voyage summary for the guest welcome communication."
  tags:
    - ai
    - salesforce
    - anthropic
    - guest-services
    - personalization
capability:
  exposes:
    - type: mcp
      namespace: itinerary-ai
      port: 8080
      tools:
        - name: generate-itinerary-summary
          description: "Given a booking ID, retrieve voyage itinerary details from Salesforce and generate a personalized, guest-friendly summary using the Anthropic Claude API."
          inputParameters:
            - name: booking_id
              in: body
              type: string
              description: "The Salesforce booking ID for the guest voyage."
            - name: guest_name
              in: body
              type: string
              description: "The guest's first name for personalization."
          steps:
            - name: get-itinerary
              type: call
              call: salesforce-itinerary.get-voyage-itinerary
              with:
                booking_id: "{{booking_id}}"
            - name: generate-summary
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Write a warm, personalized voyage summary for {{guest_name}} based on this itinerary: {{get-itinerary.ports_of_call}}. Include highlights for each port."
  consumes:
    - type: http
      namespace: salesforce-itinerary
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: voyage-itineraries
          path: "/sobjects/Booking__c/{{booking_id}}"
          inputParameters:
            - name: booking_id
              in: path
          operations:
            - name: get-voyage-itinerary
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST

Retrieves metadata for archived guest photos from Amazon S3 by booking reference, returning file count, total size, and last modified date.

naftiko: "0.5"
info:
  label: "Amazon S3 Guest Photo Archive Lookup"
  description: "Retrieves metadata for archived guest photos from Amazon S3 by booking reference, returning file count, total size, and last modified date."
  tags:
    - guest-services
    - photo-archive
    - amazon-s3
capability:
  exposes:
    - type: mcp
      namespace: photo-archive
      port: 8080
      tools:
        - name: get-photo-archive
          description: "Look up guest photo archive metadata in S3."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "Guest booking reference."
          call: "s3.list-objects"
          with:
            prefix: "guest-photos/{{booking_ref}}/"
          outputParameters:
            - name: file_count
              type: number
              mapping: "$.KeyCount"
            - name: total_size_mb
              type: number
              mapping: "$.TotalSizeMB"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://carnival-guest-photos.s3.amazonaws.com"
      authentication:
        type: apiKey
        key: "$secrets.aws_access_key"
      resources:
        - name: objects
          path: "/?list-type=2&prefix={{prefix}}"
          inputParameters:
            - name: prefix
              in: query
          operations:
            - name: list-objects
              method: GET

Verifies integrity of voyage data backups in Amazon S3, checking object counts and timestamps.

naftiko: "0.5"
info:
  label: "Amazon S3 Voyage Data Backup"
  description: "Verifies integrity of voyage data backups in Amazon S3, checking object counts and timestamps."
  tags:
    - infrastructure
    - amazon-s3
    - data-protection
    - maritime
capability:
  exposes:
    - type: mcp
      namespace: backup-ops
      port: 8080
      tools:
        - name: verify-voyage-backup
          description: "Given an S3 bucket and prefix, verify backup completeness."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The S3 bucket name."
            - name: prefix
              in: body
              type: string
              description: "The S3 key prefix."
          call: "s3.list-objects"
          with:
            bucket: "{{bucket_name}}"
            prefix: "{{prefix}}"
          outputParameters:
            - name: object_count
              type: string
              mapping: "$.KeyCount"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        access_key: "$secrets.aws_access_key"
        secret_key: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{bucket}}"
          inputParameters:
            - name: bucket
              in: path
          operations:
            - name: list-objects
              method: GET

Initiates quarterly access reviews in Azure AD, creates ServiceNow tickets, and notifies security via Teams.

naftiko: "0.5"
info:
  label: "Azure AD Access Review Trigger"
  description: "Initiates quarterly access reviews in Azure AD, creates ServiceNow tickets, and notifies security via Teams."
  tags:
    - security
    - azure-active-directory
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-governance
      port: 8080
      tools:
        - name: trigger-access-review
          description: "Given an app ID, create access review and track via ServiceNow."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Azure AD application ID."
          steps:
            - name: create-review
              type: call
              call: "azuread.create-access-review"
              with:
                app_id: "{{app_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Access review for app {{app_id}}"
                category: "security_compliance"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "security-team"
                message: "Access review created for {{app_id}}. Ticket: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: access-reviews
          path: "/identityGovernance/accessReviews/definitions"
          operations:
            - name: create-access-review
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Azure Databricks fleet analytics pipelines, detects failures, and escalates via ServiceNow and Teams.

naftiko: "0.5"
info:
  label: "Azure Databricks Fleet Analytics"
  description: "Monitors Azure Databricks fleet analytics pipelines, detects failures, and escalates via ServiceNow and Teams."
  tags:
    - data-engineering
    - azure-databricks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-fleet-pipeline
          description: "Given a Databricks job ID, check latest run and escalate failures."
          inputParameters:
            - name: job_id
              in: body
              type: string
              description: "The Databricks job ID."
          steps:
            - name: get-run
              type: call
              call: "databricks.get-latest-run"
              with:
                job_id: "{{job_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Fleet analytics failure: job {{job_id}}"
                category: "data_engineering"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-engineering"
                message: "Fleet pipeline failure: Job {{job_id}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://carnival-databricks.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/list"
          operations:
            - name: get-latest-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Azure Databricks for vessel fuel consumption analytics by voyage, returning total consumption, cost, and efficiency metrics.

naftiko: "0.5"
info:
  label: "Azure Databricks Fuel Analytics Query"
  description: "Queries Azure Databricks for vessel fuel consumption analytics by voyage, returning total consumption, cost, and efficiency metrics."
  tags:
    - operations
    - fuel-management
    - azure-databricks
capability:
  exposes:
    - type: mcp
      namespace: fuel-analytics
      port: 8080
      tools:
        - name: query-fuel-analytics
          description: "Query Databricks for vessel fuel consumption analytics."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          call: "databricks.run-query"
          with:
            vessel_code: "{{vessel_code}}"
            voyage_id: "{{voyage_id}}"
          outputParameters:
            - name: total_consumption_mt
              type: number
              mapping: "$.data[0].total_mt"
            - name: cost_usd
              type: number
              mapping: "$.data[0].cost_usd"
            - name: efficiency_nm_per_mt
              type: number
              mapping: "$.data[0].efficiency"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST

Creates a ServiceNow change request for a new Azure resource provisioning event, linking it to the relevant project budget in SAP for cost governance.

naftiko: "0.5"
info:
  label: "Azure Infrastructure Provisioning Request"
  description: "Creates a ServiceNow change request for a new Azure resource provisioning event, linking it to the relevant project budget in SAP for cost governance."
  tags:
    - cloud
    - azure
    - servicenow
    - sap
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: cloud-provisioning
      port: 8080
      tools:
        - name: request-azure-provisioning
          description: "Given an Azure resource specification and project code, create a ServiceNow change request for infrastructure provisioning and validate the project budget in SAP before proceeding."
          inputParameters:
            - name: resource_type
              in: body
              type: string
              description: "The Azure resource type to provision (e.g., 'Virtual Machine', 'Storage Account')."
            - name: project_code
              in: body
              type: string
              description: "The SAP project code for budget validation."
            - name: estimated_monthly_cost
              in: body
              type: number
              description: "Estimated monthly cost in USD for budget approval."
          steps:
            - name: validate-budget
              type: call
              call: sap-budget.get-project-budget
              with:
                project_code: "{{project_code}}"
            - name: create-change-request
              type: call
              call: servicenow-provision.create-change
              with:
                short_description: "Azure {{resource_type}} provisioning for project {{project_code}}"
                category: "cloud_provisioning"
                estimated_cost: "{{estimated_monthly_cost}}"
                budget_available: "{{validate-budget.remaining_budget}}"
  consumes:
    - type: http
      namespace: sap-budget
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_PROJECT_BUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: project-budgets
          path: "/ProjectBudgetSet"
          inputParameters:
            - name: project_code
              in: query
          operations:
            - name: get-project-budget
              method: GET
    - type: http
      namespace: servicenow-provision
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves cabin status from ServiceNow, updates the housekeeping dashboard in Power BI, and notifies the hotel director via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cabin Housekeeping Status Tracker"
  description: "Retrieves cabin status from ServiceNow, updates the housekeeping dashboard in Power BI, and notifies the hotel director via Microsoft Teams."
  tags:
    - hospitality
    - housekeeping
    - servicenow
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: housekeeping-status
      port: 8080
      tools:
        - name: track-housekeeping-status
          description: "Track cabin housekeeping status and update dashboard."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: deck
              in: body
              type: string
              description: "Deck number."
          steps:
            - name: get-cabin-status
              type: call
              call: "servicenow.query-records"
              with:
                table: "x_ccl_cabin_status"
                query: "vessel={{vessel_code}}^deck={{deck}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "hotel_operations"
                dataset_id: "housekeeping_status"
            - name: notify-director
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hotel_{{vessel_code}}"
                text: "Housekeeping update — {{vessel_code}} Deck {{deck}}: {{get-cabin-status.cleaned_count}} cleaned, {{get-cabin-status.pending_count}} pending, {{get-cabin-status.occupied_count}} occupied."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: query-records
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls cabin booking data from Salesforce, runs revenue optimization models in Azure Databricks, and updates pricing in the booking system.

naftiko: "0.5"
info:
  label: "Cabin Revenue Optimization Pipeline"
  description: "Pulls cabin booking data from Salesforce, runs revenue optimization models in Azure Databricks, and updates pricing in the booking system."
  tags:
    - revenue-management
    - pricing
    - salesforce
    - azure-databricks
capability:
  exposes:
    - type: mcp
      namespace: cabin-revenue
      port: 8080
      tools:
        - name: optimize-cabin-revenue
          description: "Run cabin revenue optimization using booking data and ML models."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
            - name: days_to_sail
              in: body
              type: integer
              description: "Days until sailing."
          steps:
            - name: get-bookings
              type: call
              call: "salesforce.get-voyage-bookings"
              with:
                voyage_id: "{{voyage_id}}"
            - name: run-optimization
              type: call
              call: "databricks.run-job"
              with:
                job_id: "cabin_revenue_optimization"
                voyage_id: "{{voyage_id}}"
                occupancy_pct: "{{get-bookings.occupancy_pct}}"
                days_to_sail: "{{days_to_sail}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/query?q=SELECT+Count(Id),AVG(Rate__c)+FROM+Booking__c+WHERE+Voyage__c='{{voyage_id}}'"
          inputParameters:
            - name: voyage_id
              in: query
          operations:
            - name: get-voyage-bookings
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST

Pulls onboard casino revenue from SAP, analyzes per-guest spend in Azure Databricks, and refreshes the casino dashboard in Power BI.

naftiko: "0.5"
info:
  label: "Casino Revenue Reporting Pipeline"
  description: "Pulls onboard casino revenue from SAP, analyzes per-guest spend in Azure Databricks, and refreshes the casino dashboard in Power BI."
  tags:
    - revenue-management
    - casino
    - sap
    - azure-databricks
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: casino-revenue
      port: 8080
      tools:
        - name: report-casino-revenue
          description: "Analyze casino revenue and refresh reporting dashboard."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          steps:
            - name: get-revenue
              type: call
              call: "sap.get-casino-revenue"
              with:
                vessel_code: "{{vessel_code}}"
                voyage_id: "{{voyage_id}}"
            - name: run-analysis
              type: call
              call: "databricks.run-job"
              with:
                job_id: "casino_per_guest_analysis"
                vessel_code: "{{vessel_code}}"
                total_revenue: "{{get-revenue.total}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "revenue_management"
                dataset_id: "casino_analytics"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: revenue
          path: "/A_CostCenter('{{vessel_code}}')/to_CostElements?$filter=CostElementGroup eq 'CASINO'"
          inputParameters:
            - name: vessel_code
              in: path
          operations:
            - name: get-casino-revenue
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Detects cloud cost anomalies in Azure and opens a ServiceNow investigation ticket, notifying the cloud infrastructure team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Alert"
  description: "Detects cloud cost anomalies in Azure and opens a ServiceNow investigation ticket, notifying the cloud infrastructure team via Microsoft Teams."
  tags:
    - cloud
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and anomaly threshold, retrieve cost spike details, open a ServiceNow investigation ticket, and alert the cloud team via Teams."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to check for cost anomalies."
            - name: threshold_pct
              in: body
              type: number
              description: "The percentage over budget that constitutes an anomaly (e.g., 20 for 20% overage)."
          steps:
            - name: get-cost-data
              type: call
              call: azure-cost.get-cost-summary
              with:
                subscription_id: "{{subscription_id}}"
            - name: open-investigation
              type: call
              call: servicenow-cloud.create-investigation
              with:
                short_description: "Azure cost anomaly: Subscription {{subscription_id}} exceeded threshold by {{threshold_pct}}%"
                category: "cloud_cost"
                priority: "2"
            - name: alert-cloud-team
              type: call
              call: msteams-cloud.send-cost-alert
              with:
                channel_id: "cloud-infrastructure"
                text: "Cost Anomaly Detected | Subscription: {{subscription_id}} | Current: {{get-cost-data.current_cost}} | Budget: {{get-cost-data.budget}} | ServiceNow: {{open-investigation.number}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: cost-summary
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-cost-summary
              method: POST
    - type: http
      namespace: servicenow-cloud
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: investigations
          path: "/table/incident"
          operations:
            - name: create-investigation
              method: POST
    - type: http
      namespace: msteams-cloud
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: cloud-alerts
          path: "/teams/cloud-infra/channels/general/messages"
          operations:
            - name: send-cost-alert
              method: POST

Retrieves pending expense reports from SAP Concur for a given cost center and notifies the approver via Microsoft Teams with a direct approval link.

naftiko: "0.5"
info:
  label: "Concur Expense Report Approval Tracker"
  description: "Retrieves pending expense reports from SAP Concur for a given cost center and notifies the approver via Microsoft Teams with a direct approval link."
  tags:
    - finance
    - sap-concur
    - microsoft-teams
    - expense-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approvals
      port: 8080
      tools:
        - name: notify-pending-expenses
          description: "Given a cost center code, retrieve all pending expense reports from SAP Concur and send approval reminders to each report approver via Microsoft Teams."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The cost center code to retrieve pending expenses for."
          steps:
            - name: get-pending-reports
              type: call
              call: concur.get-expense-reports
              with:
                cost_center: "{{cost_center}}"
                status: "PENDING_APPROVAL"
            - name: notify-approvers
              type: call
              call: msteams-expense.send-approval-reminder
              with:
                channel_id: "finance-approvals"
                text: "Pending Expense Approvals for Cost Center {{cost_center}}: {{get-pending-reports.count}} reports awaiting approval. Total amount: {{get-pending-reports.total_amount}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: cost_center
              in: query
            - name: status
              in: query
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: msteams-expense
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: expense-messages
          path: "/teams/finance/channels/approvals/messages"
          operations:
            - name: send-approval-reminder
              method: POST

Retrieves a travel expense report from SAP Concur by report ID, returning total amount, status, and approval chain.

naftiko: "0.5"
info:
  label: "Concur Travel Expense Lookup"
  description: "Retrieves a travel expense report from SAP Concur by report ID, returning total amount, status, and approval chain."
  tags:
    - finance
    - travel-expense
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: travel-expenses
      port: 8080
      tools:
        - name: get-expense-report
          description: "Look up a SAP Concur expense report by report ID."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Concur expense report ID."
          call: "concur.get-report"
          with:
            report_id: "{{report_id}}"
          outputParameters:
            - name: total_amount
              type: number
              mapping: "$.Total"
            - name: status
              type: string
              mapping: "$.ApprovalStatusName"
            - name: owner
              type: string
              mapping: "$.OwnerName"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET

Searches Carnival's Confluence knowledge base for maritime safety procedures by keyword, returning page title, URL, and last modified date.

naftiko: "0.5"
info:
  label: "Confluence Safety Procedure Lookup"
  description: "Searches Carnival's Confluence knowledge base for maritime safety procedures by keyword, returning page title, URL, and last modified date."
  tags:
    - safety
    - procedures
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: safety-procedures
      port: 8080
      tools:
        - name: search-safety-procedures
          description: "Search Confluence for maritime safety procedures."
          inputParameters:
            - name: search_term
              in: body
              type: string
              description: "Keyword to search for."
          call: "confluence.search-content"
          with:
            cql: "label = 'safety-procedure' AND text ~ '{{search_term}}'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total_count
              type: number
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://carnival.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET

When a new crew member joins, creates a Workday worker record, opens a ServiceNow IT provisioning ticket, and sends a Microsoft Teams welcome message to the crew coordinator.

naftiko: "0.5"
info:
  label: "Crew Member Onboarding Sequence"
  description: "When a new crew member joins, creates a Workday worker record, opens a ServiceNow IT provisioning ticket, and sends a Microsoft Teams welcome message to the crew coordinator."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: crew-onboarding
      port: 8080
      tools:
        - name: trigger-crew-onboarding
          description: "Given a new crew member's personal details and ship assignment, create a Workday profile, open a ServiceNow IT setup ticket, and notify the crew coordinator via Teams."
          inputParameters:
            - name: first_name
              in: body
              type: string
              description: "Crew member's first name."
            - name: last_name
              in: body
              type: string
              description: "Crew member's last name."
            - name: ship_code
              in: body
              type: string
              description: "The ship assignment code (e.g., CCL-MAGIC)."
            - name: position_title
              in: body
              type: string
              description: "Job title for the new crew member."
          steps:
            - name: create-worker
              type: call
              call: workday.create-worker
              with:
                first_name: "{{first_name}}"
                last_name: "{{last_name}}"
                job_title: "{{position_title}}"
                cost_center: "{{ship_code}}"
            - name: open-it-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "IT provisioning for new crew: {{first_name}} {{last_name}} aboard {{ship_code}}"
                category: "hr_provisioning"
                assigned_group: "Crew_IT_Support"
            - name: notify-coordinator
              type: call
              call: msteams.send-crew-message
              with:
                channel_id: "crew-operations"
                text: "New crew onboarded: {{first_name}} {{last_name}} | Ship: {{ship_code}} | Position: {{position_title}} | IT Ticket: {{open-it-ticket.number}}"
  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"
          operations:
            - name: create-worker
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.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.ms_graph_token"
      resources:
        - name: messages
          path: "/teams/crew-ops/channels/general/messages"
          operations:
            - name: send-crew-message
              method: POST

Exports current crew headcount by ship and department from Workday for payroll reconciliation, returning structured cost center data.

naftiko: "0.5"
info:
  label: "Crew Payroll Headcount Export"
  description: "Exports current crew headcount by ship and department from Workday for payroll reconciliation, returning structured cost center data."
  tags:
    - hr
    - finance
    - workday
    - payroll
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: crew-payroll
      port: 8080
      tools:
        - name: get-crew-headcount
          description: "Returns a headcount snapshot of all crew members grouped by ship and department from Workday. Use for payroll reconciliation and cost center reporting."
          call: workday.get-headcount
          outputParameters:
            - name: crew_members
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.workerId"
                - name: full_name
                  type: string
                  mapping: "$.fullName"
                - name: ship_assignment
                  type: string
                  mapping: "$.costCenter"
                - name: department
                  type: string
                  mapping: "$.department"
                - name: employment_type
                  type: string
                  mapping: "$.employmentType"
  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"
          operations:
            - name: get-headcount
              method: GET

Retrieves crew hours from Workday, processes payroll calculations in SAP, and sends pay stubs to crew members via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Crew Payroll Processing Workflow"
  description: "Retrieves crew hours from Workday, processes payroll calculations in SAP, and sends pay stubs to crew members via Microsoft Teams."
  tags:
    - human-resources
    - payroll
    - workday
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crew-payroll
      port: 8080
      tools:
        - name: process-crew-payroll
          description: "Retrieve hours, process payroll, and distribute pay stubs."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: pay_period
              in: body
              type: string
              description: "Pay period (e.g., 2026-03-15)."
          steps:
            - name: get-hours
              type: call
              call: "workday.get-crew-hours"
              with:
                vessel_code: "{{vessel_code}}"
                period: "{{pay_period}}"
            - name: process-payroll
              type: call
              call: "sap.run-payroll"
              with:
                vessel_code: "{{vessel_code}}"
                period: "{{pay_period}}"
                crew_count: "{{get-hours.crew_count}}"
            - name: notify-crew
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "crew_{{vessel_code}}"
                text: "Payroll processed for {{vessel_code}} — period {{pay_period}}: {{get-hours.crew_count}} crew members. Total: ${{process-payroll.total_amount}}. Pay stubs available in Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/compensation/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: hours
          path: "/time_entries?location={{vessel_code}}&period={{period}}"
          inputParameters:
            - name: vessel_code
              in: query
            - name: period
              in: query
          operations:
            - name: get-crew-hours
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_PAYROLL"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: payroll
          path: "/A_PayrollRun"
          operations:
            - name: run-payroll
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks crew training completion in Workday, creates compliance tasks in ServiceNow for overdue items, and notifies vessel management via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Crew Training Compliance Pipeline"
  description: "Checks crew training completion in Workday, creates compliance tasks in ServiceNow for overdue items, and notifies vessel management via Microsoft Teams."
  tags:
    - human-resources
    - training
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crew-training
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Check crew training status and create tasks for overdue items."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: training_type
              in: body
              type: string
              description: "Training type (STCW, safety, security)."
          steps:
            - name: get-training-status
              type: call
              call: "workday.get-training-compliance"
              with:
                vessel_code: "{{vessel_code}}"
                type: "{{training_type}}"
            - name: create-task
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_training_compliance"
                short_description: "Training compliance — {{vessel_code}} — {{training_type}}"
                description: "{{get-training-status.overdue_count}} crew members have overdue {{training_type}} training."
            - name: notify-vessel
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "vessel_{{vessel_code}}"
                text: "Training Alert: {{get-training-status.overdue_count}} crew on {{vessel_code}} have overdue {{training_type}} training. Compliance ticket: {{create-task.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/learning/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learning_assignments?location={{vessel_code}}&type={{type}}&status=overdue"
          inputParameters:
            - name: vessel_code
              in: query
            - name: type
              in: query
          operations:
            - name: get-training-compliance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks crew visa expiry dates from Workday, creates renewal tasks in ServiceNow, and alerts the crew management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Crew Visa Compliance Pipeline"
  description: "Checks crew visa expiry dates from Workday, creates renewal tasks in ServiceNow, and alerts the crew management team via Microsoft Teams."
  tags:
    - human-resources
    - visa-compliance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: visa-compliance
      port: 8080
      tools:
        - name: check-visa-compliance
          description: "Check crew visa status, create renewal tasks, and alert team."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: days_threshold
              in: body
              type: integer
              description: "Days before expiry to flag."
          steps:
            - name: get-expiring-visas
              type: call
              call: "workday.get-expiring-visas"
              with:
                vessel_code: "{{vessel_code}}"
                days: "{{days_threshold}}"
            - name: create-renewals
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_visa_renewal"
                short_description: "Visa renewals — {{vessel_code}} — {{get-expiring-visas.count}} crew"
                description: "{{get-expiring-visas.count}} crew members on {{vessel_code}} have visas expiring within {{days_threshold}} days."
            - name: alert-crew-management
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "crew_management"
                text: "Visa Alert: {{get-expiring-visas.count}} crew on {{vessel_code}} have visas expiring within {{days_threshold}} days. Renewal ticket: {{create-renewals.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: visas
          path: "/workers?location={{vessel_code}}&visa_expiry_within={{days}}"
          inputParameters:
            - name: vessel_code
              in: query
            - name: days
              in: query
          operations:
            - name: get-expiring-visas
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Distributes crew welfare surveys via Microsoft Teams, collects results in Workday, and generates insights in Power BI.

naftiko: "0.5"
info:
  label: "Crew Welfare Survey Pipeline"
  description: "Distributes crew welfare surveys via Microsoft Teams, collects results in Workday, and generates insights in Power BI."
  tags:
    - human-resources
    - crew-welfare
    - microsoft-teams
    - workday
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: crew-welfare
      port: 8080
      tools:
        - name: run-welfare-survey
          description: "Distribute welfare survey and analyze results."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: survey_period
              in: body
              type: string
              description: "Survey period (e.g., 2026-Q1)."
          steps:
            - name: send-survey
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "crew_{{vessel_code}}"
                text: "Crew welfare survey for {{survey_period}} is now open. Please complete it in Workday by end of week. Your feedback helps us improve life on board."
            - name: get-results
              type: call
              call: "workday.get-survey-results"
              with:
                vessel_code: "{{vessel_code}}"
                period: "{{survey_period}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "hr_analytics"
                dataset_id: "crew_welfare"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/surveys/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: surveys
          path: "/results?location={{vessel_code}}&period={{period}}"
          inputParameters:
            - name: vessel_code
              in: query
            - name: period
              in: query
          operations:
            - name: get-survey-results
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Queries Datadog for vessel engine telemetry data, returning RPM, temperature, fuel consumption, and vibration metrics.

naftiko: "0.5"
info:
  label: "Datadog Engine Telemetry Check"
  description: "Queries Datadog for vessel engine telemetry data, returning RPM, temperature, fuel consumption, and vibration metrics."
  tags:
    - operations
    - engine-monitoring
    - datadog
    - ship-operations
capability:
  exposes:
    - type: mcp
      namespace: engine-telemetry
      port: 8080
      tools:
        - name: check-engine-telemetry
          description: "Query Datadog for vessel engine telemetry metrics."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: engine_id
              in: body
              type: string
              description: "Engine identifier."
          call: "datadog.query-metrics"
          with:
            query: "avg:engine.rpm{vessel:{{vessel_code}},engine:{{engine_id}}}"
            from: "now-1h"
            to: "now"
          outputParameters:
            - name: avg_rpm
              type: number
              mapping: "$.series[0].pointlist[-1][1]"
            - name: avg_temp
              type: number
              mapping: "$.series[1].pointlist[-1][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query-metrics
              method: GET

Queries Datadog for shipboard IT system metrics including network latency, satellite uplink status, and application health across fleet vessels.

naftiko: "0.5"
info:
  label: "Datadog Shipboard System Monitor"
  description: "Queries Datadog for shipboard IT system metrics including network latency, satellite uplink status, and application health across fleet vessels."
  tags:
    - monitoring
    - datadog
    - infrastructure
    - maritime
capability:
  exposes:
    - type: mcp
      namespace: fleet-monitoring
      port: 8080
      tools:
        - name: check-ship-systems
          description: "Given a vessel code, retrieve IT system health metrics from Datadog."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "The vessel identifier."
            - name: time_window
              in: body
              type: string
              description: "Time window: 1h, 6h, 24h."
          call: "datadog.query-metrics"
          with:
            query: "avg:system.health{vessel:{{vessel_code}}}"
            from: "{{time_window}}"
          outputParameters:
            - name: uplink_latency_ms
              type: string
              mapping: "$.series[0].pointlist[-1][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET

Retrieves approved content from SharePoint, updates the onboard digital signage system via ServiceNow, and notifies the hotel team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Digital Signage Content Update Workflow"
  description: "Retrieves approved content from SharePoint, updates the onboard digital signage system via ServiceNow, and notifies the hotel team via Microsoft Teams."
  tags:
    - hospitality
    - digital-signage
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: digital-signage
      port: 8080
      tools:
        - name: update-digital-signage
          description: "Update onboard digital signage with approved content."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: content_folder
              in: body
              type: string
              description: "SharePoint folder with approved content."
          steps:
            - name: get-content
              type: call
              call: "sharepoint.list-folder"
              with:
                folder_path: "{{content_folder}}"
            - name: schedule-update
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_signage_update"
                short_description: "Signage update — {{vessel_code}}"
                description: "Content items: {{get-content.file_count}}. Source: {{content_folder}}."
            - name: notify-hotel
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hotel_{{vessel_code}}"
                text: "Digital signage update scheduled: {{vessel_code}}. {{get-content.file_count}} content items. Task: {{schedule-update.number}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a crew member departure is initiated in Workday, deactivates their accounts via ServiceNow, closes open IT tickets, and notifies HR via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When a crew member departure is initiated in Workday, deactivates their accounts via ServiceNow, closes open IT tickets, and notifies HR via Microsoft Teams."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: crew-offboarding
      port: 8080
      tools:
        - name: trigger-crew-offboarding
          description: "Given a Workday employee ID and departure date, initiate the full offboarding sequence: deactivate IT accounts via ServiceNow and notify HR coordinator via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing crew member."
            - name: departure_date
              in: body
              type: string
              description: "The departure/last working date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday-offboard.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-accounts
              type: call
              call: servicenow-offboard.create-offboarding-task
              with:
                short_description: "Account deactivation for departing crew: {{get-worker.full_name}}"
                assigned_group: "Crew_IT_Support"
                departure_date: "{{departure_date}}"
            - name: notify-hr
              type: call
              call: msteams-hr.send-offboard-notice
              with:
                channel_id: "hr-operations"
                text: "Offboarding initiated: {{get-worker.full_name}} | Employee ID: {{employee_id}} | Departure: {{departure_date}} | IT Task: {{deactivate-accounts.number}}"
  consumes:
    - type: http
      namespace: workday-offboard
      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-offboard
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: offboarding-tasks
          path: "/table/sc_task"
          operations:
            - name: create-offboarding-task
              method: POST
    - type: http
      namespace: msteams-hr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: hr-messages
          path: "/teams/hr-ops/channels/general/messages"
          operations:
            - name: send-offboard-notice
              method: POST

Collects emissions data from Datadog vessel sensors, generates compliance reports in Azure Databricks, and uploads to the regulatory portal via SharePoint.

naftiko: "0.5"
info:
  label: "Environmental Compliance Reporting Pipeline"
  description: "Collects emissions data from Datadog vessel sensors, generates compliance reports in Azure Databricks, and uploads to the regulatory portal via SharePoint."
  tags:
    - compliance
    - environmental
    - datadog
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: environmental-compliance
      port: 8080
      tools:
        - name: generate-environmental-report
          description: "Collect emissions data, generate compliance report, and upload."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-emissions-data
              type: call
              call: "datadog.query-metrics"
              with:
                query: "sum:vessel.emissions.co2{vessel:{{vessel_code}}}"
                from: "now-90d"
                to: "now"
            - name: generate-report
              type: call
              call: "databricks.run-job"
              with:
                job_id: "environmental_compliance_report"
                vessel_code: "{{vessel_code}}"
                period: "{{reporting_period}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-document"
              with:
                site_id: "regulatory_compliance"
                folder_path: "Environmental/{{vessel_code}}/{{reporting_period}}"
                content: "{{generate-report.report_url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      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: upload-document
              method: PUT

Retrieves fuel requirements from SAP, compares prices across ports, and creates purchase orders for optimal fuel procurement.

naftiko: "0.5"
info:
  label: "Fleet Fuel Procurement Pipeline"
  description: "Retrieves fuel requirements from SAP, compares prices across ports, and creates purchase orders for optimal fuel procurement."
  tags:
    - operations
    - fuel-procurement
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fuel-procurement
      port: 8080
      tools:
        - name: procure-fuel
          description: "Compare fuel prices and create optimal purchase orders."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          steps:
            - name: get-fuel-requirements
              type: call
              call: "sap.get-fuel-demand"
              with:
                vessel_code: "{{vessel_code}}"
                voyage_id: "{{voyage_id}}"
            - name: create-po
              type: call
              call: "sap.create-purchase-order"
              with:
                vessel_code: "{{vessel_code}}"
                quantity_mt: "{{get-fuel-requirements.required_mt}}"
                fuel_type: "{{get-fuel-requirements.fuel_type}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fuel_procurement"
                text: "Fuel PO created: {{vessel_code}} — {{get-fuel-requirements.required_mt}} MT of {{get-fuel-requirements.fuel_type}}. PO: {{create-po.po_number}}. Estimated cost: ${{create-po.total_cost}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fuel-demand
          path: "/A_PurchaseRequisition?$filter=Plant eq '{{vessel_code}}'"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-fuel-demand
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder"
          operations:
            - name: create-purchase-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates an insurance claim in ServiceNow, attaches supporting documents from SharePoint, and notifies the risk management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Fleet Insurance Claim Pipeline"
  description: "Creates an insurance claim in ServiceNow, attaches supporting documents from SharePoint, and notifies the risk management team via Microsoft Teams."
  tags:
    - finance
    - insurance
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: insurance-claims
      port: 8080
      tools:
        - name: file-insurance-claim
          description: "Create insurance claim, attach documents, and notify risk team."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: claim_type
              in: body
              type: string
              description: "Claim type (property, liability, environmental)."
            - name: claim_description
              in: body
              type: string
              description: "Description of the claim."
          steps:
            - name: create-claim
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_insurance_claim"
                short_description: "Insurance claim — {{vessel_code}} — {{claim_type}}"
                description: "{{claim_description}}"
            - name: get-documents
              type: call
              call: "sharepoint.list-folder"
              with:
                folder_path: "Insurance/{{vessel_code}}/{{claim_type}}"
            - name: notify-risk
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "risk_management"
                text: "Insurance claim filed: {{vessel_code}} — {{claim_type}}. Claim: {{create-claim.number}}. Documents: {{get-documents.file_count}} files attached."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves safety drill completion records from ServiceNow, verifies compliance against IMO requirements, and generates a fleet report in Confluence.

naftiko: "0.5"
info:
  label: "Fleet Safety Drill Compliance Pipeline"
  description: "Retrieves safety drill completion records from ServiceNow, verifies compliance against IMO requirements, and generates a fleet report in Confluence."
  tags:
    - safety
    - compliance
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: safety-drill-compliance
      port: 8080
      tools:
        - name: check-drill-compliance
          description: "Verify safety drill compliance and generate fleet report."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: drill_type
              in: body
              type: string
              description: "Drill type (fire, abandon-ship, man-overboard)."
          steps:
            - name: get-drill-records
              type: call
              call: "servicenow.query-records"
              with:
                table: "x_ccl_safety_drill"
                query: "vessel={{vessel_code}}^drill_type={{drill_type}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space: "SAFETY"
                title: "Drill Compliance — {{vessel_code}} — {{drill_type}}"
                content: "Drills completed: {{get-drill-records.total_count}}. Last drill: {{get-drill-records.last_drill_date}}. Status: {{get-drill-records.compliance_status}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://carnival.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves weather forecast data, runs optimal routing analysis in Azure Databricks, and updates the navigation plan in SharePoint.

naftiko: "0.5"
info:
  label: "Fleet Weather Routing Pipeline"
  description: "Retrieves weather forecast data, runs optimal routing analysis in Azure Databricks, and updates the navigation plan in SharePoint."
  tags:
    - operations
    - weather-routing
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: weather-routing
      port: 8080
      tools:
        - name: optimize-weather-routing
          description: "Analyze weather data and optimize vessel routing."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          steps:
            - name: run-routing
              type: call
              call: "databricks.run-job"
              with:
                job_id: "weather_routing_optimization"
                vessel_code: "{{vessel_code}}"
                voyage_id: "{{voyage_id}}"
            - name: update-nav-plan
              type: call
              call: "sharepoint.update-list-item"
              with:
                list_id: "navigation_plans"
                voyage_id: "{{voyage_id}}"
                route_status: "optimized"
            - name: notify-bridge
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "bridge_{{vessel_code}}"
                text: "Weather routing update: {{vessel_code}} voyage {{voyage_id}}. Route optimized. Fuel savings: {{run-routing.fuel_savings_mt}} MT. ETA change: {{run-routing.eta_delta_hours}} hours."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/lists/{{list_id}}/items"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: update-list-item
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks open fuel procurement orders in SAP Ariba for a given ship and port, returning current order status and estimated delivery date.

naftiko: "0.5"
info:
  label: "Fuel Procurement Order Tracker"
  description: "Tracks open fuel procurement orders in SAP Ariba for a given ship and port, returning current order status and estimated delivery date."
  tags:
    - procurement
    - sap-ariba
    - supply-chain
    - fuel-management
capability:
  exposes:
    - type: mcp
      namespace: fuel-procurement
      port: 8080
      tools:
        - name: get-fuel-order-status
          description: "Given a ship code and port, retrieve all open fuel procurement orders from SAP Ariba, returning order number, status, quantity, and estimated delivery."
          inputParameters:
            - name: ship_code
              in: body
              type: string
              description: "The ship identifier code."
            - name: port_code
              in: body
              type: string
              description: "The port of call code where fuel is ordered."
          call: sap-ariba.get-fuel-orders
          with:
            ship_code: "{{ship_code}}"
            port_code: "{{port_code}}"
          outputParameters:
            - name: order_number
              type: string
              mapping: "$.orders[0].orderNumber"
            - name: status
              type: string
              mapping: "$.orders[0].status"
            - name: quantity_mt
              type: string
              mapping: "$.orders[0].quantityMT"
            - name: eta
              type: string
              mapping: "$.orders[0].estimatedDelivery"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/purchase-orders/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: fuel-orders
          path: "/orders"
          inputParameters:
            - name: ship_code
              in: query
            - name: port_code
              in: query
          operations:
            - name: get-fuel-orders
              method: GET

Retrieves booking funnel conversion metrics from Google Analytics for the cruise website, returning visit-to-booking conversion rate.

naftiko: "0.5"
info:
  label: "Google Analytics Booking Conversion Check"
  description: "Retrieves booking funnel conversion metrics from Google Analytics for the cruise website, returning visit-to-booking conversion rate."
  tags:
    - digital
    - booking-analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: booking-conversion
      port: 8080
      tools:
        - name: check-booking-conversion
          description: "Get booking funnel conversion metrics from Google Analytics."
          inputParameters:
            - name: date_range
              in: body
              type: string
              description: "Date range (e.g., last-7-days, last-30-days)."
          call: "google-analytics.get-conversion"
          with:
            date_range: "{{date_range}}"
          outputParameters:
            - name: conversion_rate
              type: number
              mapping: "$.rows[0].metricValues[0].value"
            - name: total_sessions
              type: number
              mapping: "$.rows[0].metricValues[1].value"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          operations:
            - name: get-conversion
              method: POST

Pulls weekly website traffic metrics from Google Analytics for cruise brand sites and posts digest to Teams.

naftiko: "0.5"
info:
  label: "Google Analytics Cruise Website Traffic"
  description: "Pulls weekly website traffic metrics from Google Analytics for cruise brand sites and posts digest to Teams."
  tags:
    - marketing
    - google-analytics
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: digital-marketing
      port: 8080
      tools:
        - name: generate-traffic-digest
          description: "Given a GA property ID, pull weekly metrics and post digest."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The GA property ID."
          steps:
            - name: get-traffic
              type: call
              call: "google-analytics.get-report"
              with:
                property_id: "{{property_id}}"
                date_range: "last_7_days"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "digital-marketing"
                message: "Weekly Traffic: Sessions: {{get-traffic.sessions}}, Bounce: {{get-traffic.bounceRate}}%"
  consumes:
    - type: http
      namespace: google-analytics
      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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes a group booking request from Salesforce, creates coordination tasks in Jira, and sends booking confirmation to the group organizer via WhatsApp.

naftiko: "0.5"
info:
  label: "Group Booking Coordination Workflow"
  description: "Processes a group booking request from Salesforce, creates coordination tasks in Jira, and sends booking confirmation to the group organizer via WhatsApp."
  tags:
    - sales
    - group-booking
    - salesforce
    - jira
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: group-booking
      port: 8080
      tools:
        - name: coordinate-group-booking
          description: "Process group booking, create coordination tasks, and confirm."
          inputParameters:
            - name: group_booking_id
              in: body
              type: string
              description: "Group booking identifier."
            - name: group_size
              in: body
              type: integer
              description: "Number of guests in the group."
          steps:
            - name: get-booking
              type: call
              call: "salesforce.get-group-booking"
              with:
                booking_id: "{{group_booking_id}}"
            - name: create-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "GRP"
                issuetype: "Epic"
                summary: "Group booking — {{group_booking_id}} — {{group_size}} guests"
                description: "Organizer: {{get-booking.organizer_name}}. Voyage: {{get-booking.voyage_id}}. Cabins: {{get-booking.cabin_count}}."
            - name: confirm-organizer
              type: call
              call: "whatsapp.send-message"
              with:
                phone_number: "{{get-booking.organizer_phone}}"
                message: "Your group booking {{group_booking_id}} for {{group_size}} guests is confirmed! Voyage: {{get-booking.voyage_name}}. Your coordinator: {{get-booking.coordinator_name}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/sobjects/Group_Booking__c/{{booking_id}}"
          inputParameters:
            - name: booking_id
              in: path
          operations:
            - name: get-group-booking
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://carnival.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: whatsapp
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{phone_number_id}}/messages"
          operations:
            - name: send-message
              method: POST

When a guest complaint is created in Salesforce Service Cloud, creates a ServiceNow task for guest relations follow-up and notifies the ship's hotel director via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Guest Complaint Escalation Handler"
  description: "When a guest complaint is created in Salesforce Service Cloud, creates a ServiceNow task for guest relations follow-up and notifies the ship's hotel director via Microsoft Teams."
  tags:
    - cx
    - salesforce
    - servicenow
    - microsoft-teams
    - complaint-management
capability:
  exposes:
    - type: mcp
      namespace: guest-relations
      port: 8080
      tools:
        - name: escalate-guest-complaint
          description: "Given a Salesforce case ID for a guest complaint, open a ServiceNow follow-up task for the guest relations team and notify the hotel director via Teams."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID for the guest complaint."
            - name: ship_code
              in: body
              type: string
              description: "The ship code the complaint is associated with."
          steps:
            - name: get-case
              type: call
              call: salesforce-case.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-gr-task
              type: call
              call: servicenow-gr.create-task
              with:
                short_description: "Guest complaint follow-up: {{get-case.subject}}"
                description: "Case ID: {{case_id}} | Guest: {{get-case.contact_name}} | Ship: {{ship_code}} | Issue: {{get-case.description}}"
                assigned_group: "Guest_Relations"
            - name: notify-hotel-director
              type: call
              call: msteams-hotel.send-escalation
              with:
                channel_id: "hotel-operations-{{ship_code}}"
                text: "Guest Complaint Escalated | Case: {{case_id}} | Guest: {{get-case.contact_name}} | Issue: {{get-case.subject}} | GR Task: {{create-gr-task.number}}"
  consumes:
    - type: http
      namespace: salesforce-case
      baseUri: "https://carnival.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
    - type: http
      namespace: servicenow-gr
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-hotel
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: hotel-messages
          path: "/teams/ship-ops/channels/hotel-ops/messages"
          operations:
            - name: send-escalation
              method: POST

Retrieves guest departure details from Salesforce, assigns luggage tags via ServiceNow, and sends departure instructions via WhatsApp.

naftiko: "0.5"
info:
  label: "Guest Disembarkation Logistics Workflow"
  description: "Retrieves guest departure details from Salesforce, assigns luggage tags via ServiceNow, and sends departure instructions via WhatsApp."
  tags:
    - guest-services
    - disembarkation
    - salesforce
    - servicenow
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: disembarkation
      port: 8080
      tools:
        - name: process-disembarkation
          description: "Coordinate guest disembarkation logistics."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
            - name: disembarkation_date
              in: body
              type: string
              description: "Disembarkation date in YYYY-MM-DD."
          steps:
            - name: get-departure-list
              type: call
              call: "salesforce.get-departures"
              with:
                voyage_id: "{{voyage_id}}"
            - name: assign-luggage-tags
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_luggage_logistics"
                short_description: "Luggage logistics — {{voyage_id}} — {{disembarkation_date}}"
                description: "Guests: {{get-departure-list.guest_count}}. Luggage groups assigned."
            - name: send-instructions
              type: call
              call: "whatsapp.send-broadcast"
              with:
                voyage_id: "{{voyage_id}}"
                message: "Disembarkation day! Please place luggage outside your cabin by 10 PM tonight. Your departure group: check your cabin TV for details."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: departures
          path: "/query?q=SELECT+Count(Id)+FROM+Booking__c+WHERE+Voyage__c='{{voyage_id}}'"
          inputParameters:
            - name: voyage_id
              in: query
          operations:
            - name: get-departures
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - 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"
          operations:
            - name: send-broadcast
              method: POST

Verifies guest travel documents in Salesforce, checks health screening status, and sends embarkation instructions via WhatsApp.

naftiko: "0.5"
info:
  label: "Guest Embarkation Readiness Pipeline"
  description: "Verifies guest travel documents in Salesforce, checks health screening status, and sends embarkation instructions via WhatsApp."
  tags:
    - guest-services
    - embarkation
    - salesforce
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: embarkation-readiness
      port: 8080
      tools:
        - name: check-embarkation-readiness
          description: "Verify documents, check health status, and send embarkation instructions."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "Guest booking reference."
            - name: sail_date
              in: body
              type: string
              description: "Sail date in YYYY-MM-DD."
          steps:
            - name: get-guest-status
              type: call
              call: "salesforce.get-guest-readiness"
              with:
                booking_ref: "{{booking_ref}}"
            - name: send-instructions
              type: call
              call: "whatsapp.send-message"
              with:
                phone_number: "{{get-guest-status.guest_phone}}"
                message: "Your cruise departs {{sail_date}}! Check-in opens at {{get-guest-status.checkin_time}}. Port: {{get-guest-status.embarkation_port}}. Boarding group: {{get-guest-status.boarding_group}}. Have your passport ready!"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/sobjects/Booking__c/{{booking_ref}}"
          inputParameters:
            - name: booking_ref
              in: path
          operations:
            - name: get-guest-readiness
              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"
          operations:
            - name: send-message
              method: POST

Evaluates guest loyalty points in Salesforce, upgrades tier status, and sends congratulatory notification via WhatsApp.

naftiko: "0.5"
info:
  label: "Guest Loyalty Tier Upgrade Workflow"
  description: "Evaluates guest loyalty points in Salesforce, upgrades tier status, and sends congratulatory notification via WhatsApp."
  tags:
    - guest-services
    - loyalty
    - salesforce
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: loyalty-upgrades
      port: 8080
      tools:
        - name: process-tier-upgrade
          description: "Evaluate loyalty points, upgrade tier, and notify guest."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "Loyalty member ID."
          steps:
            - name: get-member
              type: call
              call: "salesforce.get-loyalty-member"
              with:
                member_id: "{{member_id}}"
            - name: update-tier
              type: call
              call: "salesforce.update-loyalty-tier"
              with:
                member_id: "{{member_id}}"
                new_tier: "{{get-member.next_tier}}"
            - name: notify-guest
              type: call
              call: "whatsapp.send-message"
              with:
                phone_number: "{{get-member.phone}}"
                message: "Congratulations! You've been upgraded to {{get-member.next_tier}} status in the Carnival loyalty program. Your new benefits are now active. Sail points: {{get-member.total_points}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: loyalty
          path: "/sobjects/Loyalty_Member__c/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-loyalty-member
              method: GET
            - name: update-loyalty-tier
              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"
          operations:
            - name: send-message
              method: POST

Records a guest medical incident in ServiceNow, updates the guest record in Salesforce, and alerts the ship medical team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Guest Medical Incident Pipeline"
  description: "Records a guest medical incident in ServiceNow, updates the guest record in Salesforce, and alerts the ship medical team via Microsoft Teams."
  tags:
    - guest-services
    - medical
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: medical-incidents
      port: 8080
      tools:
        - name: report-medical-incident
          description: "Record medical incident, update guest record, and alert medical team."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "Guest booking reference."
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier."
            - name: incident_description
              in: body
              type: string
              description: "Description of the medical incident."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_medical_incident"
                short_description: "Medical incident — {{booking_ref}} — {{vessel_code}}"
                description: "{{incident_description}}"
                priority: "1"
            - name: update-guest
              type: call
              call: "salesforce.update-booking"
              with:
                booking_ref: "{{booking_ref}}"
                medical_flag: "true"
            - name: alert-medical
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "medical_{{vessel_code}}"
                text: "MEDICAL ALERT: Guest {{booking_ref}} on {{vessel_code}}. {{incident_description}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/sobjects/Booking__c/{{booking_ref}}"
          inputParameters:
            - name: booking_ref
              in: path
          operations:
            - name: update-booking
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a guest completes online check-in, retrieves their booking from Salesforce, validates passport data, and sends a Microsoft Teams notification to the port agent team.

naftiko: "0.5"
info:
  label: "Guest Onboarding Check-In Orchestrator"
  description: "When a guest completes online check-in, retrieves their booking from Salesforce, validates passport data, and sends a Microsoft Teams notification to the port agent team."
  tags:
    - hospitality
    - salesforce
    - microsoft-teams
    - onboarding
    - guest-services
capability:
  exposes:
    - type: mcp
      namespace: guest-checkin
      port: 8080
      tools:
        - name: trigger-guest-checkin
          description: "Given a booking reference, retrieve the guest record from Salesforce, confirm travel document validity, and notify the port operations team via Microsoft Teams."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "The guest booking reference number from the reservation system."
            - name: sail_date
              in: body
              type: string
              description: "The scheduled sail date in YYYY-MM-DD format."
          steps:
            - name: get-booking
              type: call
              call: salesforce.get-booking
              with:
                booking_ref: "{{booking_ref}}"
            - name: notify-port-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "port-operations"
                text: "Guest check-in confirmed: {{get-booking.guest_name}} | Booking: {{booking_ref}} | Sail: {{sail_date}} | Ship: {{get-booking.ship_name}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/sobjects/Booking__c/{{booking_ref}}"
          inputParameters:
            - name: booking_ref
              in: path
          operations:
            - name: get-booking
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/port-ops/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Pulls post-voyage guest satisfaction scores from Salesforce and publishes a weekly summary report to a Microsoft Teams channel for customer experience leadership.

naftiko: "0.5"
info:
  label: "Guest Satisfaction Survey Digest"
  description: "Pulls post-voyage guest satisfaction scores from Salesforce and publishes a weekly summary report to a Microsoft Teams channel for customer experience leadership."
  tags:
    - cx
    - salesforce
    - microsoft-teams
    - reporting
    - guest-services
capability:
  exposes:
    - type: mcp
      namespace: cx-reporting
      port: 8080
      tools:
        - name: digest-guest-satisfaction
          description: "Given a voyage ID or date range, retrieve guest satisfaction scores from Salesforce and post a formatted summary to the CX leadership Teams channel."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "The voyage identifier for which to retrieve satisfaction scores."
            - name: reporting_period
              in: body
              type: string
              description: "The reporting period label (e.g., 'Week of 2026-03-17')."
          steps:
            - name: get-scores
              type: call
              call: salesforce-cx.get-survey-scores
              with:
                voyage_id: "{{voyage_id}}"
            - name: post-digest
              type: call
              call: msteams-cx.send-digest
              with:
                channel_id: "cx-leadership"
                text: "Guest Satisfaction Report | Period: {{reporting_period}} | Voyage: {{voyage_id}} | Overall Score: {{get-scores.overall_score}} | NPS: {{get-scores.nps_score}} | Complaints: {{get-scores.complaint_count}}"
  consumes:
    - type: http
      namespace: salesforce-cx
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: survey-scores
          path: "/query"
          inputParameters:
            - name: voyage_id
              in: query
          operations:
            - name: get-survey-scores
              method: GET
    - type: http
      namespace: msteams-cx
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: cx-messages
          path: "/teams/cx-leadership/channels/general/messages"
          operations:
            - name: send-digest
              method: POST

Retrieves guest special requests from Salesforce, creates fulfillment tasks in ServiceNow, and confirms with the guest via WhatsApp.

naftiko: "0.5"
info:
  label: "Guest Special Request Fulfillment Workflow"
  description: "Retrieves guest special requests from Salesforce, creates fulfillment tasks in ServiceNow, and confirms with the guest via WhatsApp."
  tags:
    - guest-services
    - special-requests
    - salesforce
    - servicenow
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: special-requests
      port: 8080
      tools:
        - name: fulfill-special-request
          description: "Process guest special request and confirm fulfillment."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "Guest booking reference."
            - name: request_type
              in: body
              type: string
              description: "Type of request (dietary, accessibility, celebration)."
            - name: request_details
              in: body
              type: string
              description: "Details of the special request."
          steps:
            - name: get-booking
              type: call
              call: "salesforce.get-booking"
              with:
                booking_ref: "{{booking_ref}}"
            - name: create-task
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_special_request"
                short_description: "{{request_type}} request — {{booking_ref}}"
                description: "Guest: {{get-booking.guest_name}}. Cabin: {{get-booking.cabin_number}}. Request: {{request_details}}"
            - name: confirm-guest
              type: call
              call: "whatsapp.send-message"
              with:
                phone_number: "{{get-booking.guest_phone}}"
                message: "Your {{request_type}} request has been received and confirmed for your upcoming cruise. Reference: {{create-task.number}}. We look forward to welcoming you aboard!"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/sobjects/Booking__c/{{booking_ref}}"
          inputParameters:
            - name: booking_ref
              in: path
          operations:
            - name: get-booking
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - 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"
          operations:
            - name: send-message
              method: POST

Collects hull fouling and speed-power data from Datadog sensors, runs performance analysis in Azure Databricks, and alerts fleet engineering via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Hull Performance Monitoring Pipeline"
  description: "Collects hull fouling and speed-power data from Datadog sensors, runs performance analysis in Azure Databricks, and alerts fleet engineering via Microsoft Teams."
  tags:
    - operations
    - hull-performance
    - datadog
    - azure-databricks
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hull-performance
      port: 8080
      tools:
        - name: monitor-hull-performance
          description: "Analyze hull performance data and alert on degradation."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
          steps:
            - name: get-performance-data
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:vessel.hull.speed_power_ratio{vessel:{{vessel_code}}}"
                from: "now-7d"
                to: "now"
            - name: run-analysis
              type: call
              call: "databricks.run-job"
              with:
                job_id: "hull_performance_analysis"
                vessel_code: "{{vessel_code}}"
            - name: alert-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fleet_engineering"
                text: "Hull performance update: {{vessel_code}}. Speed-power ratio: {{get-performance-data.avg_value}}. Trend: {{run-analysis.trend}}. Next cleaning recommended: {{run-analysis.recommended_date}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a critical IT incident is raised in ServiceNow for shipboard or shore-side systems, escalates to the on-call team via Microsoft Teams and creates a tracking record in Jira.

naftiko: "0.5"
info:
  label: "IT Incident Response Handler"
  description: "When a critical IT incident is raised in ServiceNow for shipboard or shore-side systems, escalates to the on-call team via Microsoft Teams and creates a tracking record in Jira."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - jira
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-it-incident
          description: "Given a critical ServiceNow incident ID, escalate it to the on-call engineering team via Teams and open a linked Jira tracking issue for engineering follow-up."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The ServiceNow incident sys_id or number."
            - name: severity
              in: body
              type: string
              description: "Incident severity level: P1, P2, or P3."
          steps:
            - name: get-incident
              type: call
              call: servicenow-itsm.get-incident
              with:
                incident_id: "{{incident_id}}"
            - name: create-jira-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "ITOPS"
                issuetype: "Incident"
                summary: "[{{severity}}] {{get-incident.short_description}}"
                description: "ServiceNow: {{incident_id}} | Category: {{get-incident.category}} | Impact: {{get-incident.impact}}"
            - name: alert-oncall
              type: call
              call: msteams-itsm.send-alert
              with:
                channel_id: "it-oncall"
                text: "INCIDENT {{severity}}: {{get-incident.short_description}} | SN: {{incident_id}} | Jira: {{create-jira-issue.key}} | Assigned: {{get-incident.assigned_to}}"
  consumes:
    - type: http
      namespace: servicenow-itsm
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://carnival.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: msteams-itsm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: it-alerts
          path: "/teams/it-oncall/channels/general/messages"
          operations:
            - name: send-alert
              method: POST

Triages newly created Jira bugs for the digital guest experience platform, assigns them to the correct engineering squad based on component, and notifies the squad lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Jira Bug Triage and Assignment"
  description: "Triages newly created Jira bugs for the digital guest experience platform, assigns them to the correct engineering squad based on component, and notifies the squad lead via Microsoft Teams."
  tags:
    - devops
    - jira
    - microsoft-teams
    - bug-triage
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: bug-triage
      port: 8080
      tools:
        - name: triage-jira-bug
          description: "Given a new Jira issue ID, retrieve bug details, determine the owning squad from the component, update the issue with the correct assignee, and notify the squad lead via Teams."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., DGX-1234)."
          steps:
            - name: get-issue
              type: call
              call: jira-triage.get-issue
              with:
                issue_key: "{{issue_key}}"
            - name: assign-issue
              type: call
              call: jira-assign.update-issue
              with:
                issue_key: "{{issue_key}}"
                status: "In Triage"
            - name: notify-squad-lead
              type: call
              call: msteams-triage.send-triage-alert
              with:
                channel_id: "engineering-triage"
                text: "New Bug Triaged: {{issue_key}} | Summary: {{get-issue.summary}} | Component: {{get-issue.component}} | Priority: {{get-issue.priority}}"
  consumes:
    - type: http
      namespace: jira-triage
      baseUri: "https://carnival.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET
    - type: http
      namespace: jira-assign
      baseUri: "https://carnival.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue-updates
          path: "/issue/{{issue_key}}/transitions"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: update-issue
              method: POST
    - type: http
      namespace: msteams-triage
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: triage-messages
          path: "/teams/engineering/channels/triage/messages"
          operations:
            - name: send-triage-alert
              method: POST

Retrieves a shipboard IT support ticket from Jira by issue key, returning summary, status, assignee, and priority.

naftiko: "0.5"
info:
  label: "Jira Shipboard IT Ticket Lookup"
  description: "Retrieves a shipboard IT support ticket from Jira by issue key, returning summary, status, assignee, and priority."
  tags:
    - it-operations
    - shipboard-it
    - jira
capability:
  exposes:
    - type: mcp
      namespace: shipboard-it
      port: 8080
      tools:
        - name: get-shipboard-ticket
          description: "Look up a Jira shipboard IT ticket by issue key."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://carnival.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves sprint completion metrics from Jira for the digital product engineering team and posts a velocity summary to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Retrieves sprint completion metrics from Jira for the digital product engineering team and posts a velocity summary to the engineering Microsoft Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - reporting
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: eng-reporting
      port: 8080
      tools:
        - name: digest-sprint-velocity
          description: "Given a Jira board ID and sprint ID, retrieve completed story points and outstanding issues, then post a sprint velocity summary to the engineering Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board identifier for the product team."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint identifier to report on."
          steps:
            - name: get-sprint-data
              type: call
              call: jira.get-sprint
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: post-velocity
              type: call
              call: msteams-eng.post-sprint-summary
              with:
                channel_id: "engineering"
                text: "Sprint Report: {{get-sprint-data.sprint_name}} | Completed: {{get-sprint-data.completed_points}} pts | Remaining: {{get-sprint-data.remaining_points}} pts | Velocity: {{get-sprint-data.velocity}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://carnival.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint/{{sprint_id}}"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
    - type: http
      namespace: msteams-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: eng-messages
          path: "/teams/engineering/channels/general/messages"
          operations:
            - name: post-sprint-summary
              method: POST

Pulls active job requisitions from Workday and syncs them to LinkedIn Recruiter, ensuring open crew and shore-side positions are visible to talent sourcers.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Sync"
  description: "Pulls active job requisitions from Workday and syncs them to LinkedIn Recruiter, ensuring open crew and shore-side positions are visible to talent sourcers."
  tags:
    - hr
    - workday
    - linkedin
    - recruiting
    - talent-acquisition
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: sync-job-postings
          description: "Retrieve all open job requisitions from Workday and post or update corresponding LinkedIn job listings to ensure talent pipeline visibility."
          inputParameters:
            - name: requisition_status
              in: body
              type: string
              description: "Filter requisitions by status (e.g., 'Open', 'Approved')."
          steps:
            - name: get-requisitions
              type: call
              call: workday-recruiting.get-job-requisitions
              with:
                status: "{{requisition_status}}"
            - name: post-to-linkedin
              type: call
              call: linkedin.create-job-posting
              with:
                company_id: "carnival-corporation"
                title: "{{get-requisitions.job_title}}"
                description: "{{get-requisitions.job_description}}"
                location: "{{get-requisitions.location}}"
  consumes:
    - type: http
      namespace: workday-recruiting
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/jobRequisitions"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: get-job-requisitions
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST

Looks up a VIFP or loyalty program member profile in Salesforce by member ID, returning tier status, points balance, and recent booking history.

naftiko: "0.5"
info:
  label: "Loyalty Member Profile Lookup"
  description: "Looks up a VIFP or loyalty program member profile in Salesforce by member ID, returning tier status, points balance, and recent booking history."
  tags:
    - cx
    - salesforce
    - loyalty
    - guest-services
capability:
  exposes:
    - type: mcp
      namespace: loyalty
      port: 8080
      tools:
        - name: get-loyalty-member
          description: "Given a loyalty member ID, retrieve the guest's tier status, points balance, and recent voyages from Salesforce. Use when a guest agent needs full loyalty context."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The loyalty program member ID (VIFP number or equivalent)."
          call: salesforce.get-loyalty-member
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: member_name
              type: string
              mapping: "$.records[0].Name"
            - name: tier
              type: string
              mapping: "$.records[0].Loyalty_Tier__c"
            - name: points_balance
              type: string
              mapping: "$.records[0].Points_Balance__c"
            - name: total_nights
              type: string
              mapping: "$.records[0].Total_Nights__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: loyalty-members
          path: "/query"
          inputParameters:
            - name: member_id
              in: query
          operations:
            - name: get-loyalty-member
              method: GET

Identifies affected vessels from SAP equipment records, creates recall tasks in ServiceNow, and alerts fleet engineering via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Marine Equipment Recall Workflow"
  description: "Identifies affected vessels from SAP equipment records, creates recall tasks in ServiceNow, and alerts fleet engineering via Microsoft Teams."
  tags:
    - safety
    - equipment-recall
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: equipment-recall
      port: 8080
      tools:
        - name: process-equipment-recall
          description: "Identify affected vessels and create recall action tasks."
          inputParameters:
            - name: equipment_model
              in: body
              type: string
              description: "Equipment model identifier."
            - name: recall_reason
              in: body
              type: string
              description: "Reason for the recall."
          steps:
            - name: find-affected-vessels
              type: call
              call: "sap.get-equipment-by-model"
              with:
                model: "{{equipment_model}}"
            - name: create-recall-task
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_equipment_recall"
                short_description: "Equipment recall — {{equipment_model}}"
                description: "Reason: {{recall_reason}}. Affected vessels: {{find-affected-vessels.vessel_count}}."
                priority: "1"
            - name: alert-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fleet_engineering"
                text: "EQUIPMENT RECALL: {{equipment_model}}. Reason: {{recall_reason}}. {{find-affected-vessels.vessel_count}} vessels affected. Task: {{create-recall-task.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment?$filter=Model eq '{{model}}'"
          inputParameters:
            - name: model
              in: query
          operations:
            - name: get-equipment-by-model
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Records a maritime incident in ServiceNow, collects vessel data from Datadog, and creates an investigation report in Confluence.

naftiko: "0.5"
info:
  label: "Maritime Incident Investigation Pipeline"
  description: "Records a maritime incident in ServiceNow, collects vessel data from Datadog, and creates an investigation report in Confluence."
  tags:
    - safety
    - incident-investigation
    - servicenow
    - datadog
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: maritime-investigation
      port: 8080
      tools:
        - name: investigate-maritime-incident
          description: "Record incident, collect telemetry, and create investigation report."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: incident_type
              in: body
              type: string
              description: "Incident type (collision, grounding, fire, man-overboard)."
            - name: incident_description
              in: body
              type: string
              description: "Description of the incident."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_maritime_incident"
                short_description: "{{incident_type}} — {{vessel_code}}"
                description: "{{incident_description}}"
                priority: "1"
            - name: get-telemetry
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:vessel.navigation.*{vessel:{{vessel_code}}}"
                from: "now-6h"
                to: "now"
            - name: create-report
              type: call
              call: "confluence.create-page"
              with:
                space: "SAFETY"
                title: "Investigation — {{incident_type}} — {{vessel_code}} — {{create-incident.number}}"
                content: "Incident: {{incident_description}}. Telemetry data collected. ServiceNow: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://carnival.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves campaign performance metrics from Salesforce Marketing Cloud and posts a weekly digest to the marketing team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Retrieves campaign performance metrics from Salesforce Marketing Cloud and posts a weekly digest to the marketing team's Microsoft Teams channel."
  tags:
    - marketing
    - salesforce
    - microsoft-teams
    - reporting
    - campaigns
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a campaign ID or date range, retrieve email open rates, click-throughs, and booking conversions from Salesforce Marketing Cloud and post a digest to the marketing Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce Marketing Cloud campaign identifier."
            - name: reporting_week
              in: body
              type: string
              description: "The week label for the report (e.g., 'Week of 2026-03-17')."
          steps:
            - name: get-metrics
              type: call
              call: salesforce-mktg.get-campaign-metrics
              with:
                campaign_id: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: msteams-mktg.post-campaign-digest
              with:
                channel_id: "marketing-team"
                text: "Campaign Report | {{reporting_week}} | Campaign: {{campaign_id}} | Opens: {{get-metrics.open_rate}}% | Clicks: {{get-metrics.click_rate}}% | Bookings: {{get-metrics.booking_conversions}}"
  consumes:
    - type: http
      namespace: salesforce-mktg
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaign-metrics
          path: "/query"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-metrics
              method: GET
    - type: http
      namespace: msteams-mktg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: marketing-messages
          path: "/teams/marketing/channels/general/messages"
          operations:
            - name: post-campaign-digest
              method: POST

Tracks new ship construction milestones in Jira, updates the fleet planning schedule in SharePoint, and notifies leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Newbuild Project Milestone Tracker"
  description: "Tracks new ship construction milestones in Jira, updates the fleet planning schedule in SharePoint, and notifies leadership via Microsoft Teams."
  tags:
    - fleet-planning
    - newbuild
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: newbuild-tracking
      port: 8080
      tools:
        - name: track-newbuild-milestone
          description: "Track construction milestone and update fleet planning."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Newbuild project identifier."
            - name: milestone_name
              in: body
              type: string
              description: "Name of the milestone (keel-laying, float-out, delivery)."
          steps:
            - name: update-milestone
              type: call
              call: "jira.update-issue"
              with:
                issue_key: "{{project_id}}"
                status: "completed"
                milestone: "{{milestone_name}}"
            - name: update-fleet-plan
              type: call
              call: "sharepoint.update-list-item"
              with:
                list_id: "fleet_planning"
                project_id: "{{project_id}}"
                milestone: "{{milestone_name}}"
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fleet_leadership"
                text: "Newbuild milestone: {{project_id}} — {{milestone_name}} completed. Fleet planning schedule updated."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://carnival.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: update-issue
              method: PUT
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/lists/{{list_id}}/items"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: update-list-item
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves entertainment lineup from ServiceNow, publishes the schedule to the guest app via Salesforce, and notifies the cruise director via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Onboard Entertainment Scheduling Workflow"
  description: "Retrieves entertainment lineup from ServiceNow, publishes the schedule to the guest app via Salesforce, and notifies the cruise director via Microsoft Teams."
  tags:
    - guest-services
    - entertainment
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: entertainment-scheduling
      port: 8080
      tools:
        - name: publish-entertainment-schedule
          description: "Publish entertainment schedule and notify cruise director."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_date
              in: body
              type: string
              description: "Date for entertainment schedule."
          steps:
            - name: get-lineup
              type: call
              call: "servicenow.query-records"
              with:
                table: "x_ccl_entertainment"
                query: "vessel={{vessel_code}}^date={{voyage_date}}"
            - name: publish-schedule
              type: call
              call: "salesforce.update-daily-program"
              with:
                vessel_code: "{{vessel_code}}"
                date: "{{voyage_date}}"
                event_count: "{{get-lineup.total_count}}"
            - name: notify-director
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "entertainment_{{vessel_code}}"
                text: "Entertainment schedule published: {{vessel_code}} — {{voyage_date}}. {{get-lineup.total_count}} events scheduled. Guest app updated."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: programs
          path: "/sobjects/Daily_Program__c"
          operations:
            - name: update-daily-program
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls F&B cost data from SAP, analyzes per-guest costs in Azure Databricks, and refreshes the F&B dashboard in Power BI.

naftiko: "0.5"
info:
  label: "Onboard Food and Beverage Cost Pipeline"
  description: "Pulls F&B cost data from SAP, analyzes per-guest costs in Azure Databricks, and refreshes the F&B dashboard in Power BI."
  tags:
    - operations
    - food-beverage
    - sap
    - azure-databricks
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: fb-cost-analysis
      port: 8080
      tools:
        - name: analyze-fb-costs
          description: "Analyze onboard F&B costs and refresh dashboard."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          steps:
            - name: get-cost-data
              type: call
              call: "sap.get-fb-costs"
              with:
                vessel_code: "{{vessel_code}}"
                voyage_id: "{{voyage_id}}"
            - name: run-analysis
              type: call
              call: "databricks.run-job"
              with:
                job_id: "fb_per_guest_analysis"
                vessel_code: "{{vessel_code}}"
                total_cost: "{{get-cost-data.total_cost}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "fleet_operations"
                dataset_id: "fb_cost_analysis"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/A_CostCenter('{{vessel_code}}')/to_CostElements?$filter=CostElementGroup eq 'FB'"
          inputParameters:
            - name: vessel_code
              in: path
          operations:
            - name: get-fb-costs
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Checks medical supply levels from SAP, creates purchase orders for critical items, and alerts the ship doctor via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Onboard Medical Supply Replenishment Workflow"
  description: "Checks medical supply levels from SAP, creates purchase orders for critical items, and alerts the ship doctor via Microsoft Teams."
  tags:
    - medical
    - supply-chain
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: medical-supplies
      port: 8080
      tools:
        - name: replenish-medical-supplies
          description: "Check medical supply levels and create replenishment orders."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
          steps:
            - name: check-levels
              type: call
              call: "sap.get-medical-stock"
              with:
                vessel_code: "{{vessel_code}}"
            - name: create-order
              type: call
              call: "sap.create-purchase-requisition"
              with:
                vessel_code: "{{vessel_code}}"
                category: "medical"
                items: "{{check-levels.critical_items}}"
            - name: alert-doctor
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "medical_{{vessel_code}}"
                text: "Medical supply replenishment: {{vessel_code}}. {{check-levels.critical_count}} critical items below threshold. PR: {{create-order.pr_number}}. Next port delivery scheduled."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Plant eq '{{vessel_code}}' and MaterialGroup eq 'MEDICAL'"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-medical-stock
              method: GET
        - name: requisitions
          path: "/A_PurchaseRequisition"
          operations:
            - name: create-purchase-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs onboard retail shop inventory from SAP to the POS system via ServiceNow and updates retail analytics in Power BI.

naftiko: "0.5"
info:
  label: "Onboard Retail Inventory Sync Pipeline"
  description: "Syncs onboard retail shop inventory from SAP to the POS system via ServiceNow and updates retail analytics in Power BI."
  tags:
    - operations
    - retail
    - sap
    - servicenow
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: retail-inventory
      port: 8080
      tools:
        - name: sync-retail-inventory
          description: "Sync retail inventory from SAP and update analytics."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: shop_id
              in: body
              type: string
              description: "Onboard shop identifier."
          steps:
            - name: get-inventory
              type: call
              call: "sap.get-retail-stock"
              with:
                vessel_code: "{{vessel_code}}"
                shop_id: "{{shop_id}}"
            - name: sync-pos
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_inventory_sync"
                short_description: "Retail sync — {{vessel_code}} — {{shop_id}}"
                description: "Items synced: {{get-inventory.item_count}}. Total value: ${{get-inventory.total_value}}."
            - name: refresh-analytics
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "retail_operations"
                dataset_id: "onboard_retail"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Plant eq '{{vessel_code}}' and StorageLocation eq '{{shop_id}}'"
          inputParameters:
            - name: vessel_code
              in: query
            - name: shop_id
              in: query
          operations:
            - name: get-retail-stock
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Retrieves onboard revenue metrics (spa, casino, specialty dining) from SAP S/4HANA by ship and voyage, providing a daily revenue snapshot for operations leadership.

naftiko: "0.5"
info:
  label: "Onboard Revenue Reporting Snapshot"
  description: "Retrieves onboard revenue metrics (spa, casino, specialty dining) from SAP S/4HANA by ship and voyage, providing a daily revenue snapshot for operations leadership."
  tags:
    - finance
    - sap
    - reporting
    - revenue
    - ship-operations
capability:
  exposes:
    - type: mcp
      namespace: onboard-revenue
      port: 8080
      tools:
        - name: get-onboard-revenue-snapshot
          description: "Given a ship code and voyage ID, retrieve onboard revenue breakdown by category (spa, casino, dining, retail) from SAP S/4HANA for daily operations reporting."
          inputParameters:
            - name: ship_code
              in: body
              type: string
              description: "The ship identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "The voyage identifier for the reporting period."
          call: sap-revenue.get-onboard-revenue
          with:
            ship_code: "{{ship_code}}"
            voyage_id: "{{voyage_id}}"
          outputParameters:
            - name: spa_revenue
              type: string
              mapping: "$.results.spa_total"
            - name: casino_revenue
              type: string
              mapping: "$.results.casino_total"
            - name: dining_revenue
              type: string
              mapping: "$.results.dining_total"
            - name: retail_revenue
              type: string
              mapping: "$.results.retail_total"
            - name: total_onboard
              type: string
              mapping: "$.results.grand_total"
  consumes:
    - type: http
      namespace: sap-revenue
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/CO_OM_CCA_RESULTS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: onboard-revenue
          path: "/RevenueByCategory"
          inputParameters:
            - name: ship_code
              in: query
            - name: voyage_id
              in: query
          operations:
            - name: get-onboard-revenue
              method: GET

Retrieves port call details from SharePoint, sends coordination instructions to the port agent via WhatsApp, and logs the communication in Salesforce.

naftiko: "0.5"
info:
  label: "Port Agent Coordination Workflow"
  description: "Retrieves port call details from SharePoint, sends coordination instructions to the port agent via WhatsApp, and logs the communication in Salesforce."
  tags:
    - operations
    - port-coordination
    - sharepoint
    - whatsapp
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: port-coordination
      port: 8080
      tools:
        - name: coordinate-port-call
          description: "Send port call details to agent and log communication."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
            - name: port_code
              in: body
              type: string
              description: "Port location code."
          steps:
            - name: get-port-details
              type: call
              call: "sharepoint.get-port-call"
              with:
                voyage_id: "{{voyage_id}}"
                port_code: "{{port_code}}"
            - name: notify-agent
              type: call
              call: "whatsapp.send-message"
              with:
                phone_number: "{{get-port-details.agent_phone}}"
                message: "Port call update: Voyage {{voyage_id}} arriving {{get-port-details.arrival_time}} at {{port_code}}. Berth: {{get-port-details.berth}}. Passengers: {{get-port-details.pax_count}}."
            - name: log-communication
              type: call
              call: "salesforce.create-activity"
              with:
                voyage_id: "{{voyage_id}}"
                subject: "Port agent notification — {{port_code}}"
                description: "Agent notified for {{voyage_id}} at {{port_code}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: lists
          path: "/lists/port_calls/items?$filter=VoyageId eq '{{voyage_id}}' and PortCode eq '{{port_code}}'"
          inputParameters:
            - name: voyage_id
              in: query
            - name: port_code
              in: query
          operations:
            - name: get-port-call
              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"
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.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

Assembles port clearance documents from SharePoint, validates crew manifests against Workday, and submits the package via the port authority portal.

naftiko: "0.5"
info:
  label: "Port Clearance Documentation Workflow"
  description: "Assembles port clearance documents from SharePoint, validates crew manifests against Workday, and submits the package via the port authority portal."
  tags:
    - operations
    - port-clearance
    - sharepoint
    - workday
capability:
  exposes:
    - type: mcp
      namespace: port-clearance
      port: 8080
      tools:
        - name: prepare-port-clearance
          description: "Assemble clearance documents and validate crew manifests."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: port_code
              in: body
              type: string
              description: "Port location code."
          steps:
            - name: get-documents
              type: call
              call: "sharepoint.list-folder"
              with:
                folder_path: "Port_Clearance/{{vessel_code}}/{{port_code}}"
            - name: get-crew-manifest
              type: call
              call: "workday.get-crew-manifest"
              with:
                vessel_code: "{{vessel_code}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: manifests
          path: "/workers?location={{vessel_code}}&status=active"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-crew-manifest
              method: GET

Syncs shore excursion availability from the booking platform into Salesforce, ensuring agent-facing records reflect current capacity for each port of call.

naftiko: "0.5"
info:
  label: "Port Excursion Inventory Sync"
  description: "Syncs shore excursion availability from the booking platform into Salesforce, ensuring agent-facing records reflect current capacity for each port of call."
  tags:
    - operations
    - salesforce
    - inventory
    - shore-excursions
capability:
  exposes:
    - type: mcp
      namespace: excursion-inventory
      port: 8080
      tools:
        - name: sync-excursion-inventory
          description: "Given a port code and sail date, retrieve current shore excursion capacity and update the corresponding Salesforce records for travel agent visibility."
          inputParameters:
            - name: port_code
              in: body
              type: string
              description: "The port of call code (e.g., MIA, CZM)."
            - name: sail_date
              in: body
              type: string
              description: "The sail date in YYYY-MM-DD format."
          steps:
            - name: get-excursions
              type: call
              call: salesforce-excursion.query-excursions
              with:
                port_code: "{{port_code}}"
                sail_date: "{{sail_date}}"
            - name: update-capacity
              type: call
              call: salesforce-update.update-excursion
              with:
                port_code: "{{port_code}}"
                sail_date: "{{sail_date}}"
                available_slots: "{{get-excursions.available_slots}}"
  consumes:
    - type: http
      namespace: salesforce-excursion
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: excursions
          path: "/query"
          inputParameters:
            - name: port_code
              in: query
            - name: sail_date
              in: query
          operations:
            - name: query-excursions
              method: GET
    - type: http
      namespace: salesforce-update
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: excursion-records
          path: "/sobjects/ShoreExcursion__c"
          operations:
            - name: update-excursion
              method: PATCH

Triggers a scheduled refresh of the Power BI fleet performance dashboard, pulling latest voyage data from SAP S/4HANA for executive reporting.

naftiko: "0.5"
info:
  label: "Power BI Fleet Performance Dashboard Refresh"
  description: "Triggers a scheduled refresh of the Power BI fleet performance dashboard, pulling latest voyage data from SAP S/4HANA for executive reporting."
  tags:
    - analytics
    - power-bi
    - sap
    - reporting
    - fleet-operations
capability:
  exposes:
    - type: mcp
      namespace: fleet-analytics
      port: 8080
      tools:
        - name: refresh-fleet-dashboard
          description: "Trigger a Power BI dataset refresh for the fleet performance dashboard, pulling updated voyage KPIs from SAP. Use for scheduled or on-demand executive reporting refreshes."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the fleet performance dashboard."
          call: powerbi.trigger-refresh
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_id
              type: string
              mapping: "$.id"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Checks the last refresh status of the fleet occupancy Power BI dashboard, returning refresh status and completion time.

naftiko: "0.5"
info:
  label: "Power BI Occupancy Dashboard Status"
  description: "Checks the last refresh status of the fleet occupancy Power BI dashboard, returning refresh status and completion time."
  tags:
    - analytics
    - occupancy
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: occupancy-reporting
      port: 8080
      tools:
        - name: get-occupancy-dashboard-status
          description: "Get the last refresh status of the occupancy dashboard."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: "powerbi.get-refresh-history"
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Creates a purchase order in SAP Ariba for ship provisioning supplies, triggered when a supply requisition is approved in ServiceNow.

naftiko: "0.5"
info:
  label: "Procurement Purchase Order Creation"
  description: "Creates a purchase order in SAP Ariba for ship provisioning supplies, triggered when a supply requisition is approved in ServiceNow."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: create-supply-po
          description: "Given an approved ServiceNow requisition ID, retrieve line items and create a corresponding purchase order in SAP Ariba for ship provisioning."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The ServiceNow requisition ID that has been approved."
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID for the purchase order."
          steps:
            - name: get-requisition
              type: call
              call: servicenow-proc.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-po
              type: call
              call: sap-ariba.create-po
              with:
                supplier_id: "{{supplier_id}}"
                description: "Ship provisioning order from requisition {{requisition_id}}"
                total_amount: "{{get-requisition.total_amount}}"
  consumes:
    - type: http
      namespace: servicenow-proc
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requisitions
          path: "/table/sc_request/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/purchase-orders/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: purchase-orders
          path: "/orders"
          operations:
            - name: create-po
              method: POST

Tracks ship safety and regulatory compliance document expiration dates in ServiceNow, alerting the compliance team via Microsoft Teams when renewals are due within 60 days.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Document Tracker"
  description: "Tracks ship safety and regulatory compliance document expiration dates in ServiceNow, alerting the compliance team via Microsoft Teams when renewals are due within 60 days."
  tags:
    - compliance
    - servicenow
    - microsoft-teams
    - safety
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: compliance-ops
      port: 8080
      tools:
        - name: check-compliance-expirations
          description: "Given a ship code, query ServiceNow for all compliance documents expiring within 60 days and post an alert summary to the compliance team's Teams channel."
          inputParameters:
            - name: ship_code
              in: body
              type: string
              description: "The ship identifier code to check compliance documents for."
          steps:
            - name: get-expiring-docs
              type: call
              call: servicenow-compliance.get-expiring-documents
              with:
                ship_code: "{{ship_code}}"
            - name: post-alert
              type: call
              call: msteams-compliance.send-compliance-alert
              with:
                channel_id: "compliance-team"
                text: "Compliance Alert for {{ship_code}}: {{get-expiring-docs.count}} documents expiring within 60 days. Documents: {{get-expiring-docs.document_list}}"
  consumes:
    - type: http
      namespace: servicenow-compliance
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance-documents
          path: "/table/cmdb_ci_policy"
          inputParameters:
            - name: ship_code
              in: query
          operations:
            - name: get-expiring-documents
              method: GET
    - type: http
      namespace: msteams-compliance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: compliance-messages
          path: "/teams/compliance/channels/general/messages"
          operations:
            - name: send-compliance-alert
              method: POST

Retrieves booking revenue data from Salesforce by voyage ID, returning total revenue, cabin count, and average daily rate.

naftiko: "0.5"
info:
  label: "Salesforce Booking Revenue Lookup"
  description: "Retrieves booking revenue data from Salesforce by voyage ID, returning total revenue, cabin count, and average daily rate."
  tags:
    - revenue-management
    - booking
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: booking-revenue
      port: 8080
      tools:
        - name: get-booking-revenue
          description: "Look up voyage booking revenue in Salesforce."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          call: "salesforce.get-voyage-revenue"
          with:
            voyage_id: "{{voyage_id}}"
          outputParameters:
            - name: total_revenue
              type: number
              mapping: "$.Total_Revenue__c"
            - name: cabin_count
              type: number
              mapping: "$.Cabin_Count__c"
            - name: avg_daily_rate
              type: number
              mapping: "$.Avg_Daily_Rate__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: voyages
          path: "/sobjects/Voyage__c/{{voyage_id}}"
          inputParameters:
            - name: voyage_id
              in: path
          operations:
            - name: get-voyage-revenue
              method: GET

When a group cruise booking inquiry arrives in Salesforce, creates a ServiceNow case, sends Teams notification, and logs in SharePoint.

naftiko: "0.5"
info:
  label: "Salesforce Group Booking Handler"
  description: "When a group cruise booking inquiry arrives in Salesforce, creates a ServiceNow case, sends Teams notification, and logs in SharePoint."
  tags:
    - sales
    - salesforce
    - servicenow
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: group-sales
      port: 8080
      tools:
        - name: process-group-inquiry
          description: "Given a Salesforce opportunity ID, create case, notify team, and log inquiry."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Group booking: {{get-opportunity.Name}}"
                category: "group_sales"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "group-sales"
                message: "New group inquiry: {{get-opportunity.Name}}, {{get-opportunity.Guest_Count__c}} guests. Case: {{create-case.number}}"
            - name: log-inquiry
              type: call
              call: "sharepoint.create-item"
              with:
                site_id: "carnival-group-sales"
                list_name: "GroupInquiries"
                fields:
                  opportunity: "{{get-opportunity.Name}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.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: channels
          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"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_name}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_name
              in: path
          operations:
            - name: create-item
              method: POST

Pulls the current B2B travel agency and group booking opportunity pipeline from Salesforce and posts a weekly revenue forecast digest to the sales leadership Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Digest"
  description: "Pulls the current B2B travel agency and group booking opportunity pipeline from Salesforce and posts a weekly revenue forecast digest to the sales leadership Teams channel."
  tags:
    - sales
    - salesforce
    - microsoft-teams
    - reporting
    - revenue-forecast
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: digest-opportunity-pipeline
          description: "Query Salesforce for all open sales opportunities above a minimum value and post a formatted pipeline summary to the sales leadership Teams channel for weekly review."
          inputParameters:
            - name: min_opportunity_value
              in: body
              type: number
              description: "Minimum opportunity value in USD to include in the pipeline digest."
            - name: forecast_period
              in: body
              type: string
              description: "The forecast period label (e.g., 'Q2 2026')."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce-sales.get-opportunities
              with:
                min_value: "{{min_opportunity_value}}"
            - name: post-digest
              type: call
              call: msteams-sales.send-pipeline-digest
              with:
                channel_id: "sales-leadership"
                text: "Pipeline Digest | {{forecast_period}} | Open Opportunities: {{get-pipeline.count}} | Total Value: {{get-pipeline.total_value}} | Weighted: {{get-pipeline.weighted_value}}"
  consumes:
    - type: http
      namespace: salesforce-sales
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: min_value
              in: query
          operations:
            - name: get-opportunities
              method: GET
    - type: http
      namespace: msteams-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: sales-messages
          path: "/teams/sales-leadership/channels/general/messages"
          operations:
            - name: send-pipeline-digest
              method: POST

Retrieves current bunker fuel prices from SAP by port and fuel type, returning price per metric ton and last updated timestamp.

naftiko: "0.5"
info:
  label: "SAP Bunker Fuel Price Lookup"
  description: "Retrieves current bunker fuel prices from SAP by port and fuel type, returning price per metric ton and last updated timestamp."
  tags:
    - operations
    - fuel-procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: fuel-pricing
      port: 8080
      tools:
        - name: get-bunker-price
          description: "Look up bunker fuel prices by port and fuel type."
          inputParameters:
            - name: port_code
              in: body
              type: string
              description: "Port location code."
            - name: fuel_type
              in: body
              type: string
              description: "Fuel type (MGO, VLSFO, HFO)."
          call: "sap.get-fuel-price"
          with:
            port_code: "{{port_code}}"
            fuel_type: "{{fuel_type}}"
          outputParameters:
            - name: price_per_mt
              type: number
              mapping: "$.d.PricePerMT"
            - name: currency
              type: string
              mapping: "$.d.Currency"
            - name: last_updated
              type: string
              mapping: "$.d.LastUpdated"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fuel-prices
          path: "/A_ProductValuation?$filter=Port eq '{{port_code}}' and FuelType eq '{{fuel_type}}'"
          inputParameters:
            - name: port_code
              in: query
            - name: fuel_type
              in: query
          operations:
            - name: get-fuel-price
              method: GET

Processes incoming supplier invoices in SAP S/4HANA, matching them against purchase orders in SAP Ariba and flagging discrepancies via ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Invoice Processing Workflow"
  description: "Processes incoming supplier invoices in SAP S/4HANA, matching them against purchase orders in SAP Ariba and flagging discrepancies via ServiceNow."
  tags:
    - finance
    - sap
    - sap-ariba
    - servicenow
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-processing
      port: 8080
      tools:
        - name: process-supplier-invoice
          description: "Given an invoice number and supplier ID, retrieve the invoice from SAP S/4HANA, match it against the Ariba PO, and open a ServiceNow discrepancy ticket if amounts do not match."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The supplier invoice number to process."
            - name: supplier_id
              in: body
              type: string
              description: "The SAP supplier ID associated with this invoice."
          steps:
            - name: get-invoice
              type: call
              call: sap-ap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po
              type: call
              call: sap-ariba-match.get-po-for-invoice
              with:
                supplier_id: "{{supplier_id}}"
                invoice_number: "{{invoice_number}}"
            - name: flag-discrepancy
              type: call
              call: servicenow-ap.create-discrepancy
              with:
                short_description: "Invoice discrepancy: {{invoice_number}} | Supplier: {{supplier_id}}"
                invoice_amount: "{{get-invoice.total_amount}}"
                po_amount: "{{get-po.total_amount}}"
  consumes:
    - type: http
      namespace: sap-ap
      baseUri: "https://carnival-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"
          inputParameters:
            - name: invoice_number
              in: query
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-ariba-match
      baseUri: "https://openapi.ariba.com/api/purchase-orders/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: po-match
          path: "/orders"
          inputParameters:
            - name: supplier_id
              in: query
            - name: invoice_number
              in: query
          operations:
            - name: get-po-for-invoice
              method: GET
    - type: http
      namespace: servicenow-ap
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: discrepancies
          path: "/table/incident"
          operations:
            - name: create-discrepancy
              method: POST

Retrieves vessel maintenance cost data from SAP for a specified ship and period, returning planned vs actual maintenance spend.

naftiko: "0.5"
info:
  label: "SAP Vessel Maintenance Cost Lookup"
  description: "Retrieves vessel maintenance cost data from SAP for a specified ship and period, returning planned vs actual maintenance spend."
  tags:
    - finance
    - sap
    - maritime
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: fleet-finance
      port: 8080
      tools:
        - name: get-maintenance-costs
          description: "Given a vessel code and period, retrieve maintenance cost data from SAP."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "The vessel identifier."
            - name: period
              in: body
              type: string
              description: "Period in YYYY-MM format."
          call: "sap.get-maintenance-costs"
          with:
            vessel_code: "{{vessel_code}}"
            period: "{{period}}"
          outputParameters:
            - name: planned_cost
              type: string
              mapping: "$.costs.planned_amount"
            - name: actual_cost
              type: string
              mapping: "$.costs.actual_amount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-sap.s4hana.cloud.sap/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: maintenance
          path: "/maintenance/costs"
          operations:
            - name: get-maintenance-costs
              method: GET

Retrieves spare parts inventory for a specific vessel from SAP, returning part number, description, quantity on hand, and reorder point.

naftiko: "0.5"
info:
  label: "SAP Vessel Spare Parts Lookup"
  description: "Retrieves spare parts inventory for a specific vessel from SAP, returning part number, description, quantity on hand, and reorder point."
  tags:
    - operations
    - spare-parts
    - sap
    - ship-operations
capability:
  exposes:
    - type: mcp
      namespace: spare-parts
      port: 8080
      tools:
        - name: get-spare-parts
          description: "Look up vessel spare parts inventory in SAP."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "The vessel identifier code."
            - name: part_category
              in: body
              type: string
              description: "Spare parts category."
          call: "sap.get-parts-inventory"
          with:
            vessel_code: "{{vessel_code}}"
            category: "{{part_category}}"
          outputParameters:
            - name: parts
              type: array
              mapping: "$.d.results"
            - name: total_count
              type: number
              mapping: "$.d.__count"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Plant eq '{{vessel_code}}' and MaterialGroup eq '{{category}}'"
          inputParameters:
            - name: vessel_code
              in: query
            - name: category
              in: query
          operations:
            - name: get-parts-inventory
              method: GET

Pulls the complete IT asset inventory for a ship or shore location from ServiceNow CMDB, returning asset counts by category and flagging unregistered devices.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Inventory Audit"
  description: "Pulls the complete IT asset inventory for a ship or shore location from ServiceNow CMDB, returning asset counts by category and flagging unregistered devices."
  tags:
    - itsm
    - servicenow
    - asset-management
    - audit
capability:
  exposes:
    - type: mcp
      namespace: asset-audit
      port: 8080
      tools:
        - name: get-asset-inventory
          description: "Given a location code (ship or shore facility), retrieve all registered IT assets from ServiceNow CMDB, returning counts by category and any unregistered devices."
          inputParameters:
            - name: location_code
              in: body
              type: string
              description: "The ship or shore facility location code."
          call: servicenow.get-asset-inventory
          with:
            location: "{{location_code}}"
          outputParameters:
            - name: total_assets
              type: string
              mapping: "$.result.count"
            - name: hardware_count
              type: string
              mapping: "$.result.hardware"
            - name: software_count
              type: string
              mapping: "$.result.software"
            - name: unregistered_count
              type: string
              mapping: "$.result.unregistered"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb-assets
          path: "/table/cmdb_ci"
          inputParameters:
            - name: location
              in: query
          operations:
            - name: get-asset-inventory
              method: GET

Retrieves a guest service incident from ServiceNow by incident number, returning description, status, and assigned agent.

naftiko: "0.5"
info:
  label: "ServiceNow Guest Incident Lookup"
  description: "Retrieves a guest service incident from ServiceNow by incident number, returning description, status, and assigned agent."
  tags:
    - guest-services
    - incident-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: guest-incidents
      port: 8080
      tools:
        - name: get-guest-incident
          description: "Look up a guest service incident in ServiceNow."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.result.short_description"
            - name: status
              type: string
              mapping: "$.result.state"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

When a regulatory document is uploaded to SharePoint, triggers a review workflow in ServiceNow and notifies the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SharePoint Document Lifecycle Manager"
  description: "When a regulatory document is uploaded to SharePoint, triggers a review workflow in ServiceNow and notifies the compliance team via Microsoft Teams."
  tags:
    - compliance
    - sharepoint
    - servicenow
    - microsoft-teams
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: document-lifecycle
      port: 8080
      tools:
        - name: trigger-document-review
          description: "Given a SharePoint document ID and site URL, open a ServiceNow review task for the compliance team and send a notification via Microsoft Teams with a direct document link."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The SharePoint document unique ID."
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site identifier where the document is stored."
            - name: document_title
              in: body
              type: string
              description: "The title of the document requiring review."
          steps:
            - name: get-document-meta
              type: call
              call: sharepoint.get-document
              with:
                site_id: "{{site_id}}"
                document_id: "{{document_id}}"
            - name: create-review-task
              type: call
              call: servicenow-docs.create-review-task
              with:
                short_description: "Compliance document review: {{document_title}}"
                document_url: "{{get-document-meta.web_url}}"
                assigned_group: "Compliance_Review"
            - name: notify-compliance
              type: call
              call: msteams-docs.send-review-notification
              with:
                channel_id: "compliance-team"
                text: "Document Review Required: {{document_title}} | SharePoint: {{get-document-meta.web_url}} | Task: {{create-review-task.number}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/items/{{document_id}}"
          inputParameters:
            - name: site_id
              in: path
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: servicenow-docs
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: review-tasks
          path: "/table/sc_task"
          operations:
            - name: create-review-task
              method: POST
    - type: http
      namespace: msteams-docs
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: doc-messages
          path: "/teams/compliance/channels/document-review/messages"
          operations:
            - name: send-review-notification
              method: POST

Retrieves the port call schedule from SharePoint for a specific vessel and voyage, returning port name, arrival, departure, and berth assignment.

naftiko: "0.5"
info:
  label: "SharePoint Port Schedule Lookup"
  description: "Retrieves the port call schedule from SharePoint for a specific vessel and voyage, returning port name, arrival, departure, and berth assignment."
  tags:
    - operations
    - port-schedule
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: port-scheduling
      port: 8080
      tools:
        - name: get-port-schedule
          description: "Look up port call schedule from SharePoint."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          call: "sharepoint.get-schedule"
          with:
            voyage_id: "{{voyage_id}}"
          outputParameters:
            - name: port_calls
              type: array
              mapping: "$.value"
            - name: total_ports
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: lists
          path: "/lists/port_schedules/items?$filter=VoyageId eq '{{voyage_id}}'"
          inputParameters:
            - name: voyage_id
              in: query
          operations:
            - name: get-schedule
              method: GET

Looks up an open maintenance work order from ServiceNow for a given ship and equipment ID, returning status, assigned technician, and priority.

naftiko: "0.5"
info:
  label: "Ship Maintenance Work Order Lookup"
  description: "Looks up an open maintenance work order from ServiceNow for a given ship and equipment ID, returning status, assigned technician, and priority."
  tags:
    - operations
    - servicenow
    - maintenance
    - ship-operations
capability:
  exposes:
    - type: mcp
      namespace: ship-maintenance
      port: 8080
      tools:
        - name: get-work-order
          description: "Given a ship code and equipment ID, look up the active maintenance work order in ServiceNow. Returns work order number, status, assigned technician, and priority level."
          inputParameters:
            - name: ship_code
              in: body
              type: string
              description: "The ship identifier code (e.g., CCL-MAGIC)."
            - name: equipment_id
              in: body
              type: string
              description: "The equipment asset ID requiring maintenance."
          call: servicenow.get-work-order
          with:
            ship_code: "{{ship_code}}"
            equipment_id: "{{equipment_id}}"
          outputParameters:
            - name: work_order_number
              type: string
              mapping: "$.result.number"
            - name: status
              type: string
              mapping: "$.result.state"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          inputParameters:
            - name: ship_code
              in: query
            - name: equipment_id
              in: query
          operations:
            - name: get-work-order
              method: GET

Monitors shipboard WiFi performance from Datadog, creates incident tickets in ServiceNow when thresholds are breached, and alerts the IT team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Shipboard WiFi Performance Pipeline"
  description: "Monitors shipboard WiFi performance from Datadog, creates incident tickets in ServiceNow when thresholds are breached, and alerts the IT team via Microsoft Teams."
  tags:
    - it-operations
    - wifi
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: wifi-performance
      port: 8080
      tools:
        - name: monitor-wifi-performance
          description: "Monitor WiFi, create incidents on threshold breach, and alert IT."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: threshold_mbps
              in: body
              type: number
              description: "Minimum acceptable bandwidth in Mbps."
          steps:
            - name: get-wifi-metrics
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:wifi.bandwidth{vessel:{{vessel_code}}}"
                from: "now-1h"
                to: "now"
            - name: create-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "incident"
                short_description: "WiFi degradation — {{vessel_code}}"
                description: "Average bandwidth: {{get-wifi-metrics.avg_value}} Mbps (threshold: {{threshold_mbps}} Mbps)."
            - name: alert-it
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "shipboard_it_{{vessel_code}}"
                text: "WiFi Alert: {{vessel_code}} bandwidth {{get-wifi-metrics.avg_value}} Mbps (threshold: {{threshold_mbps}}). Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes a shore excursion booking from Salesforce, updates inventory in the excursion system, and sends confirmation to the guest via WhatsApp.

naftiko: "0.5"
info:
  label: "Shore Excursion Booking Orchestrator"
  description: "Processes a shore excursion booking from Salesforce, updates inventory in the excursion system, and sends confirmation to the guest via WhatsApp."
  tags:
    - guest-services
    - shore-excursions
    - salesforce
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: excursion-booking
      port: 8080
      tools:
        - name: book-shore-excursion
          description: "Process excursion booking, update inventory, and confirm."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "Guest booking reference."
            - name: excursion_id
              in: body
              type: string
              description: "Shore excursion identifier."
            - name: guest_count
              in: body
              type: integer
              description: "Number of guests."
          steps:
            - name: create-booking
              type: call
              call: "salesforce.create-excursion-booking"
              with:
                booking_ref: "{{booking_ref}}"
                excursion_id: "{{excursion_id}}"
                guest_count: "{{guest_count}}"
            - name: confirm-guest
              type: call
              call: "whatsapp.send-message"
              with:
                booking_ref: "{{booking_ref}}"
                message: "Your shore excursion is confirmed! Excursion: {{create-booking.excursion_name}}. Date: {{create-booking.excursion_date}}. Guests: {{guest_count}}. Total: ${{create-booking.total_price}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: excursions
          path: "/sobjects/Excursion_Booking__c"
          operations:
            - name: create-excursion-booking
              method: POST
    - 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"
          operations:
            - name: send-message
              method: POST

Creates a change request in ServiceNow for shore power electrical infrastructure work at a port, linking it to the relevant ship maintenance schedule.

naftiko: "0.5"
info:
  label: "Shore Power Infrastructure Change Request"
  description: "Creates a change request in ServiceNow for shore power electrical infrastructure work at a port, linking it to the relevant ship maintenance schedule."
  tags:
    - operations
    - servicenow
    - change-management
    - sustainability
capability:
  exposes:
    - type: mcp
      namespace: shore-power-ops
      port: 8080
      tools:
        - name: create-shore-power-change
          description: "Given a port facility and planned date, open a ServiceNow change request for shore power infrastructure modifications, assigning it to the marine engineering team."
          inputParameters:
            - name: port_facility
              in: body
              type: string
              description: "The port facility identifier where work is planned."
            - name: planned_date
              in: body
              type: string
              description: "The planned work date in YYYY-MM-DD format."
            - name: description
              in: body
              type: string
              description: "Description of the infrastructure change work."
          call: servicenow.create-change
          with:
            short_description: "Shore power infrastructure work at {{port_facility}} on {{planned_date}}"
            description: "{{description}}"
            assignment_group: "Marine_Engineering"
            change_type: "planned"
          outputParameters:
            - name: change_number
              type: string
              mapping: "$.result.number"
            - name: state
              type: string
              mapping: "$.result.state"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves spa booking data from Salesforce, calculates revenue per guest in Azure Databricks, and updates the spa performance dashboard in Tableau.

naftiko: "0.5"
info:
  label: "Spa Booking Revenue Pipeline"
  description: "Retrieves spa booking data from Salesforce, calculates revenue per guest in Azure Databricks, and updates the spa performance dashboard in Tableau."
  tags:
    - revenue-management
    - spa
    - salesforce
    - azure-databricks
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: spa-revenue
      port: 8080
      tools:
        - name: analyze-spa-revenue
          description: "Analyze spa revenue and update performance dashboard."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
          steps:
            - name: get-spa-data
              type: call
              call: "salesforce.get-spa-bookings"
              with:
                vessel_code: "{{vessel_code}}"
                voyage_id: "{{voyage_id}}"
            - name: run-analysis
              type: call
              call: "databricks.run-job"
              with:
                job_id: "spa_revenue_analysis"
                vessel_code: "{{vessel_code}}"
                booking_count: "{{get-spa-data.total_bookings}}"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "spa_performance"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: spa
          path: "/query?q=SELECT+Count(Id),SUM(Amount__c)+FROM+Spa_Booking__c+WHERE+Vessel__c='{{vessel_code}}'"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-spa-bookings
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://carnival.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://carnival-tableau.corp.net/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Triggers Tableau workbook refresh for voyage revenue dashboards and notifies finance leadership.

naftiko: "0.5"
info:
  label: "Tableau Voyage Revenue Dashboard"
  description: "Triggers Tableau workbook refresh for voyage revenue dashboards and notifies finance leadership."
  tags:
    - finance
    - tableau
    - microsoft-teams
    - revenue-management
capability:
  exposes:
    - type: mcp
      namespace: revenue-reporting
      port: 8080
      tools:
        - name: refresh-voyage-dashboard
          description: "Given a workbook ID, trigger refresh and notify finance."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          steps:
            - name: trigger-refresh
              type: call
              call: "tableau.refresh-workbook"
              with:
                workbook_id: "{{workbook_id}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "finance-leadership"
                message: "Voyage revenue dashboard refreshed. Job: {{trigger-refresh.job.id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://carnival-tableau.online.tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/carnival/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves tender port details from SharePoint, creates a tender operations plan in ServiceNow, and notifies the deck team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tender Operation Coordination Workflow"
  description: "Retrieves tender port details from SharePoint, creates a tender operations plan in ServiceNow, and notifies the deck team via Microsoft Teams."
  tags:
    - operations
    - tender
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tender-operations
      port: 8080
      tools:
        - name: coordinate-tender-ops
          description: "Plan and coordinate tender operations for a port call."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: port_code
              in: body
              type: string
              description: "Tender port location code."
          steps:
            - name: get-port-info
              type: call
              call: "sharepoint.get-tender-port"
              with:
                port_code: "{{port_code}}"
            - name: create-ops-plan
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_tender_ops"
                short_description: "Tender operations — {{vessel_code}} — {{port_code}}"
                description: "Tender port: {{get-port-info.port_name}}. Capacity: {{get-port-info.tender_capacity}}. Schedule: {{get-port-info.schedule}}."
            - name: notify-deck
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "deck_{{vessel_code}}"
                text: "Tender operations planned: {{vessel_code}} at {{port_code}} ({{get-port-info.port_name}}). Capacity: {{get-port-info.tender_capacity}} pax/trip. Plan: {{create-ops-plan.number}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: lists
          path: "/lists/tender_ports/items?$filter=PortCode eq '{{port_code}}'"
          inputParameters:
            - name: port_code
              in: query
          operations:
            - name: get-tender-port
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Calculates travel agent commissions from Salesforce booking data, processes payments in SAP, and sends commission statements via email.

naftiko: "0.5"
info:
  label: "Travel Agent Commission Processing Workflow"
  description: "Calculates travel agent commissions from Salesforce booking data, processes payments in SAP, and sends commission statements via email."
  tags:
    - finance
    - commissions
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agent-commissions
      port: 8080
      tools:
        - name: process-agent-commissions
          description: "Calculate commissions, process payments, and send statements."
          inputParameters:
            - name: agent_id
              in: body
              type: string
              description: "Travel agent account ID."
            - name: period
              in: body
              type: string
              description: "Commission period (e.g., 2026-03)."
          steps:
            - name: get-bookings
              type: call
              call: "salesforce.get-agent-bookings"
              with:
                agent_id: "{{agent_id}}"
                period: "{{period}}"
            - name: process-payment
              type: call
              call: "sap.create-payment"
              with:
                vendor: "{{agent_id}}"
                amount: "{{get-bookings.total_commission}}"
                reference: "COMM-{{agent_id}}-{{period}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "agent_finance"
                text: "Commission processed: Agent {{agent_id}} for {{period}}. Bookings: {{get-bookings.booking_count}}. Commission: ${{get-bookings.total_commission}}. Payment: {{process-payment.document_number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bookings
          path: "/query?q=SELECT+Count(Id),SUM(Commission__c)+FROM+Booking__c+WHERE+Agent__c='{{agent_id}}'"
          inputParameters:
            - name: agent_id
              in: query
          operations:
            - name: get-agent-bookings
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: payments
          path: "/A_SupplierInvoice"
          operations:
            - name: create-payment
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls vendor delivery metrics from SAP, evaluates quality scores in ServiceNow, and generates a review summary in Confluence.

naftiko: "0.5"
info:
  label: "Vendor Performance Review Pipeline"
  description: "Pulls vendor delivery metrics from SAP, evaluates quality scores in ServiceNow, and generates a review summary in Confluence."
  tags:
    - supply-chain
    - vendor-management
    - sap
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor-performance
          description: "Evaluate vendor performance and generate review summary."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor number."
            - name: period
              in: body
              type: string
              description: "Review period (e.g., 2026-Q1)."
          steps:
            - name: get-delivery-metrics
              type: call
              call: "sap.get-vendor-deliveries"
              with:
                vendor_number: "{{vendor_number}}"
                period: "{{period}}"
            - name: get-quality-scores
              type: call
              call: "servicenow.query-records"
              with:
                table: "x_ccl_vendor_quality"
                query: "vendor={{vendor_number}}^period={{period}}"
            - name: publish-review
              type: call
              call: "confluence.create-page"
              with:
                space: "PROC"
                title: "Vendor Review — {{vendor_number}} — {{period}}"
                content: "On-time delivery: {{get-delivery-metrics.on_time_pct}}%. Quality score: {{get-quality-scores.avg_score}}/100."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_INBOUND_DELIVERY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_InboundDelivery?$filter=Vendor eq '{{vendor_number}}'"
          inputParameters:
            - name: vendor_number
              in: query
          operations:
            - name: get-vendor-deliveries
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://carnival.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves vessel maintenance requirements from SAP, creates a dry dock project plan in Jira, and notifies the fleet operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vessel Dry Dock Planning Workflow"
  description: "Retrieves vessel maintenance requirements from SAP, creates a dry dock project plan in Jira, and notifies the fleet operations team via Microsoft Teams."
  tags:
    - operations
    - dry-dock
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dry-dock-planning
      port: 8080
      tools:
        - name: plan-dry-dock
          description: "Retrieve maintenance requirements, create project plan, and notify fleet ops."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: planned_date
              in: body
              type: string
              description: "Planned dry dock start date in YYYY-MM-DD."
          steps:
            - name: get-maintenance-items
              type: call
              call: "sap.get-maintenance-backlog"
              with:
                vessel_code: "{{vessel_code}}"
            - name: create-project
              type: call
              call: "jira.create-issue"
              with:
                project: "DDK"
                issuetype: "Epic"
                summary: "Dry Dock — {{vessel_code}} — {{planned_date}}"
                description: "Maintenance items: {{get-maintenance-items.item_count}}. Planned start: {{planned_date}}."
            - name: notify-fleet-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fleet_operations"
                text: "Dry dock planned: {{vessel_code}} on {{planned_date}}. {{get-maintenance-items.item_count}} maintenance items. Project: {{create-project.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCE_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_MaintenanceOrder?$filter=TechnicalObject eq '{{vessel_code}}'"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-maintenance-backlog
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://carnival.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks vessel inventory levels in SAP against par levels, creates purchase requisitions, and notifies the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vessel Inventory Replenishment Orchestrator"
  description: "Checks vessel inventory levels in SAP against par levels, creates purchase requisitions, and notifies the procurement team via Microsoft Teams."
  tags:
    - supply-chain
    - inventory
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vessel-replenishment
      port: 8080
      tools:
        - name: replenish-vessel-inventory
          description: "Check inventory levels and create replenishment orders."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
            - name: category
              in: body
              type: string
              description: "Inventory category (provisions, hotel-supplies, technical)."
          steps:
            - name: check-levels
              type: call
              call: "sap.get-vessel-inventory"
              with:
                vessel_code: "{{vessel_code}}"
                category: "{{category}}"
            - name: create-requisition
              type: call
              call: "sap.create-purchase-requisition"
              with:
                vessel_code: "{{vessel_code}}"
                items: "{{check-levels.below_par_items}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement"
                text: "Replenishment requisition for {{vessel_code}} ({{category}}): {{check-levels.below_par_count}} items below par. PR: {{create-requisition.pr_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Plant eq '{{vessel_code}}'"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-vessel-inventory
              method: GET
        - name: requisitions
          path: "/A_PurchaseRequisition"
          operations:
            - name: create-purchase-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects voyage revenue data from Salesforce, reconciles costs in SAP, and generates a voyage P&L report in Power BI.

naftiko: "0.5"
info:
  label: "Voyage Financial Close Pipeline"
  description: "Collects voyage revenue data from Salesforce, reconciles costs in SAP, and generates a voyage P&L report in Power BI."
  tags:
    - finance
    - voyage-close
    - salesforce
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: voyage-financial-close
      port: 8080
      tools:
        - name: close-voyage-financials
          description: "Collect revenue, reconcile costs, and generate P&L."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
          steps:
            - name: get-revenue
              type: call
              call: "salesforce.get-voyage-revenue"
              with:
                voyage_id: "{{voyage_id}}"
            - name: get-costs
              type: call
              call: "sap.get-voyage-costs"
              with:
                vessel_code: "{{vessel_code}}"
                voyage_id: "{{voyage_id}}"
            - name: refresh-pnl
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "finance"
                dataset_id: "voyage_pnl"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: voyages
          path: "/sobjects/Voyage__c/{{voyage_id}}"
          inputParameters:
            - name: voyage_id
              in: path
          operations:
            - name: get-voyage-revenue
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/A_CostCenter('{{vessel_code}}')/to_CostElements"
          inputParameters:
            - name: vessel_code
              in: path
          operations:
            - name: get-voyage-costs
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Updates the voyage itinerary in Salesforce, notifies affected guests via WhatsApp, and updates the port schedule in SharePoint.

naftiko: "0.5"
info:
  label: "Voyage Itinerary Change Workflow"
  description: "Updates the voyage itinerary in Salesforce, notifies affected guests via WhatsApp, and updates the port schedule in SharePoint."
  tags:
    - operations
    - itinerary
    - salesforce
    - whatsapp
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: itinerary-changes
      port: 8080
      tools:
        - name: change-itinerary
          description: "Update itinerary, notify guests, and update port schedule."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "Voyage identifier."
            - name: change_description
              in: body
              type: string
              description: "Description of the itinerary change."
            - name: affected_port
              in: body
              type: string
              description: "Affected port name."
          steps:
            - name: update-voyage
              type: call
              call: "salesforce.update-voyage"
              with:
                voyage_id: "{{voyage_id}}"
                itinerary_change: "{{change_description}}"
            - name: notify-guests
              type: call
              call: "whatsapp.send-broadcast"
              with:
                voyage_id: "{{voyage_id}}"
                message: "Itinerary update for your cruise: {{change_description}}. Affected port: {{affected_port}}. Please check your Carnival app for details."
            - name: update-schedule
              type: call
              call: "sharepoint.update-list-item"
              with:
                list_id: "port_schedules"
                voyage_id: "{{voyage_id}}"
                change_note: "{{change_description}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: voyages
          path: "/sobjects/Voyage__c/{{voyage_id}}"
          inputParameters:
            - name: voyage_id
              in: path
          operations:
            - name: update-voyage
              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"
          operations:
            - name: send-broadcast
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/carnival.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/lists/{{list_id}}/items"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: update-list-item
              method: PATCH

Retrieves voyage-level revenue figures from SAP and posts a formatted financial summary to the finance team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Voyage Revenue Snapshot"
  description: "Retrieves voyage-level revenue figures from SAP and posts a formatted financial summary to the finance team's Microsoft Teams channel."
  tags:
    - finance
    - sap
    - microsoft-teams
    - reporting
    - revenue
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: digest-voyage-revenue
          description: "Given a voyage ID, retrieve revenue and cost metrics from SAP S/4HANA and post a financial summary to the finance Teams channel."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "The voyage identifier for the revenue report."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period label (e.g., 'Q1 2026')."
          steps:
            - name: get-revenue
              type: call
              call: sap-finance.get-voyage-revenue
              with:
                voyage_id: "{{voyage_id}}"
            - name: post-summary
              type: call
              call: msteams-finance.send-report
              with:
                channel_id: "finance-ops"
                text: "Voyage Revenue Report | Period: {{fiscal_period}} | Voyage: {{voyage_id}} | Revenue: {{get-revenue.total_revenue}} | Costs: {{get-revenue.total_costs}} | Margin: {{get-revenue.margin_pct}}%"
  consumes:
    - type: http
      namespace: sap-finance
      baseUri: "https://carnival-s4.sap.com/sap/opu/odata/sap/FI_ACDOCA_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: voyage-revenue
          path: "/VoyageRevenueSet"
          inputParameters:
            - name: voyage_id
              in: query
          operations:
            - name: get-voyage-revenue
              method: GET
    - type: http
      namespace: msteams-finance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: finance-messages
          path: "/teams/finance/channels/general/messages"
          operations:
            - name: send-report
              method: POST

Monitors wastewater treatment system readings from Datadog, logs compliance data in ServiceNow, and alerts the environmental officer via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Wastewater Treatment Monitoring Pipeline"
  description: "Monitors wastewater treatment system readings from Datadog, logs compliance data in ServiceNow, and alerts the environmental officer via Microsoft Teams."
  tags:
    - compliance
    - wastewater
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: wastewater-monitoring
      port: 8080
      tools:
        - name: monitor-wastewater-treatment
          description: "Monitor treatment readings and log compliance data."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
          steps:
            - name: get-readings
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:vessel.wastewater.*{vessel:{{vessel_code}}}"
                from: "now-24h"
                to: "now"
            - name: log-compliance
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ccl_wastewater_log"
                short_description: "Wastewater compliance — {{vessel_code}}"
                description: "Readings collected. Status: {{get-readings.compliance_status}}."
            - name: alert-officer
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "environmental_{{vessel_code}}"
                text: "Wastewater treatment update: {{vessel_code}}. Status: {{get-readings.compliance_status}}. Log: {{log-compliance.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Sends voyage-related WhatsApp messages to passengers, pulling booking data from Salesforce and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "WhatsApp Passenger Communication"
  description: "Sends voyage-related WhatsApp messages to passengers, pulling booking data from Salesforce and logging in ServiceNow."
  tags:
    - guest-experience
    - whatsapp
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: passenger-comms
      port: 8080
      tools:
        - name: send-passenger-message
          description: "Given a booking ID and template type, send WhatsApp message."
          inputParameters:
            - name: booking_id
              in: body
              type: string
              description: "The cruise booking ID."
            - name: template_type
              in: body
              type: string
              description: "Template: pre_cruise, embarkation, post_cruise."
          steps:
            - name: get-booking
              type: call
              call: "salesforce.get-booking"
              with:
                booking_id: "{{booking_id}}"
            - name: send-message
              type: call
              call: "whatsapp.send-template"
              with:
                phone_number: "{{get-booking.Guest_Phone__c}}"
                template_name: "carnival_{{template_type}}"
            - name: log-communication
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_passenger_communications"
                fields:
                  booking: "{{booking_id}}"
                  channel: "whatsapp"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://carnival.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: get-booking
              method: GET
    - type: http
      namespace: whatsapp
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{phone_number_id}}/messages"
          operations:
            - name: send-template
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://carnival.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

During annual benefits enrollment, retrieves employees who have not yet completed enrollment in Workday and sends reminder notifications via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Notifier"
  description: "During annual benefits enrollment, retrieves employees who have not yet completed enrollment in Workday and sends reminder notifications via Microsoft Teams."
  tags:
    - hr
    - workday
    - microsoft-teams
    - benefits
    - enrollment
capability:
  exposes:
    - type: mcp
      namespace: benefits-enrollment
      port: 8080
      tools:
        - name: notify-incomplete-enrollment
          description: "Retrieve all employees with incomplete benefits enrollment from Workday and send a personalized reminder via Microsoft Teams. Use during open enrollment periods."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "The benefits enrollment period identifier (e.g., '2026-OPEN-ENROLLMENT')."
            - name: deadline_date
              in: body
              type: string
              description: "The enrollment deadline date in YYYY-MM-DD format."
          steps:
            - name: get-incomplete
              type: call
              call: workday-benefits.get-incomplete-enrollment
              with:
                enrollment_period: "{{enrollment_period}}"
            - name: send-reminders
              type: call
              call: msteams-benefits.send-enrollment-reminder
              with:
                channel_id: "hr-announcements"
                text: "Benefits Enrollment Reminder: {{get-incomplete.count}} employees have not completed enrollment for {{enrollment_period}}. Deadline: {{deadline_date}}. Please complete enrollment in Workday."
  consumes:
    - type: http
      namespace: workday-benefits
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefit-elections
          path: "/benefitElections"
          inputParameters:
            - name: enrollment_period
              in: query
          operations:
            - name: get-incomplete-enrollment
              method: GET
    - type: http
      namespace: msteams-benefits
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: hr-messages
          path: "/teams/hr/channels/announcements/messages"
          operations:
            - name: send-enrollment-reminder
              method: POST

Orchestrates compensation review cycles by pulling data from Workday, refreshing Power BI dashboards, and notifying HR.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Orchestrator"
  description: "Orchestrates compensation review cycles by pulling data from Workday, refreshing Power BI dashboards, and notifying HR."
  tags:
    - hr
    - workday
    - power-bi
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: initiate-comp-review
          description: "Given a cycle ID and department, orchestrate compensation review."
          inputParameters:
            - name: cycle_id
              in: body
              type: string
              description: "The review cycle ID."
            - name: department
              in: body
              type: string
              description: "Department name."
          steps:
            - name: get-employees
              type: call
              call: "workday.get-department-workers"
              with:
                department: "{{department}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "comp-review-{{cycle_id}}"
            - name: create-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "carnival-hr"
                folder_path: "CompReviews/{{cycle_id}}/{{department}}"
            - name: notify-hrbp
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hr-business-partners"
                message: "Comp review {{cycle_id}} for {{department}}. {{get-employees.total_count}} crew in scope."
  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: "/carnival/workers"
          operations:
            - name: get-department-workers
              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
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves crew member certifications from Workday by employee ID, returning certification name, issue date, and expiry date.

naftiko: "0.5"
info:
  label: "Workday Crew Certification Lookup"
  description: "Retrieves crew member certifications from Workday by employee ID, returning certification name, issue date, and expiry date."
  tags:
    - human-resources
    - certifications
    - workday
    - crew-management
capability:
  exposes:
    - type: mcp
      namespace: crew-certifications
      port: 8080
      tools:
        - name: get-crew-certifications
          description: "Look up crew member certifications in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: "workday.get-certifications"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: certifications
              type: array
              mapping: "$.Certifications"
            - name: expiring_count
              type: number
              mapping: "$.ExpiringCount"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/workers/{{employee_id}}/certifications"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-certifications
              method: GET

Retrieves current crew headcount and open position data from Workday for a specified vessel, returning staffing levels by department.

naftiko: "0.5"
info:
  label: "Workday Headcount by Ship Lookup"
  description: "Retrieves current crew headcount and open position data from Workday for a specified vessel, returning staffing levels by department."
  tags:
    - hr
    - workday
    - reporting
    - maritime
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-ship-headcount
          description: "Given a vessel code, retrieve crew headcount and open positions from Workday."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "The vessel identifier code."
          call: "workday.get-headcount"
          with:
            vessel_code: "{{vessel_code}}"
          outputParameters:
            - name: total_crew
              type: string
              mapping: "$.summary.total_active"
            - name: open_positions
              type: string
              mapping: "$.summary.open_reqs"
  consumes:
    - 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: "/carnival/headcount/{{vessel_code}}"
          inputParameters:
            - name: vessel_code
              in: path
          operations:
            - name: get-headcount
              method: GET

Retrieves ship officer rotation schedule from Workday by vessel code, returning officer name, position, embark date, and disembark date.

naftiko: "0.5"
info:
  label: "Workday Officer Schedule Lookup"
  description: "Retrieves ship officer rotation schedule from Workday by vessel code, returning officer name, position, embark date, and disembark date."
  tags:
    - human-resources
    - officer-scheduling
    - workday
    - crew-management
capability:
  exposes:
    - type: mcp
      namespace: officer-scheduling
      port: 8080
      tools:
        - name: get-officer-schedule
          description: "Look up officer rotation schedule from Workday."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "Vessel identifier code."
          call: "workday.get-officer-rotations"
          with:
            vessel_code: "{{vessel_code}}"
          outputParameters:
            - name: officers
              type: array
              mapping: "$.Officers"
            - name: next_rotation_date
              type: string
              mapping: "$.NextRotationDate"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://carnival.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: rotations
          path: "/workers?location={{vessel_code}}&type=officer"
          inputParameters:
            - name: vessel_code
              in: query
          operations:
            - name: get-officer-rotations
              method: GET

Monitors Workday for newly approved headcount positions and creates corresponding Jira epics for digital product delivery planning aligned to the new role's business unit.

naftiko: "0.5"
info:
  label: "Workday Position Approval Sync"
  description: "Monitors Workday for newly approved headcount positions and creates corresponding Jira epics for digital product delivery planning aligned to the new role's business unit."
  tags:
    - hr
    - workday
    - jira
    - headcount-planning
    - workforce
capability:
  exposes:
    - type: mcp
      namespace: position-planning
      port: 8080
      tools:
        - name: sync-approved-position
          description: "Given a Workday position ID that has been approved, retrieve position details and create a Jira epic in the relevant product board to plan for technology enablement needs."
          inputParameters:
            - name: position_id
              in: body
              type: string
              description: "The Workday position ID that has received approval."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key where the planning epic should be created."
          steps:
            - name: get-position
              type: call
              call: workday-position.get-position
              with:
                position_id: "{{position_id}}"
            - name: create-epic
              type: call
              call: jira-position.create-issue
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Epic"
                summary: "Technology Enablement: New {{get-position.job_title}} - {{get-position.department}}"
                description: "Workday Position ID: {{position_id}} | Department: {{get-position.department}} | Start Date: {{get-position.target_start_date}}"
  consumes:
    - type: http
      namespace: workday-position
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: positions
          path: "/positions/{{position_id}}"
          inputParameters:
            - name: position_id
              in: path
          operations:
            - name: get-position
              method: GET
    - type: http
      namespace: jira-position
      baseUri: "https://carnival.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: epics
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves guest support ticket details from Zendesk for cruise passenger inquiries.

naftiko: "0.5"
info:
  label: "Zendesk Guest Support Lookup"
  description: "Retrieves guest support ticket details from Zendesk for cruise passenger inquiries."
  tags:
    - customer-service
    - zendesk
    - guest-experience
capability:
  exposes:
    - type: mcp
      namespace: guest-support
      port: 8080
      tools:
        - name: get-support-ticket
          description: "Given a ticket ID, retrieve details from Zendesk."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ticket.status"
            - name: priority
              type: string
              mapping: "$.ticket.priority"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://carnival.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET

Retrieves a shore excursion support ticket from Zendesk by ticket ID, returning subject, status, and requester details.

naftiko: "0.5"
info:
  label: "Zendesk Shore Excursion Ticket Lookup"
  description: "Retrieves a shore excursion support ticket from Zendesk by ticket ID, returning subject, status, and requester details."
  tags:
    - guest-services
    - shore-excursions
    - zendesk
capability:
  exposes:
    - type: mcp
      namespace: excursion-support
      port: 8080
      tools:
        - name: get-excursion-ticket
          description: "Look up a shore excursion support ticket in Zendesk."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Zendesk ticket ID."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
          outputParameters:
            - name: subject
              type: string
              mapping: "$.ticket.subject"
            - name: status
              type: string
              mapping: "$.ticket.status"
            - name: requester
              type: string
              mapping: "$.ticket.requester.name"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://carnival.zendesk.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.zendesk_user"
        password: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET