Carnival Corporation Capabilities
Naftiko 0.5 capability definitions for Carnival Corporation - 100 capabilities showing integration workflows and service orchestrations.
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