Hapag-Lloyd Capabilities

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

Sort
Expand

Retrieves payroll summary data from ADP for a given pay period, returning total gross, net, and headcount.

naftiko: "0.5"
info:
  label: "ADP Payroll Summary"
  description: "Retrieves payroll summary data from ADP for a given pay period, returning total gross, net, and headcount."
  tags:
    - hr
    - payroll
    - adp
capability:
  exposes:
    - type: mcp
      namespace: hr-payroll
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Get payroll summary from ADP for a pay period."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "The pay period identifier (e.g. 2026-03-15)."
          call: "adp.get-payroll"
          with:
            pay_period: "{{pay_period}}"
          outputParameters:
            - name: total_gross
              type: string
              mapping: "$.payrollSummary.totalGross"
            - name: total_net
              type: string
              mapping: "$.payrollSummary.totalNet"
            - name: employee_count
              type: integer
              mapping: "$.payrollSummary.headcount"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/payroll-outputs?payPeriod={{pay_period}}"
          inputParameters:
            - name: pay_period
              in: query
          operations:
            - name: get-payroll
              method: GET

Manages annual shipping contract renewals by pulling contract data from SAP, generating renewal proposals in SharePoint, notifying account managers via Microsoft Outlook, and tracking in Jira.

naftiko: "0.5"
info:
  label: "Annual Contract Renewal Orchestrator"
  description: "Manages annual shipping contract renewals by pulling contract data from SAP, generating renewal proposals in SharePoint, notifying account managers via Microsoft Outlook, and tracking in Jira."
  tags:
    - sales
    - contracts
    - sap
    - sharepoint
    - microsoft-outlook
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renewal
      port: 8080
      tools:
        - name: process-contract-renewal
          description: "Process annual contract renewal."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP contract ID."
            - name: customer_id
              in: body
              type: string
              description: "The customer account ID."
          steps:
            - name: get-contract
              type: call
              call: "sap.get-contract"
              with:
                contract: "{{contract_id}}"
            - name: generate-proposal
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "sales_site"
                file_path: "Renewals/{{contract_id}}_proposal.pdf"
            - name: notify-account-mgr
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-contract.accountManagerEmail}}"
                subject: "Contract Renewal Due - {{contract_id}}"
                body: "Contract {{contract_id}} for {{get-contract.customerName}} expires {{get-contract.expiryDate}}. Volume: {{get-contract.annualVolume}} TEU. Proposal: {{generate-proposal.url}}"
            - name: create-jira-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SALES"
                summary: "Contract renewal: {{contract_id}} - {{get-contract.customerName}}"
                description: "Expiry: {{get-contract.expiryDate}}. Current volume: {{get-contract.annualVolume}} TEU."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSD_CONTRACT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"

Retrieves the latest build status for a given Azure DevOps pipeline, returning build number, result, and duration.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status"
  description: "Retrieves the latest build status for a given Azure DevOps pipeline, returning build number, result, and duration."
  tags:
    - devops
    - ci-cd
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: cicd-status
      port: 8080
      tools:
        - name: get-build-status
          description: "Get the latest build status for an Azure DevOps pipeline."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The pipeline definition ID."
          call: "azdo.get-builds"
          with:
            project: "{{project_name}}"
            definition_id: "{{pipeline_id}}"
          outputParameters:
            - name: build_number
              type: string
              mapping: "$.value[0].buildNumber"
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: duration
              type: string
              mapping: "$.value[0].finishTime"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/hapag-lloyd"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?definitions={{definition_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: definition_id
              in: query
          operations:
            - name: get-builds
              method: GET

On shipment departure, pulls booking and container data from SAP, generates a bill of lading document in SharePoint, and logs an event in ServiceNow.

naftiko: "0.5"
info:
  label: "Bill of Lading Generator"
  description: "On shipment departure, pulls booking and container data from SAP, generates a bill of lading document in SharePoint, and logs an event in ServiceNow."
  tags:
    - shipping
    - documentation
    - sap
    - sharepoint
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: shipping-docs
      port: 8080
      tools:
        - name: generate-bill-of-lading
          description: "Generate a bill of lading for a shipment, store it, and create a ServiceNow record."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The SAP shipment ID."
          steps:
            - name: get-shipment
              type: call
              call: "sap.get-shipment"
              with:
                shipment_id: "{{shipment_id}}"
            - name: store-bol
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "shipping_docs_site"
                file_path: "BillsOfLading/BOL_{{get-shipment.BookingRef}}.pdf"
            - name: log-event
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_shipping_events"
                short_description: "B/L generated for {{get-shipment.BookingRef}}"
                description: "Bill of lading created for shipment {{shipment_id}}. Document: {{store-bol.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: shipments
          path: "/ShipmentSet('{{shipment_id}}')"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.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

When a blank sailing is announced, identifies affected bookings in SAP, rebooks cargo on alternative vessels, notifies customers via Microsoft Outlook, and updates Salesforce accounts.

naftiko: "0.5"
info:
  label: "Blank Sailing Impact Processor"
  description: "When a blank sailing is announced, identifies affected bookings in SAP, rebooks cargo on alternative vessels, notifies customers via Microsoft Outlook, and updates Salesforce accounts."
  tags:
    - shipping
    - blank-sailing
    - sap
    - microsoft-outlook
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: blank-sailing
      port: 8080
      tools:
        - name: process-blank-sailing
          description: "Process blank sailing impact."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The cancelled vessel."
            - name: voyage_number
              in: body
              type: string
              description: "The cancelled voyage."
          steps:
            - name: get-affected-bookings
              type: call
              call: "sap.get-voyage-bookings"
              with:
                vessel: "{{vessel_id}}"
                voyage: "{{voyage_number}}"
            - name: rebook-cargo
              type: call
              call: "sap.auto-rebook"
              with:
                bookings: "{{get-affected-bookings.bookingList}}"
                cancelled_voyage: "{{voyage_number}}"
            - name: notify-customers
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-affected-bookings.customerEmails}}"
                subject: "Schedule Change - Voyage {{voyage_number}}"
                body: "Due to a schedule adjustment, your cargo has been rebooked. New vessel: {{rebook-cargo.newVessel}}. New ETD: {{rebook-cargo.newETD}}."
            - name: update-salesforce
              type: call
              call: "salesforce.update-accounts"
              with:
                accounts: "{{get-affected-bookings.customerIds}}"
                note: "Blank sailing {{voyage_number}} - cargo rebooked to {{rebook-cargo.newVessel}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_BOOKING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: salesforce
      baseUri: "https://hapag-lloyd.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"

When a new booking is created in SAP, generates a booking confirmation PDF in SharePoint, sends a Microsoft Teams notification to the operations team, and emails the customer via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Booking Confirmation Orchestrator"
  description: "When a new booking is created in SAP, generates a booking confirmation PDF in SharePoint, sends a Microsoft Teams notification to the operations team, and emails the customer via Microsoft Outlook."
  tags:
    - shipping
    - booking
    - sap
    - sharepoint
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: booking-confirmation
      port: 8080
      tools:
        - name: confirm-booking
          description: "Given a SAP booking ID, generate a confirmation document, notify operations, and email the customer."
          inputParameters:
            - name: booking_id
              in: body
              type: string
              description: "The SAP booking reference number."
            - name: customer_email
              in: body
              type: string
              description: "The customer email address for confirmation delivery."
          steps:
            - name: get-booking
              type: call
              call: "sap.get-booking"
              with:
                booking_id: "{{booking_id}}"
            - name: store-confirmation
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "operations_site"
                file_path: "Bookings/{{get-booking.BookingRef}}_confirmation.pdf"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "operations-bookings"
                text: "Booking {{get-booking.BookingRef}} confirmed for {{get-booking.CustomerName}}. Vessel: {{get-booking.VesselName}}, ETD: {{get-booking.DepartureDate}}."
            - name: email-customer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{customer_email}}"
                subject: "Booking Confirmation - {{get-booking.BookingRef}}"
                body: "Your booking {{get-booking.BookingRef}} on vessel {{get-booking.VesselName}} departing {{get-booking.DepartureDate}} has been confirmed. Document: {{store-confirmation.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_BOOKING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bookings
          path: "/BookingSet('{{booking_id}}')"
          inputParameters:
            - name: booking_id
              in: path
          operations:
            - name: get-booking
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_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: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-email
              method: POST

Archives a completed shipment document from SharePoint to Box for long-term retention, tagging it with shipment metadata.

naftiko: "0.5"
info:
  label: "Box Document Archive"
  description: "Archives a completed shipment document from SharePoint to Box for long-term retention, tagging it with shipment metadata."
  tags:
    - document-management
    - archival
    - sharepoint
    - box
capability:
  exposes:
    - type: mcp
      namespace: doc-archival
      port: 8080
      tools:
        - name: archive-to-box
          description: "Move a SharePoint document to Box for long-term archival."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: file_path
              in: body
              type: string
              description: "The file path in SharePoint."
            - name: box_folder_id
              in: body
              type: string
              description: "The target Box folder ID."
          steps:
            - name: get-file
              type: call
              call: "sharepoint.get-file-content"
              with:
                site_id: "{{site_id}}"
                file_path: "{{file_path}}"
            - name: upload-to-box
              type: call
              call: "box.upload-file"
              with:
                folder_id: "{{box_folder_id}}"
                file_name: "{{file_path}}"
                content: "{{get-file.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: box
      baseUri: "https://upload.box.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST

Calculates estimated CO2 emissions for a shipment route using the sustainability platform.

naftiko: "0.5"
info:
  label: "Carbon Emissions Calculator"
  description: "Calculates estimated CO2 emissions for a shipment route using the sustainability platform."
  tags:
    - sustainability
    - emissions
    - shipping
capability:
  exposes:
    - type: mcp
      namespace: sustainability-calc
      port: 8080
      tools:
        - name: calculate-emissions
          description: "Calculate CO2 emissions for a shipping route."
          inputParameters:
            - name: origin_port
              in: body
              type: string
              description: "UN/LOCODE of origin port."
            - name: destination_port
              in: body
              type: string
              description: "UN/LOCODE of destination port."
            - name: container_count
              in: body
              type: integer
              description: "Number of containers."
          call: "sustainability.calc-emissions"
          with:
            origin: "{{origin_port}}"
            destination: "{{destination_port}}"
            containers: "{{container_count}}"
          outputParameters:
            - name: co2_tonnes
              type: number
              mapping: "$.co2Tonnes"
            - name: distance_nm
              type: number
              mapping: "$.distanceNauticalMiles"
  consumes:
    - type: http
      namespace: sustainability
      baseUri: "https://hapag-lloyd-sustainability.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sustainability_token"
      resources:
        - name: emissions
          path: "/emissions/calculate"
          inputParameters:
            - name: origin
              in: query
            - name: destination
              in: query
            - name: containers
              in: query
          operations:
            - name: calc-emissions
              method: GET

Retrieves verified gross mass declaration for a container from SAP by booking reference.

naftiko: "0.5"
info:
  label: "Cargo Weight Declaration Lookup"
  description: "Retrieves verified gross mass declaration for a container from SAP by booking reference."
  tags:
    - shipping
    - vgm
    - sap
capability:
  exposes:
    - type: mcp
      namespace: shipping-vgm
      port: 8080
      tools:
        - name: get-vgm-declaration
          description: "Look up the verified gross mass declaration for a specific booking."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "The booking reference number."
          call: "sap.get-vgm"
          with:
            booking_id: "{{booking_ref}}"
          outputParameters:
            - name: gross_mass
              type: string
              mapping: "$.d.GrossMass"
            - name: unit
              type: string
              mapping: "$.d.Unit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_VGM_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vgm-declarations
          path: "/VGMSet('{{booking_id}}')"
          inputParameters:
            - name: booking_id
              in: path
          operations:
            - name: get-vgm
              method: GET

Pulls alliance partner vessel schedules from SAP, merges with Hapag-Lloyd routes, and updates a shared Google Sheets schedule.

naftiko: "0.5"
info:
  label: "Carrier Alliance Schedule Sync"
  description: "Pulls alliance partner vessel schedules from SAP, merges with Hapag-Lloyd routes, and updates a shared Google Sheets schedule."
  tags:
    - logistics
    - alliance
    - sap
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: alliance-schedules
      port: 8080
      tools:
        - name: sync-alliance-schedule
          description: "Merge alliance partner schedules with Hapag-Lloyd data and update Google Sheets."
          inputParameters:
            - name: trade_lane
              in: body
              type: string
              description: "The trade lane to sync."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The target Google Sheets ID."
          steps:
            - name: get-hl-schedule
              type: call
              call: "sap.get-hl-schedules"
              with:
                trade_lane: "{{trade_lane}}"
            - name: get-partner-schedule
              type: call
              call: "sap.get-partner-schedules"
              with:
                trade_lane: "{{trade_lane}}"
            - name: update-sheet
              type: call
              call: "gsheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "Alliance!A1"
                values:
                  - - "Trade Lane"
                    - "HL Sailings"
                    - "Partner Sailings"
                    - "Total Capacity"
                  - - "{{trade_lane}}"
                    - "{{get-hl-schedule.sailing_count}}"
                    - "{{get-partner-schedule.sailing_count}}"
                    - "{{get-hl-schedule.total_teu}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SCHEDULE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: hl-schedules
          path: "/HLScheduleSet?$filter=TradeLane eq '{{trade_lane}}'"
          inputParameters:
            - name: trade_lane
              in: query
          operations:
            - name: get-hl-schedules
              method: GET
        - name: partner-schedules
          path: "/PartnerScheduleSet?$filter=TradeLane eq '{{trade_lane}}'"
          inputParameters:
            - name: trade_lane
              in: query
          operations:
            - name: get-partner-schedules
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT

Processes charter party agreements by extracting terms, creating entries in SAP, generating contract documents in SharePoint, and notifying the legal team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Charter Party Agreement Processor"
  description: "Processes charter party agreements by extracting terms, creating entries in SAP, generating contract documents in SharePoint, and notifying the legal team via Microsoft Teams."
  tags:
    - shipping
    - charter
    - legal
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: charter-processing
      port: 8080
      tools:
        - name: process-charter-agreement
          description: "Process a charter party agreement."
          inputParameters:
            - name: charter_id
              in: body
              type: string
              description: "The charter agreement reference."
            - name: vessel_name
              in: body
              type: string
              description: "The vessel name."
          steps:
            - name: extract-terms
              type: call
              call: "sap.get-charter-terms"
              with:
                charter: "{{charter_id}}"
            - name: create-sap-entry
              type: call
              call: "sap.create-charter-record"
              with:
                charter: "{{charter_id}}"
                vessel: "{{vessel_name}}"
                terms: "{{extract-terms.summary}}"
            - name: generate-contract
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "legal_site"
                file_path: "Charters/{{charter_id}}_agreement.pdf"
            - name: notify-legal
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "legal-shipping"
                text: "Charter {{charter_id}} for vessel {{vessel_name}} processed. Terms: {{extract-terms.duration}} days at {{extract-terms.dailyRate}}/day. Contract: {{generate-contract.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CHARTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Checks Cloudflare DNS health for Hapag-Lloyd web properties and returns zone status, SSL certificate expiry, and recent threat count.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Health Monitor"
  description: "Checks Cloudflare DNS health for Hapag-Lloyd web properties and returns zone status, SSL certificate expiry, and recent threat count."
  tags:
    - security
    - dns
    - cloudflare
capability:
  exposes:
    - type: mcp
      namespace: dns-health
      port: 8080
      tools:
        - name: check-dns-health
          description: "Check DNS and security health for a Cloudflare zone."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone ID."
          call: "cloudflare.get-zone"
          with:
            zone_id: "{{zone_id}}"
          outputParameters:
            - name: zone_status
              type: string
              mapping: "$.result.status"
            - name: ssl_status
              type: string
              mapping: "$.result.ssl.status"
            - name: threat_count
              type: integer
              mapping: "$.result.meta.threat_score"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: zones
          path: "/zones/{{zone_id}}"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: get-zone
              method: GET

Creates or updates a Confluence page with shipping operational content, used for knowledge base articles and SOPs.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Publisher"
  description: "Creates or updates a Confluence page with shipping operational content, used for knowledge base articles and SOPs."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: publish-kb-article
          description: "Create or update a Confluence knowledge base page."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "The Confluence space key."
            - name: title
              in: body
              type: string
              description: "The page title."
            - name: content
              in: body
              type: string
              description: "The page content in Confluence storage format."
          call: "confluence.create-page"
          with:
            space_key: "{{space_key}}"
            title: "{{title}}"
            body: "{{content}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://hapag-lloyd.atlassian.net/wiki/api/v2"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/pages"
          operations:
            - name: create-page
              method: POST

When a container damage claim is filed, retrieves container history from SAP, creates a Salesforce case, opens a ServiceNow insurance claim, and notifies the claims team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Container Damage Claim Processor"
  description: "When a container damage claim is filed, retrieves container history from SAP, creates a Salesforce case, opens a ServiceNow insurance claim, and notifies the claims team in Microsoft Teams."
  tags:
    - claims
    - container
    - sap
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: damage-claims
      port: 8080
      tools:
        - name: process-damage-claim
          description: "Process a container damage claim across SAP, Salesforce, ServiceNow, and Teams."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The damaged container number."
            - name: damage_description
              in: body
              type: string
              description: "Description of the damage."
            - name: customer_account_id
              in: body
              type: string
              description: "The Salesforce customer account ID."
          steps:
            - name: get-container-history
              type: call
              call: "sap.get-container-history"
              with:
                container_id: "{{container_number}}"
            - name: create-sf-case
              type: call
              call: "salesforce.create-case"
              with:
                account_id: "{{customer_account_id}}"
                subject: "Container damage: {{container_number}}"
                description: "{{damage_description}}. Last vessel: {{get-container-history.last_vessel}}. Last port: {{get-container-history.last_port}}."
            - name: open-insurance-claim
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_insurance_claims"
                short_description: "Insurance claim: container {{container_number}}"
                description: "Damage: {{damage_description}}. SF Case: {{create-sf-case.id}}. Container age: {{get-container-history.age_years}} years."
            - name: notify-claims
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "claims-team"
                text: "New damage claim for container {{container_number}}. SF Case: {{create-sf-case.CaseNumber}}. ServiceNow: {{open-insurance-claim.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CONTAINER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: container-history
          path: "/ContainerHistorySet('{{container_id}}')"
          inputParameters:
            - name: container_id
              in: path
          operations:
            - name: get-container-history
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://hapag-lloyd.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.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.msgraph_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 container fleet data from SAP, calculates utilization metrics, and pushes a summary dashboard to Power BI.

naftiko: "0.5"
info:
  label: "Container Fleet Utilization Report"
  description: "Pulls container fleet data from SAP, calculates utilization metrics, and pushes a summary dashboard to Power BI."
  tags:
    - logistics
    - fleet
    - sap
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: fleet-utilization
      port: 8080
      tools:
        - name: sync-fleet-utilization
          description: "Pull SAP fleet data and push utilization metrics to Power BI."
          inputParameters:
            - name: region_code
              in: body
              type: string
              description: "The regional fleet code (e.g. APAC, EMEA, AMER)."
          steps:
            - name: get-fleet
              type: call
              call: "sap.get-fleet-data"
              with:
                region: "{{region_code}}"
            - name: push-metrics
              type: call
              call: "powerbi.push-rows"
              with:
                dataset_id: "fleet_utilization_ds"
                table_name: "Utilization"
                rows:
                  - region: "{{region_code}}"
                    total_containers: "{{get-fleet.total_count}}"
                    in_use: "{{get-fleet.in_use_count}}"
                    utilization_pct: "{{get-fleet.utilization_pct}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_FLEET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fleet
          path: "/FleetDataSet(Region='{{region}}')"
          inputParameters:
            - name: region
              in: path
          operations:
            - name: get-fleet-data
              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}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

Manages container pre-trip inspections by creating inspection tasks in ServiceNow, recording results in SAP, uploading photos to Box, and notifying the equipment team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Container Inspection Workflow"
  description: "Manages container pre-trip inspections by creating inspection tasks in ServiceNow, recording results in SAP, uploading photos to Box, and notifying the equipment team via Microsoft Teams."
  tags:
    - equipment
    - inspection
    - servicenow
    - sap
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: container-inspection
      port: 8080
      tools:
        - name: process-inspection
          description: "Process container inspection workflow."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number."
            - name: inspection_type
              in: body
              type: string
              description: "Type of inspection."
          steps:
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Inspect container {{container_number}}"
                description: "{{inspection_type}} inspection required for container {{container_number}}."
            - name: record-results
              type: call
              call: "sap.record-inspection"
              with:
                container: "{{container_number}}"
                type: "{{inspection_type}}"
                task_ref: "{{create-task.taskNumber}}"
            - name: upload-photos
              type: call
              call: "box.upload-file"
              with:
                folder_id: "container_inspections"
                filename: "{{container_number}}_{{inspection_type}}.zip"
            - name: notify-equipment
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "equipment-team"
                text: "Inspection completed for {{container_number}} ({{inspection_type}}). Task: {{create-task.taskNumber}}. Photos: {{upload-photos.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now/table/sc_task"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_EQUIP_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Manages leased container returns by checking condition in SAP, calculating repair costs, notifying the lessor via Microsoft Outlook, and updating the fleet dashboard in Google Sheets.

naftiko: "0.5"
info:
  label: "Container Leasing Return Orchestrator"
  description: "Manages leased container returns by checking condition in SAP, calculating repair costs, notifying the lessor via Microsoft Outlook, and updating the fleet dashboard in Google Sheets."
  tags:
    - equipment
    - leasing
    - sap
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: leasing-return
      port: 8080
      tools:
        - name: process-lease-return
          description: "Process leased container return."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number."
            - name: lessor_id
              in: body
              type: string
              description: "The leasing company ID."
          steps:
            - name: check-condition
              type: call
              call: "sap.inspect-container"
              with:
                container: "{{container_number}}"
            - name: calculate-costs
              type: call
              call: "sap.calculate-repair"
              with:
                container: "{{container_number}}"
                damages: "{{check-condition.damages}}"
            - name: notify-lessor
              type: call
              call: "outlook.send-email"
              with:
                to: "{{check-condition.lessorEmail}}"
                subject: "Container Return - {{container_number}}"
                body: "Container {{container_number}} returned. Condition: {{check-condition.grade}}. Repair estimate: {{calculate-costs.totalCost}} {{calculate-costs.currency}}."
            - name: update-fleet-dashboard
              type: call
              call: "gsheets.update-range"
              with:
                spreadsheet_id: "fleet_dashboard"
                range: "Leases!A2"
                values: "{{container_number}},returned,{{check-condition.grade}},{{calculate-costs.totalCost}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_EQUIP_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_token"

Processes container release by verifying payment in SAP, generating release order, notifying the terminal via the port system, and updating the customer through Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Container Release Orchestrator"
  description: "Processes container release by verifying payment in SAP, generating release order, notifying the terminal via the port system, and updating the customer through Microsoft Outlook."
  tags:
    - shipping
    - container
    - release
    - sap
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: container-release
      port: 8080
      tools:
        - name: release-container
          description: "Process a container release request."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number."
            - name: customer_id
              in: body
              type: string
              description: "The customer account ID."
          steps:
            - name: verify-payment
              type: call
              call: "sap.check-payment"
              with:
                container: "{{container_number}}"
                customer: "{{customer_id}}"
            - name: generate-release
              type: call
              call: "sap.create-release-order"
              with:
                container: "{{container_number}}"
                payment_ref: "{{verify-payment.paymentRef}}"
            - name: notify-terminal
              type: call
              call: "portapi.send-release"
              with:
                container: "{{container_number}}"
                release_id: "{{generate-release.releaseId}}"
            - name: email-customer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{verify-payment.customerEmail}}"
                subject: "Container Release - {{container_number}}"
                body: "Container {{container_number}} has been released. Release ID: {{generate-release.releaseId}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_RELEASE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: portapi
      baseUri: "https://hapag-lloyd-port.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.port_api_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Looks up real-time container tracking status from SAP by container number and returns vessel name, current port, ETA, and shipment status.

naftiko: "0.5"
info:
  label: "Container Shipment Tracking"
  description: "Looks up real-time container tracking status from SAP by container number and returns vessel name, current port, ETA, and shipment status."
  tags:
    - shipping
    - tracking
    - sap
    - container
capability:
  exposes:
    - type: mcp
      namespace: shipping-tracking
      port: 8080
      tools:
        - name: get-container-status
          description: "Look up a container by number and return its current location, vessel, ETA, and status."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The ISO 6346 container number."
          call: "sap.get-container"
          with:
            container_id: "{{container_number}}"
          outputParameters:
            - name: vessel_name
              type: string
              mapping: "$.d.VesselName"
            - name: current_port
              type: string
              mapping: "$.d.CurrentPort"
            - name: eta
              type: string
              mapping: "$.d.EstimatedArrival"
            - name: status
              type: string
              mapping: "$.d.ShipmentStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CONTAINER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: containers
          path: "/ContainerSet('{{container_id}}')"
          inputParameters:
            - name: container_id
              in: path
          operations:
            - name: get-container
              method: GET

Checks available container types at a given depot location from the equipment system.

naftiko: "0.5"
info:
  label: "Container Type Availability Check"
  description: "Checks available container types at a given depot location from the equipment system."
  tags:
    - shipping
    - equipment
    - container
capability:
  exposes:
    - type: mcp
      namespace: shipping-equipment
      port: 8080
      tools:
        - name: check-container-availability
          description: "Check available container types at a specific depot."
          inputParameters:
            - name: depot_code
              in: body
              type: string
              description: "The depot location code."
          call: "equipment.get-availability"
          with:
            depot: "{{depot_code}}"
          outputParameters:
            - name: available_units
              type: array
              mapping: "$.units"
            - name: depot_name
              type: string
              mapping: "$.depotName"
  consumes:
    - type: http
      namespace: equipment
      baseUri: "https://hapag-lloyd-equip.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.equipment_token"
      resources:
        - name: depot-availability
          path: "/depots/{{depot}}/availability"
          inputParameters:
            - name: depot
              in: path
          operations:
            - name: get-availability
              method: GET

Looks up crew certification expiry dates from the maritime HR system.

naftiko: "0.5"
info:
  label: "Crew Certification Expiry Checker"
  description: "Looks up crew certification expiry dates from the maritime HR system."
  tags:
    - maritime
    - crew
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: crew-mgmt
      port: 8080
      tools:
        - name: get-cert-expiry
          description: "Check crew certification expiry dates for a vessel."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
          call: "crew.get-certs"
          with:
            vessel: "{{vessel_id}}"
          outputParameters:
            - name: expiring_soon
              type: array
              mapping: "$.expiringSoon"
            - name: total_crew
              type: integer
              mapping: "$.totalCrew"
  consumes:
    - type: http
      namespace: crew
      baseUri: "https://hapag-lloyd-crew.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.crew_mgmt_token"
      resources:
        - name: vessel-certifications
          path: "/vessels/{{vessel}}/certifications"
          inputParameters:
            - name: vessel
              in: path
          operations:
            - name: get-certs
              method: GET

When a customer complaint arrives via Zendesk, retrieves shipment details from SAP, opens a ServiceNow investigation case, and notifies the account manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Complaint Handler"
  description: "When a customer complaint arrives via Zendesk, retrieves shipment details from SAP, opens a ServiceNow investigation case, and notifies the account manager in Microsoft Teams."
  tags:
    - customer-service
    - zendesk
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: complaint-handling
      port: 8080
      tools:
        - name: handle-complaint
          description: "Process a Zendesk complaint by pulling shipment data, creating a ServiceNow case, and notifying the account manager."
          inputParameters:
            - name: zendesk_ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
            - name: shipment_ref
              in: body
              type: string
              description: "The related SAP shipment reference."
          steps:
            - name: get-ticket
              type: call
              call: "zendesk.get-ticket"
              with:
                ticket_id: "{{zendesk_ticket_id}}"
            - name: get-shipment
              type: call
              call: "sap.get-shipment"
              with:
                shipment_ref: "{{shipment_ref}}"
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Complaint: {{get-ticket.subject}}"
                category: "shipping_complaint"
                description: "Zendesk #{{zendesk_ticket_id}}: {{get-ticket.description}}. Shipment {{shipment_ref}}, Vessel: {{get-shipment.VesselName}}, Status: {{get-shipment.Status}}."
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-shipment.AccountManagerEmail}}"
                text: "Complaint received for shipment {{shipment_ref}}. ServiceNow case: {{create-case.number}}. Zendesk ticket: {{zendesk_ticket_id}}."
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://hapag-lloyd.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
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: shipments
          path: "/ShipmentSet('{{shipment_ref}}')"
          inputParameters:
            - name: shipment_ref
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Reviews customer credit limits by pulling financial data from SAP, checking payment history, generating a risk report in Google Sheets, and notifying the credit team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Credit Review Pipeline"
  description: "Reviews customer credit limits by pulling financial data from SAP, checking payment history, generating a risk report in Google Sheets, and notifying the credit team via Microsoft Teams."
  tags:
    - finance
    - credit
    - sap
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: credit-review
      port: 8080
      tools:
        - name: review-customer-credit
          description: "Process customer credit limit review."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The SAP customer account ID."
          steps:
            - name: get-financials
              type: call
              call: "sap.get-customer-financials"
              with:
                customer: "{{customer_id}}"
            - name: get-payment-history
              type: call
              call: "sap.get-payment-history"
              with:
                customer: "{{customer_id}}"
            - name: update-risk-report
              type: call
              call: "gsheets.update-range"
              with:
                spreadsheet_id: "credit_dashboard"
                range: "Reviews!A2"
                values: "{{customer_id}},{{get-financials.creditLimit}},{{get-payment-history.avgDaysToPay}},{{get-financials.outstandingBalance}}"
            - name: notify-credit-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "credit-management"
                text: "Credit review for {{customer_id}}: Limit {{get-financials.creditLimit}}, Outstanding {{get-financials.outstandingBalance}}, Avg days to pay: {{get-payment-history.avgDaysToPay}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZFI_CREDIT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Supports customer rate negotiations by pulling historical volume data from SAP, benchmarking against market rates, generating a rate proposal in SharePoint, and notifying the commercial team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Rate Negotiation Workflow"
  description: "Supports customer rate negotiations by pulling historical volume data from SAP, benchmarking against market rates, generating a rate proposal in SharePoint, and notifying the commercial team via Microsoft Teams."
  tags:
    - commercial
    - pricing
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rate-negotiation
      port: 8080
      tools:
        - name: prepare-rate-negotiation
          description: "Prepare materials for customer rate negotiation."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The customer account ID."
            - name: trade_lane
              in: body
              type: string
              description: "The trade lane code."
          steps:
            - name: get-volume-history
              type: call
              call: "sap.get-customer-volumes"
              with:
                customer: "{{customer_id}}"
                lane: "{{trade_lane}}"
            - name: benchmark-rates
              type: call
              call: "pricing.get-market-benchmark"
              with:
                lane: "{{trade_lane}}"
                volume: "{{get-volume-history.annualTEU}}"
            - name: generate-proposal
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "commercial_site"
                file_path: "Proposals/{{customer_id}}_{{trade_lane}}_rate_proposal.pdf"
            - name: notify-commercial
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "commercial-rates"
                text: "Rate proposal for {{customer_id}} on {{trade_lane}}: Historical volume {{get-volume-history.annualTEU}} TEU. Market benchmark: {{benchmark-rates.marketRate}}. Proposal: {{generate-proposal.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSD_VOLUME_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: pricing
      baseUri: "https://hapag-lloyd-pricing.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pricing_token"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Manages customs clearance by preparing documentation in SAP, submitting declarations to customs authorities, storing clearance certificates in SharePoint, and notifying the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customs Clearance Orchestrator"
  description: "Manages customs clearance by preparing documentation in SAP, submitting declarations to customs authorities, storing clearance certificates in SharePoint, and notifying the logistics team via Microsoft Teams."
  tags:
    - customs
    - compliance
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customs-clearance
      port: 8080
      tools:
        - name: process-customs-clearance
          description: "Process customs clearance for a shipment."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The shipment reference."
            - name: destination_country
              in: body
              type: string
              description: "The destination country code."
          steps:
            - name: prepare-docs
              type: call
              call: "sap.prepare-customs-docs"
              with:
                shipment: "{{shipment_id}}"
                country: "{{destination_country}}"
            - name: submit-declaration
              type: call
              call: "customs.submit-declaration"
              with:
                shipment: "{{shipment_id}}"
                docs: "{{prepare-docs.documentPack}}"
                country: "{{destination_country}}"
            - name: store-certificate
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "customs_site"
                file_path: "Clearances/{{shipment_id}}_clearance.pdf"
            - name: notify-logistics
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "logistics-customs"
                text: "Customs clearance for {{shipment_id}} to {{destination_country}}: {{submit-declaration.status}}. Reference: {{submit-declaration.clearanceRef}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CUSTOMS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: customs
      baseUri: "https://hapag-lloyd-customs.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.customs_token"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Pulls shipment and cargo data from SAP, generates customs pre-clearance documents in SharePoint, and files a ServiceNow task for the customs broker team.

naftiko: "0.5"
info:
  label: "Customs Documentation Preparer"
  description: "Pulls shipment and cargo data from SAP, generates customs pre-clearance documents in SharePoint, and files a ServiceNow task for the customs broker team."
  tags:
    - customs
    - compliance
    - sap
    - sharepoint
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: customs-docs
      port: 8080
      tools:
        - name: prepare-customs-docs
          description: "Prepare customs documentation for a shipment and assign to the broker team."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The SAP shipment ID."
            - name: destination_country
              in: body
              type: string
              description: "The ISO country code for customs destination."
          steps:
            - name: get-cargo
              type: call
              call: "sap.get-cargo-manifest"
              with:
                shipment_id: "{{shipment_id}}"
            - name: store-docs
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "customs_site"
                file_path: "PreClearance/{{shipment_id}}_{{destination_country}}.pdf"
            - name: create-task
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_customs_tasks"
                short_description: "Customs clearance for shipment {{shipment_id}} to {{destination_country}}"
                assigned_group: "Customs_Broker_Team"
                description: "Cargo manifest items: {{get-cargo.item_count}}. Pre-clearance docs: {{store-docs.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CARGO_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cargo
          path: "/CargoManifestSet('{{shipment_id}}')"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-cargo-manifest
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.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

Retrieves dangerous goods data from SAP for a shipment, generates a DG declaration document in SharePoint, and opens a compliance review in ServiceNow.

naftiko: "0.5"
info:
  label: "Dangerous Goods Declaration Processor"
  description: "Retrieves dangerous goods data from SAP for a shipment, generates a DG declaration document in SharePoint, and opens a compliance review in ServiceNow."
  tags:
    - compliance
    - dangerous-goods
    - sap
    - sharepoint
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: dg-compliance
      port: 8080
      tools:
        - name: process-dg-declaration
          description: "Generate a dangerous goods declaration and open a compliance review."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The SAP shipment ID containing dangerous goods."
          steps:
            - name: get-dg-data
              type: call
              call: "sap.get-dg-details"
              with:
                shipment_id: "{{shipment_id}}"
            - name: store-declaration
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "compliance_site"
                file_path: "DGDeclarations/DG_{{shipment_id}}.pdf"
            - name: open-review
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_compliance_reviews"
                short_description: "DG compliance review: shipment {{shipment_id}}"
                description: "UN classes: {{get-dg-data.un_classes}}. Total DG containers: {{get-dg-data.dg_count}}. Declaration: {{store-declaration.url}}"
                assigned_group: "DG_Compliance_Team"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_DG_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: dg-details
          path: "/DGDetailsSet('{{shipment_id}}')"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-dg-details
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.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

Retrieves infrastructure health metrics from Datadog for a given service and returns CPU, memory, and error rate.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Retrieves infrastructure health metrics from Datadog for a given service and returns CPU, memory, and error rate."
  tags:
    - it-operations
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-service-health
          description: "Get infrastructure health metrics for a service from Datadog."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
          call: "datadog.get-metrics"
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: cpu_usage
              type: string
              mapping: "$.series[0].pointlist[-1][1]"
            - name: memory_usage
              type: string
              mapping: "$.series[1].pointlist[-1][1]"
            - name: error_rate
              type: string
              mapping: "$.series[2].pointlist[-1][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        headerName: "DD-API-KEY"
      resources:
        - name: metrics
          path: "/query?query=avg:system.cpu.user{service:{{service}}}"
          inputParameters:
            - name: service
              in: path
          operations:
            - name: get-metrics
              method: GET

When a container exceeds free time at port, retrieves detention data from SAP, creates a Jira ticket for the logistics team, and sends an alert to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Demurrage and Detention Alert"
  description: "When a container exceeds free time at port, retrieves detention data from SAP, creates a Jira ticket for the logistics team, and sends an alert to Microsoft Teams."
  tags:
    - logistics
    - demurrage
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: demurrage-alerts
      port: 8080
      tools:
        - name: alert-demurrage
          description: "Check container demurrage status, create a Jira ticket, and alert the logistics team."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number to check for demurrage."
          steps:
            - name: get-detention
              type: call
              call: "sap.get-detention"
              with:
                container_id: "{{container_number}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "LOG"
                summary: "Demurrage alert: {{container_number}} - {{get-detention.days_over}} days over free time"
                issue_type: "Task"
                description: "Container {{container_number}} at {{get-detention.port_name}} has exceeded free time by {{get-detention.days_over}} days. Estimated charges: {{get-detention.estimated_cost}} {{get-detention.currency}}."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "logistics-alerts"
                text: "Demurrage Alert: Container {{container_number}} is {{get-detention.days_over}} days over free time at {{get-detention.port_name}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_DETENTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: detention
          path: "/DetentionSet('{{container_id}}')"
          inputParameters:
            - name: container_id
              in: path
          operations:
            - name: get-detention
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.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.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Synchronizes vessel digital twin data by pulling sensor readings from the IoT platform, updating the vessel model in SAP, refreshing the Datadog monitoring dashboard, and notifying engineering via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Digital Twin Vessel Sync"
  description: "Synchronizes vessel digital twin data by pulling sensor readings from the IoT platform, updating the vessel model in SAP, refreshing the Datadog monitoring dashboard, and notifying engineering via Microsoft Teams."
  tags:
    - fleet
    - digital-twin
    - iot
    - sap
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: digital-twin-sync
      port: 8080
      tools:
        - name: sync-vessel-twin
          description: "Synchronize vessel digital twin data."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
          steps:
            - name: get-sensor-data
              type: call
              call: "iot.get-vessel-sensors"
              with:
                vessel: "{{vessel_id}}"
            - name: update-model
              type: call
              call: "sap.update-vessel-twin"
              with:
                vessel: "{{vessel_id}}"
                sensors: "{{get-sensor-data.readings}}"
            - name: refresh-dashboard
              type: call
              call: "datadog.post-metrics"
              with:
                series: "vessel.{{vessel_id}}"
                points: "{{get-sensor-data.metrics}}"
            - name: notify-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-digital"
                text: "Digital twin updated for {{vessel_id}}. Engine hours: {{get-sensor-data.engineHours}}. Fuel efficiency: {{get-sensor-data.fuelEfficiency}}%."
  consumes:
    - type: http
      namespace: iot
      baseUri: "https://hapag-lloyd-iot.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_token"
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_TWIN_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves application performance metrics from Dynatrace for a specified service, returning response time, error rate, and throughput.

naftiko: "0.5"
info:
  label: "Dynatrace Application Performance Check"
  description: "Retrieves application performance metrics from Dynatrace for a specified service, returning response time, error rate, and throughput."
  tags:
    - it-operations
    - apm
    - dynatrace
capability:
  exposes:
    - type: mcp
      namespace: apm-monitoring
      port: 8080
      tools:
        - name: get-app-performance
          description: "Get application performance metrics from Dynatrace for a service."
          inputParameters:
            - name: service_id
              in: body
              type: string
              description: "The Dynatrace service entity ID."
          call: "dynatrace.get-metrics"
          with:
            entity_id: "{{service_id}}"
          outputParameters:
            - name: response_time_ms
              type: number
              mapping: "$.result[0].data[0].values[0]"
            - name: error_rate_pct
              type: number
              mapping: "$.result[1].data[0].values[0]"
            - name: throughput
              type: number
              mapping: "$.result[2].data[0].values[0]"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://hapag-lloyd.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query?metricSelector=builtin:service.response.time&entitySelector=entityId({{entity_id}})"
          inputParameters:
            - name: entity_id
              in: path
          operations:
            - name: get-metrics
              method: GET

Integrates e-commerce platform orders with shipping bookings by syncing orders from the platform, creating bookings in SAP, generating shipping labels, and notifying sellers via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "E-Commerce Shipment Integration Pipeline"
  description: "Integrates e-commerce platform orders with shipping bookings by syncing orders from the platform, creating bookings in SAP, generating shipping labels, and notifying sellers via Microsoft Outlook."
  tags:
    - e-commerce
    - shipping
    - integration
    - sap
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-integration
      port: 8080
      tools:
        - name: sync-ecommerce-shipments
          description: "Integrate e-commerce orders with shipping."
          inputParameters:
            - name: platform_id
              in: body
              type: string
              description: "The e-commerce platform ID."
            - name: order_batch
              in: body
              type: string
              description: "The order batch reference."
          steps:
            - name: fetch-orders
              type: call
              call: "ecommerce.get-orders"
              with:
                platform: "{{platform_id}}"
                batch: "{{order_batch}}"
            - name: create-bookings
              type: call
              call: "sap.batch-create-bookings"
              with:
                orders: "{{fetch-orders.orderList}}"
            - name: generate-labels
              type: call
              call: "sap.generate-shipping-labels"
              with:
                bookings: "{{create-bookings.bookingList}}"
            - name: notify-sellers
              type: call
              call: "outlook.send-email"
              with:
                to: "{{fetch-orders.sellerEmails}}"
                subject: "Shipment Bookings Created - Batch {{order_batch}}"
                body: "{{create-bookings.count}} bookings created for batch {{order_batch}}. Tracking numbers will follow."
  consumes:
    - type: http
      namespace: ecommerce
      baseUri: "https://hapag-lloyd-ecommerce.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ecommerce_token"
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_BOOKING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Receives an EDI booking message, parses it via Oracle Integration, creates a booking in SAP, and sends a confirmation via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "EDI Message Processor"
  description: "Receives an EDI booking message, parses it via Oracle Integration, creates a booking in SAP, and sends a confirmation via Microsoft Outlook."
  tags:
    - edi
    - integration
    - oracle-integration
    - sap
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: edi-processing
      port: 8080
      tools:
        - name: process-edi-booking
          description: "Parse an EDI booking message, create a SAP booking, and confirm to the sender."
          inputParameters:
            - name: edi_message_id
              in: body
              type: string
              description: "The EDI message identifier."
            - name: sender_email
              in: body
              type: string
              description: "The sender email for confirmation."
          steps:
            - name: parse-edi
              type: call
              call: "oic.parse-edi"
              with:
                message_id: "{{edi_message_id}}"
            - name: create-booking
              type: call
              call: "sap.create-booking"
              with:
                origin: "{{parse-edi.origin_port}}"
                destination: "{{parse-edi.destination_port}}"
                container_type: "{{parse-edi.container_type}}"
                quantity: "{{parse-edi.quantity}}"
            - name: send-confirmation
              type: call
              call: "outlook.send-email"
              with:
                to: "{{sender_email}}"
                subject: "EDI Booking Confirmation: {{create-booking.booking_ref}}"
                body: "Your EDI booking has been processed. Reference: {{create-booking.booking_ref}}. Origin: {{parse-edi.origin_port}}. Destination: {{parse-edi.destination_port}}."
  consumes:
    - type: http
      namespace: oic
      baseUri: "https://hapag-lloyd-oic.integration.ocp.oraclecloud.com/ic/api/integration/v1"
      authentication:
        type: basic
        username: "$secrets.oic_user"
        password: "$secrets.oic_password"
      resources:
        - name: edi-flows
          path: "/flows/rest/PARSE_EDI/1.0/messages/{{message_id}}"
          inputParameters:
            - name: message_id
              in: path
          operations:
            - name: parse-edi
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_BOOKING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bookings
          path: "/BookingSet"
          operations:
            - name: create-booking
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-email
              method: POST

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

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Orchestrate onboarding for a new Hapag-Lloyd employee across Workday, ServiceNow, SharePoint, and Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Hapag-Lloyd, {{get-employee.first_name}}! Your onboarding ticket: {{open-ticket.number}}. Documents: {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks the repositioning status of empty containers between depots.

naftiko: "0.5"
info:
  label: "Empty Container Repositioning Status"
  description: "Checks the repositioning status of empty containers between depots."
  tags:
    - shipping
    - equipment
    - repositioning
capability:
  exposes:
    - type: mcp
      namespace: equipment-reposition
      port: 8080
      tools:
        - name: get-reposition-status
          description: "Look up the repositioning status for empty containers."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number to track."
          call: "equipment.get-reposition"
          with:
            container_id: "{{container_number}}"
          outputParameters:
            - name: origin_depot
              type: string
              mapping: "$.originDepot"
            - name: destination_depot
              type: string
              mapping: "$.destinationDepot"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: equipment
      baseUri: "https://hapag-lloyd-equip.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.equipment_token"
      resources:
        - name: container-reposition
          path: "/containers/{{container_id}}/reposition"
          inputParameters:
            - name: container_id
              in: path
          operations:
            - name: get-reposition
              method: GET

Generates environmental compliance reports by collecting emissions data from SAP, calculating EU ETS obligations, filing reports via SharePoint, and notifying the sustainability team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Environmental Compliance Reporting Pipeline"
  description: "Generates environmental compliance reports by collecting emissions data from SAP, calculating EU ETS obligations, filing reports via SharePoint, and notifying the sustainability team via Microsoft Teams."
  tags:
    - sustainability
    - compliance
    - emissions
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: env-compliance
      port: 8080
      tools:
        - name: generate-env-compliance-report
          description: "Generate environmental compliance report."
          inputParameters:
            - name: reporting_period
              in: body
              type: string
              description: "The reporting period (e.g., 2026-Q1)."
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
          steps:
            - name: collect-emissions
              type: call
              call: "sap.get-vessel-emissions"
              with:
                vessel: "{{vessel_id}}"
                period: "{{reporting_period}}"
            - name: calculate-ets
              type: call
              call: "sustainability.calculate-ets-obligation"
              with:
                emissions: "{{collect-emissions.co2Total}}"
                voyages: "{{collect-emissions.euVoyages}}"
            - name: file-report
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "sustainability_site"
                file_path: "ETS/{{vessel_id}}_{{reporting_period}}_report.pdf"
            - name: notify-sustainability
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sustainability-team"
                text: "Environmental report for {{vessel_id}} ({{reporting_period}}): CO2 {{collect-emissions.co2Total}} tonnes. EU ETS obligation: {{calculate-ets.allowancesRequired}} allowances. Report: {{file-report.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_EMISSIONS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: sustainability
      baseUri: "https://hapag-lloyd-sustainability.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sustainability_token"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Coordinates feeder vessel connections by matching mainline schedules in SAP, notifying terminal operators, and updating the Confluence operations handbook.

naftiko: "0.5"
info:
  label: "Feeder Vessel Coordination Pipeline"
  description: "Coordinates feeder vessel connections by matching mainline schedules in SAP, notifying terminal operators, and updating the Confluence operations handbook."
  tags:
    - shipping
    - feeder
    - logistics
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: feeder-coordination
      port: 8080
      tools:
        - name: coordinate-feeder
          description: "Coordinate feeder vessel connections."
          inputParameters:
            - name: mainline_vessel
              in: body
              type: string
              description: "The mainline vessel IMO number."
            - name: feeder_port
              in: body
              type: string
              description: "The feeder port UN/LOCODE."
          steps:
            - name: get-mainline-schedule
              type: call
              call: "sap.get-vessel-eta"
              with:
                vessel: "{{mainline_vessel}}"
                port: "{{feeder_port}}"
            - name: match-feeder
              type: call
              call: "routing.find-feeder"
              with:
                port: "{{feeder_port}}"
                arrival: "{{get-mainline-schedule.eta}}"
            - name: notify-terminal
              type: call
              call: "portapi.send-notification"
              with:
                port: "{{feeder_port}}"
                message: "Feeder {{match-feeder.feederVessel}} connecting with {{mainline_vessel}}. ETA: {{match-feeder.feederEta}}."
            - name: update-handbook
              type: call
              call: "confluence.update-page"
              with:
                space: "OPS"
                title: "Feeder Connections - {{feeder_port}}"
                body: "Updated: {{mainline_vessel}} connects to {{match-feeder.feederVessel}} at {{feeder_port}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SCHEDULE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: routing
      baseUri: "https://hapag-lloyd-routing.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.routing_token"
    - type: http
      namespace: portapi
      baseUri: "https://hapag-lloyd-port.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.port_api_token"
    - type: http
      namespace: confluence
      baseUri: "https://hapag-lloyd.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"

Schedules vessel maintenance by checking fleet availability in SAP, booking dry dock slots, notifying engineering via Microsoft Teams, and creating work orders in ServiceNow.

naftiko: "0.5"
info:
  label: "Fleet Maintenance Scheduling Pipeline"
  description: "Schedules vessel maintenance by checking fleet availability in SAP, booking dry dock slots, notifying engineering via Microsoft Teams, and creating work orders in ServiceNow."
  tags:
    - fleet
    - maintenance
    - sap
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: fleet-maintenance
      port: 8080
      tools:
        - name: schedule-maintenance
          description: "Schedule vessel maintenance."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance required."
          steps:
            - name: check-fleet-availability
              type: call
              call: "sap.get-vessel-schedule"
              with:
                vessel: "{{vessel_id}}"
            - name: book-dry-dock
              type: call
              call: "drydock.reserve-slot"
              with:
                vessel: "{{vessel_id}}"
                type: "{{maintenance_type}}"
                available_from: "{{check-fleet-availability.nextAvailable}}"
            - name: notify-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-fleet"
                text: "Maintenance scheduled for vessel {{vessel_id}}: {{maintenance_type}} at {{book-dry-dock.yardName}} from {{book-dry-dock.startDate}}."
            - name: create-work-order
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Vessel maintenance: {{vessel_id}} - {{maintenance_type}}"
                description: "Dry dock: {{book-dry-dock.yardName}}. Start: {{book-dry-dock.startDate}}. Duration: {{book-dry-dock.durationDays}} days."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_FLEET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: drydock
      baseUri: "https://hapag-lloyd-drydock.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.drydock_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now/table/change_request"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"

Processes freight damage claims by logging in SAP, attaching evidence to SharePoint, creating a Jira tracking issue, and notifying the claims team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Freight Claim Processing Pipeline"
  description: "Processes freight damage claims by logging in SAP, attaching evidence to SharePoint, creating a Jira tracking issue, and notifying the claims team via Microsoft Teams."
  tags:
    - shipping
    - claims
    - sap
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: freight-claims
      port: 8080
      tools:
        - name: process-freight-claim
          description: "Process a freight damage claim."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "The booking reference."
            - name: claim_amount
              in: body
              type: number
              description: "The claim amount."
            - name: description
              in: body
              type: string
              description: "Description of damage."
          steps:
            - name: log-claim
              type: call
              call: "sap.create-claim"
              with:
                booking: "{{booking_ref}}"
                amount: "{{claim_amount}}"
                description: "{{description}}"
            - name: store-evidence
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "claims_site"
                file_path: "Claims/{{booking_ref}}_evidence.pdf"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "CLAIMS"
                summary: "Freight claim: {{booking_ref}} - {{claim_amount}}"
                description: "{{description}}. SAP Ref: {{log-claim.claimNumber}}."
            - name: notify-claims
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "claims-team"
                text: "New freight claim: {{booking_ref}}. Amount: {{claim_amount}}. Claim#: {{log-claim.claimNumber}}. Jira: {{create-jira.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CLAIMS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves a freight rate quote from SAP for a given origin, destination, and container type, returning price, transit time, and surcharges.

naftiko: "0.5"
info:
  label: "Freight Rate Quote Lookup"
  description: "Retrieves a freight rate quote from SAP for a given origin, destination, and container type, returning price, transit time, and surcharges."
  tags:
    - shipping
    - pricing
    - sap
    - freight
capability:
  exposes:
    - type: mcp
      namespace: freight-rates
      port: 8080
      tools:
        - name: get-freight-rate
          description: "Look up a freight rate by origin port, destination port, and container type."
          inputParameters:
            - name: origin_port
              in: body
              type: string
              description: "The UN/LOCODE origin port."
            - name: destination_port
              in: body
              type: string
              description: "The UN/LOCODE destination port."
            - name: container_type
              in: body
              type: string
              description: "Container type code (e.g. 20GP, 40HC)."
          call: "sap.get-rate"
          with:
            origin: "{{origin_port}}"
            destination: "{{destination_port}}"
            container_type: "{{container_type}}"
          outputParameters:
            - name: base_rate
              type: string
              mapping: "$.d.BaseRate"
            - name: currency
              type: string
              mapping: "$.d.Currency"
            - name: transit_days
              type: string
              mapping: "$.d.TransitDays"
            - name: surcharges
              type: array
              mapping: "$.d.Surcharges.results"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_RATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: rates
          path: "/RateQuoteSet(Origin='{{origin}}',Destination='{{destination}}',ContainerType='{{container_type}}')"
          inputParameters:
            - name: origin
              in: path
            - name: destination
              in: path
            - name: container_type
              in: path
          operations:
            - name: get-rate
              method: GET

Uploads a document to a specified Google Drive folder, returning the file ID and shareable link.

naftiko: "0.5"
info:
  label: "Google Drive Document Uploader"
  description: "Uploads a document to a specified Google Drive folder, returning the file ID and shareable link."
  tags:
    - document-management
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: gdrive-docs
      port: 8080
      tools:
        - name: upload-document
          description: "Upload a document to Google Drive."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "The Google Drive folder ID."
            - name: file_name
              in: body
              type: string
              description: "The file name to upload."
            - name: content
              in: body
              type: string
              description: "The file content."
          call: "gdrive.upload-file"
          with:
            folder_id: "{{folder_id}}"
            name: "{{file_name}}"
            content: "{{content}}"
          outputParameters:
            - name: file_id
              type: string
              mapping: "$.id"
            - name: web_view_link
              type: string
              mapping: "$.webViewLink"
  consumes:
    - type: http
      namespace: gdrive
      baseUri: "https://www.googleapis.com/upload/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files?uploadType=multipart"
          operations:
            - name: upload-file
              method: POST

Calculates the sea route distance between two ports using Google Maps Distance Matrix API and returns distance in nautical miles and estimated transit time.

naftiko: "0.5"
info:
  label: "Google Maps Route Distance Calculator"
  description: "Calculates the sea route distance between two ports using Google Maps Distance Matrix API and returns distance in nautical miles and estimated transit time."
  tags:
    - logistics
    - routing
    - google-maps
capability:
  exposes:
    - type: mcp
      namespace: route-planning
      port: 8080
      tools:
        - name: calculate-route-distance
          description: "Calculate distance and transit time between two ports using Google Maps."
          inputParameters:
            - name: origin_port
              in: body
              type: string
              description: "Origin port name or coordinates."
            - name: destination_port
              in: body
              type: string
              description: "Destination port name or coordinates."
          call: "gmaps.get-distance"
          with:
            origins: "{{origin_port}}"
            destinations: "{{destination_port}}"
          outputParameters:
            - name: distance_nm
              type: string
              mapping: "$.rows[0].elements[0].distance.text"
            - name: estimated_duration
              type: string
              mapping: "$.rows[0].elements[0].duration.text"
  consumes:
    - type: http
      namespace: gmaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        key: "$secrets.google_maps_api_key"
        paramName: "key"
      resources:
        - name: distance-matrix
          path: "/distancematrix/json?origins={{origins}}&destinations={{destinations}}"
          inputParameters:
            - name: origins
              in: query
            - name: destinations
              in: query
          operations:
            - name: get-distance
              method: GET

Reads operational metrics from SAP and writes them to a Google Sheets dashboard for team visibility.

naftiko: "0.5"
info:
  label: "Google Sheets Operational Dashboard Sync"
  description: "Reads operational metrics from SAP and writes them to a Google Sheets dashboard for team visibility."
  tags:
    - reporting
    - google-sheets
    - sap
capability:
  exposes:
    - type: mcp
      namespace: sheets-sync
      port: 8080
      tools:
        - name: sync-ops-dashboard
          description: "Pull SAP metrics and update a Google Sheets dashboard."
          inputParameters:
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID."
            - name: metric_type
              in: body
              type: string
              description: "The metric category to sync."
          steps:
            - name: get-metrics
              type: call
              call: "sap.get-ops-metrics"
              with:
                metric_type: "{{metric_type}}"
            - name: update-sheet
              type: call
              call: "gsheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "Dashboard!A2:D2"
                values:
                  - - "{{get-metrics.metric_name}}"
                    - "{{get-metrics.current_value}}"
                    - "{{get-metrics.target_value}}"
                    - "{{get-metrics.last_updated}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_OPS_METRICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: metrics
          path: "/OpsMetricSet('{{metric_type}}')"
          inputParameters:
            - name: metric_type
              in: path
          operations:
            - name: get-ops-metrics
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT

Validates hazardous cargo declarations against IMDG regulations, checks vessel stowage compatibility, generates compliance documents in SharePoint, and notifies the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Hazardous Cargo Compliance Pipeline"
  description: "Validates hazardous cargo declarations against IMDG regulations, checks vessel stowage compatibility, generates compliance documents in SharePoint, and notifies the compliance team via Microsoft Teams."
  tags:
    - shipping
    - hazmat
    - compliance
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hazmat-compliance
      port: 8080
      tools:
        - name: validate-hazmat-cargo
          description: "Validate and process hazardous cargo compliance."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "The booking reference."
            - name: dg_class
              in: body
              type: string
              description: "The dangerous goods class."
          steps:
            - name: validate-declaration
              type: call
              call: "compliance.check-imdg"
              with:
                booking: "{{booking_ref}}"
                class: "{{dg_class}}"
            - name: check-stowage
              type: call
              call: "sap.check-stowage-compatibility"
              with:
                booking: "{{booking_ref}}"
                class: "{{dg_class}}"
            - name: store-docs
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "compliance_site"
                file_path: "DG/{{booking_ref}}_compliance.pdf"
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "compliance-team"
                text: "Hazmat booking {{booking_ref}} (Class {{dg_class}}) validated. Stowage: {{check-stowage.location}}. Docs: {{store-docs.url}}"
  consumes:
    - type: http
      namespace: compliance
      baseUri: "https://hapag-lloyd-compliance.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_STOWAGE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves a HubSpot lead by email, enriches with Salesforce account data and shipping volume from SAP, and updates the HubSpot contact.

naftiko: "0.5"
info:
  label: "HubSpot Lead Enrichment for Shipping"
  description: "Retrieves a HubSpot lead by email, enriches with Salesforce account data and shipping volume from SAP, and updates the HubSpot contact."
  tags:
    - sales
    - lead-management
    - hubspot
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: lead-enrichment
      port: 8080
      tools:
        - name: enrich-lead
          description: "Enrich a HubSpot lead with Salesforce account data and SAP shipping volume."
          inputParameters:
            - name: lead_email
              in: body
              type: string
              description: "The lead's email address."
          steps:
            - name: get-hubspot-contact
              type: call
              call: "hubspot.get-contact"
              with:
                email: "{{lead_email}}"
            - name: get-sf-account
              type: call
              call: "salesforce.get-account-by-email"
              with:
                email: "{{lead_email}}"
            - name: get-volume
              type: call
              call: "sap.get-customer-volume"
              with:
                customer_id: "{{get-sf-account.Id}}"
            - name: update-hubspot
              type: call
              call: "hubspot.update-contact"
              with:
                contact_id: "{{get-hubspot-contact.id}}"
                properties:
                  company: "{{get-sf-account.Name}}"
                  annual_teu_volume: "{{get-volume.annual_teu}}"
                  contract_status: "{{get-sf-account.Contract_Status__c}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-contact
              method: GET
            - name: update-contact
              method: PATCH
    - type: http
      namespace: salesforce
      baseUri: "https://hapag-lloyd.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/parameterizedSearch/?q={{email}}&sobject=Account"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-account-by-email
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CUSTOMER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/CustomerVolumeSet('{{customer_id}}')"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: get-customer-volume
              method: GET

When a critical ServiceNow incident is raised, retrieves vessel and container data from SAP, escalates in Jira, and notifies senior operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Incident Escalation Pipeline"
  description: "When a critical ServiceNow incident is raised, retrieves vessel and container data from SAP, escalates in Jira, and notifies senior operations via Microsoft Teams."
  tags:
    - operations
    - incident
    - servicenow
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Escalate a ServiceNow shipping incident by enriching it with SAP data, creating a Jira escalation, and alerting senior ops."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
            - name: shipment_ref
              in: body
              type: string
              description: "Related SAP shipment reference."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: get-shipment
              type: call
              call: "sap.get-shipment"
              with:
                shipment_ref: "{{shipment_ref}}"
            - name: create-escalation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "OPS"
                summary: "ESCALATION: {{get-incident.short_description}}"
                issue_type: "Bug"
                priority: "Critical"
                description: "ServiceNow {{incident_number}}: {{get-incident.description}}. Vessel: {{get-shipment.VesselName}}, Port: {{get-shipment.CurrentPort}}."
            - name: alert-senior-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "senior-ops-alerts"
                text: "ESCALATION: {{get-incident.short_description}}. Vessel: {{get-shipment.VesselName}}. Jira: {{create-escalation.key}}. ServiceNow: {{incident_number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.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: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: shipments
          path: "/ShipmentSet('{{shipment_ref}}')"
          inputParameters:
            - name: shipment_ref
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.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.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates inland transport by matching container arrivals with truck or rail bookings, updating SAP logistics, and notifying the transport team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Inland Transport Coordination Pipeline"
  description: "Coordinates inland transport by matching container arrivals with truck or rail bookings, updating SAP logistics, and notifying the transport team via Microsoft Teams."
  tags:
    - logistics
    - inland-transport
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: inland-transport
      port: 8080
      tools:
        - name: coordinate-inland-transport
          description: "Coordinate inland transport for containers."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number."
            - name: delivery_address
              in: body
              type: string
              description: "The final delivery address."
          steps:
            - name: get-container-arrival
              type: call
              call: "sap.get-container-eta"
              with:
                container: "{{container_number}}"
            - name: book-transport
              type: call
              call: "logistics.book-inland"
              with:
                container: "{{container_number}}"
                pickup_date: "{{get-container-arrival.arrivalDate}}"
                delivery: "{{delivery_address}}"
            - name: update-sap
              type: call
              call: "sap.update-inland-booking"
              with:
                container: "{{container_number}}"
                transport_ref: "{{book-transport.bookingRef}}"
            - name: notify-transport
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "transport-operations"
                text: "Inland transport booked for {{container_number}}. Pickup: {{get-container-arrival.arrivalDate}}. Delivery: {{delivery_address}}. Ref: {{book-transport.bookingRef}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_LOGISTICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: logistics
      baseUri: "https://hapag-lloyd-logistics.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.logistics_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves rail connection schedules for intermodal transport from the logistics platform.

naftiko: "0.5"
info:
  label: "Intermodal Rail Schedule Lookup"
  description: "Retrieves rail connection schedules for intermodal transport from the logistics platform."
  tags:
    - logistics
    - intermodal
    - rail
capability:
  exposes:
    - type: mcp
      namespace: logistics-rail
      port: 8080
      tools:
        - name: get-rail-schedule
          description: "Look up rail schedules for a given route."
          inputParameters:
            - name: origin_terminal
              in: body
              type: string
              description: "The origin rail terminal code."
            - name: destination_terminal
              in: body
              type: string
              description: "The destination rail terminal code."
          call: "logistics.get-rail"
          with:
            origin: "{{origin_terminal}}"
            destination: "{{destination_terminal}}"
          outputParameters:
            - name: departures
              type: array
              mapping: "$.departures"
            - name: carrier
              type: string
              mapping: "$.carrier"
  consumes:
    - type: http
      namespace: logistics
      baseUri: "https://hapag-lloyd-logistics.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.logistics_token"
      resources:
        - name: rail-schedules
          path: "/rail-schedules?origin={{origin}}&dest={{destination}}"
          inputParameters:
            - name: origin
              in: query
            - name: destination
              in: query
          operations:
            - name: get-rail
              method: GET

Retrieves the status summary of a Jira project, returning total issues, open issues, and sprint progress.

naftiko: "0.5"
info:
  label: "Jira Shipping Project Status"
  description: "Retrieves the status summary of a Jira project, returning total issues, open issues, and sprint progress."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-tracking
      port: 8080
      tools:
        - name: get-project-status
          description: "Get a summary of a Jira project including issue counts and sprint progress."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key."
          call: "jira.get-project"
          with:
            project_key: "{{project_key}}"
          outputParameters:
            - name: total_issues
              type: integer
              mapping: "$.total"
            - name: open_issues
              type: integer
              mapping: "$.open_count"
            - name: sprint_name
              type: string
              mapping: "$.active_sprint.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: projects
          path: "/search?jql=project={{project_key}}"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: get-project
              method: GET

Retrieves company metrics from SAP, formats a branded post, and publishes to the Hapag-Lloyd LinkedIn company page.

naftiko: "0.5"
info:
  label: "LinkedIn Shipping Industry Post"
  description: "Retrieves company metrics from SAP, formats a branded post, and publishes to the Hapag-Lloyd LinkedIn company page."
  tags:
    - marketing
    - social-media
    - linkedin
    - sap
capability:
  exposes:
    - type: mcp
      namespace: social-publishing
      port: 8080
      tools:
        - name: publish-linkedin-update
          description: "Pull operational metrics from SAP and publish a branded update to LinkedIn."
          inputParameters:
            - name: metric_type
              in: body
              type: string
              description: "The type of metric to highlight (e.g. on_time_delivery, teu_volume)."
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g. Q1-2026)."
          steps:
            - name: get-metrics
              type: call
              call: "sap.get-kpis"
              with:
                metric_type: "{{metric_type}}"
                period: "{{period}}"
            - name: post-update
              type: call
              call: "linkedin.create-post"
              with:
                author: "urn:li:organization:hapag-lloyd"
                text: "Hapag-Lloyd {{period}} Update: Our {{metric_type}} reached {{get-metrics.value}}{{get-metrics.unit}}. #Shipping #Logistics #ContainerShipping"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_KPI_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: kpis
          path: "/KPISet(MetricType='{{metric_type}}',Period='{{period}}')"
          inputParameters:
            - name: metric_type
              in: path
            - name: period
              in: path
          operations:
            - name: get-kpis
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST

Pulls the latest shipping schedule highlights from SAP, formats them into a MailChimp campaign, and sends to the customer subscriber list.

naftiko: "0.5"
info:
  label: "MailChimp Shipping Newsletter Publisher"
  description: "Pulls the latest shipping schedule highlights from SAP, formats them into a MailChimp campaign, and sends to the customer subscriber list."
  tags:
    - marketing
    - newsletter
    - mailchimp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: newsletter-publishing
      port: 8080
      tools:
        - name: publish-newsletter
          description: "Create and send a shipping newsletter via MailChimp with SAP schedule highlights."
          inputParameters:
            - name: list_id
              in: body
              type: string
              description: "The MailChimp audience list ID."
            - name: period
              in: body
              type: string
              description: "The schedule period to highlight."
          steps:
            - name: get-highlights
              type: call
              call: "sap.get-schedule-highlights"
              with:
                period: "{{period}}"
            - name: create-campaign
              type: call
              call: "mailchimp.create-campaign"
              with:
                list_id: "{{list_id}}"
                subject: "Hapag-Lloyd Shipping Update - {{period}}"
                body: "New services: {{get-highlights.new_services}}. Schedule changes: {{get-highlights.changes}}. Key routes: {{get-highlights.key_routes}}."
            - name: send-campaign
              type: call
              call: "mailchimp.send-campaign"
              with:
                campaign_id: "{{create-campaign.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SCHEDULE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: highlights
          path: "/ScheduleHighlightSet('{{period}}')"
          inputParameters:
            - name: period
              in: path
          operations:
            - name: get-schedule-highlights
              method: GET
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: create-campaign
              method: POST
        - name: campaign-actions
          path: "/campaigns/{{campaign_id}}/actions/send"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: send-campaign
              method: POST

Retrieves marine cargo insurance certificate details from the insurance management system.

naftiko: "0.5"
info:
  label: "Marine Insurance Certificate Lookup"
  description: "Retrieves marine cargo insurance certificate details from the insurance management system."
  tags:
    - shipping
    - insurance
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: insurance-mgmt
      port: 8080
      tools:
        - name: get-insurance-cert
          description: "Look up insurance certificate for a shipment."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The shipment reference number."
          call: "insurance.get-cert"
          with:
            shipment: "{{shipment_id}}"
          outputParameters:
            - name: policy_number
              type: string
              mapping: "$.policyNumber"
            - name: coverage_amount
              type: string
              mapping: "$.coverageAmount"
            - name: valid_until
              type: string
              mapping: "$.validUntil"
  consumes:
    - type: http
      namespace: insurance
      baseUri: "https://hapag-lloyd-insurance.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.insurance_token"
      resources:
        - name: certificates
          path: "/certificates/{{shipment}}"
          inputParameters:
            - name: shipment
              in: path
          operations:
            - name: get-cert
              method: GET

Sends a formatted email via Microsoft Outlook on behalf of a user, used for automated customer and internal communications.

naftiko: "0.5"
info:
  label: "Microsoft Outlook Email Sender"
  description: "Sends a formatted email via Microsoft Outlook on behalf of a user, used for automated customer and internal communications."
  tags:
    - communications
    - email
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: email-sending
      port: 8080
      tools:
        - name: send-email
          description: "Send an email via Microsoft Outlook."
          inputParameters:
            - name: to_address
              in: body
              type: string
              description: "The recipient email address."
            - name: subject
              in: body
              type: string
              description: "The email subject."
            - name: body_text
              in: body
              type: string
              description: "The email body."
          call: "outlook.send-mail"
          with:
            to: "{{to_address}}"
            subject: "{{subject}}"
            body: "{{body_text}}"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Sends a formatted message to a specified Microsoft Teams channel, used for operational alerts and status updates.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notifier"
  description: "Sends a formatted message to a specified Microsoft Teams channel, used for operational alerts and status updates."
  tags:
    - communications
    - microsoft-teams
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: team-notifications
      port: 8080
      tools:
        - name: send-channel-notification
          description: "Send a message to a Microsoft Teams channel."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The Teams channel ID."
            - name: message_text
              in: body
              type: string
              description: "The notification message text."
          call: "msteams.send-channel-message"
          with:
            channel_id: "{{channel_id}}"
            text: "{{message_text}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Tracks shipments across ocean, rail, and truck segments by aggregating data from SAP, the logistics platform, and Google Maps, then updating the customer via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Multi-Modal Shipment Tracker"
  description: "Tracks shipments across ocean, rail, and truck segments by aggregating data from SAP, the logistics platform, and Google Maps, then updating the customer via Microsoft Outlook."
  tags:
    - logistics
    - multi-modal
    - tracking
    - sap
    - google-maps
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: multimodal-tracking
      port: 8080
      tools:
        - name: track-multimodal-shipment
          description: "Track a multi-modal shipment end-to-end."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The shipment reference."
          steps:
            - name: get-ocean-leg
              type: call
              call: "sap.get-shipment-ocean"
              with:
                shipment: "{{shipment_id}}"
            - name: get-inland-leg
              type: call
              call: "logistics.get-inland-status"
              with:
                shipment: "{{shipment_id}}"
            - name: get-route-eta
              type: call
              call: "gmaps.get-directions"
              with:
                origin: "{{get-inland-leg.currentLocation}}"
                destination: "{{get-inland-leg.finalDestination}}"
            - name: notify-customer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-ocean-leg.customerEmail}}"
                subject: "Shipment Update - {{shipment_id}}"
                body: "Ocean: {{get-ocean-leg.status}}. Inland: {{get-inland-leg.status}}. Current location: {{get-inland-leg.currentLocation}}. ETA: {{get-route-eta.eta}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: logistics
      baseUri: "https://hapag-lloyd-logistics.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.logistics_token"
    - type: http
      namespace: gmaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        key: "$secrets.google_maps_key"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

When a customer submits a booking request, validates availability in SAP, creates the booking, notifies the sales team via Microsoft Teams, and sends confirmation via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "New Booking Request Pipeline"
  description: "When a customer submits a booking request, validates availability in SAP, creates the booking, notifies the sales team via Microsoft Teams, and sends confirmation via Microsoft Outlook."
  tags:
    - shipping
    - booking
    - sap
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: booking-pipeline
      port: 8080
      tools:
        - name: process-booking-request
          description: "Process a new booking request end-to-end."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The customer account ID."
            - name: origin_port
              in: body
              type: string
              description: "Origin port UN/LOCODE."
            - name: destination_port
              in: body
              type: string
              description: "Destination port UN/LOCODE."
            - name: container_type
              in: body
              type: string
              description: "Container type code."
          steps:
            - name: check-availability
              type: call
              call: "sap.check-slot"
              with:
                customer: "{{customer_id}}"
                origin: "{{origin_port}}"
                dest: "{{destination_port}}"
                type: "{{container_type}}"
            - name: create-booking
              type: call
              call: "sap.create-booking"
              with:
                customer: "{{customer_id}}"
                origin: "{{origin_port}}"
                dest: "{{destination_port}}"
                type: "{{container_type}}"
                slot: "{{check-availability.slotId}}"
            - name: notify-sales
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales-bookings"
                text: "New booking {{create-booking.BookingRef}} created for customer {{customer_id}}. Route: {{origin_port}} to {{destination_port}}."
            - name: email-confirmation
              type: call
              call: "outlook.send-email"
              with:
                to: "{{check-availability.customerEmail}}"
                subject: "Booking Confirmation - {{create-booking.BookingRef}}"
                body: "Your booking {{create-booking.BookingRef}} from {{origin_port}} to {{destination_port}} has been confirmed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_BOOKING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Orchestrates the launch of a new trade lane by configuring routes in SAP, publishing schedules to the website CMS, announcing on LinkedIn, and notifying the commercial team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Trade Lane Launch Orchestrator"
  description: "Orchestrates the launch of a new trade lane by configuring routes in SAP, publishing schedules to the website CMS, announcing on LinkedIn, and notifying the commercial team via Microsoft Teams."
  tags:
    - commercial
    - trade-lane
    - sap
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade-lane-launch
      port: 8080
      tools:
        - name: launch-trade-lane
          description: "Launch a new trade lane."
          inputParameters:
            - name: trade_lane_code
              in: body
              type: string
              description: "The new trade lane code."
            - name: service_name
              in: body
              type: string
              description: "The service name."
          steps:
            - name: configure-route
              type: call
              call: "sap.create-trade-lane"
              with:
                code: "{{trade_lane_code}}"
                service: "{{service_name}}"
            - name: publish-schedule
              type: call
              call: "cms.publish-schedule"
              with:
                trade_lane: "{{trade_lane_code}}"
                ports: "{{configure-route.portList}}"
                frequency: "{{configure-route.frequency}}"
            - name: announce-linkedin
              type: call
              call: "linkedin.create-post"
              with:
                text: "Hapag-Lloyd launches {{service_name}} connecting {{configure-route.portList}}. Weekly service starting {{configure-route.startDate}}."
            - name: notify-commercial
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "commercial-team"
                text: "New trade lane {{trade_lane_code}} ({{service_name}}) launched. Ports: {{configure-route.portList}}. Start: {{configure-route.startDate}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_TRADELANE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: cms
      baseUri: "https://hapag-lloyd-cms.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cms_token"
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves applicable surcharges for a specific trade lane from the pricing system.

naftiko: "0.5"
info:
  label: "Ocean Freight Surcharge Lookup"
  description: "Retrieves applicable surcharges for a specific trade lane from the pricing system."
  tags:
    - shipping
    - pricing
    - surcharges
capability:
  exposes:
    - type: mcp
      namespace: pricing-surcharge
      port: 8080
      tools:
        - name: get-surcharges
          description: "Look up surcharges for a trade lane."
          inputParameters:
            - name: trade_lane
              in: body
              type: string
              description: "The trade lane code."
            - name: container_type
              in: body
              type: string
              description: "Container type code (20GP, 40HC, etc.)."
          call: "pricing.get-surcharges"
          with:
            lane: "{{trade_lane}}"
            type: "{{container_type}}"
          outputParameters:
            - name: surcharges
              type: array
              mapping: "$.surcharges"
            - name: total_amount
              type: number
              mapping: "$.totalAmount"
            - name: currency
              type: string
              mapping: "$.currency"
  consumes:
    - type: http
      namespace: pricing
      baseUri: "https://hapag-lloyd-pricing.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pricing_token"
      resources:
        - name: surcharges
          path: "/surcharges?lane={{lane}}&type={{type}}"
          inputParameters:
            - name: lane
              in: query
            - name: type
              in: query
          operations:
            - name: get-surcharges
              method: GET

Pulls outstanding invoices from Oracle E-Business Suite, matches with SAP shipment records, and publishes a reconciliation report to Confluence.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Invoice Sync"
  description: "Pulls outstanding invoices from Oracle E-Business Suite, matches with SAP shipment records, and publishes a reconciliation report to Confluence."
  tags:
    - finance
    - oracle-ebs
    - sap
    - confluence
    - reconciliation
capability:
  exposes:
    - type: mcp
      namespace: invoice-reconciliation
      port: 8080
      tools:
        - name: reconcile-invoices
          description: "Match Oracle EBS invoices with SAP shipment records and publish a reconciliation report."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "The billing period in YYYY-MM format."
          steps:
            - name: get-oracle-invoices
              type: call
              call: "oracle-ebs.get-invoices"
              with:
                period: "{{period}}"
            - name: get-sap-shipments
              type: call
              call: "sap.get-shipments-by-period"
              with:
                period: "{{period}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "FIN"
                title: "Invoice Reconciliation: {{period}}"
                body: "Oracle invoices: {{get-oracle-invoices.count}}. SAP shipments: {{get-sap-shipments.count}}. Matched: {{get-oracle-invoices.matched_count}}. Unmatched: {{get-oracle-invoices.unmatched_count}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://hapag-lloyd-ebs.oracle.com/webservices/rest"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: invoices
          path: "/ap/invoices?period={{period}}"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-invoices
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: shipments
          path: "/ShipmentSet?$filter=Period eq '{{period}}'"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-shipments-by-period
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://hapag-lloyd.atlassian.net/wiki/api/v2"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/pages"
          operations:
            - name: create-page
              method: POST

Assesses piracy risk for vessel routes by checking threat intelligence, updating vessel security plans in SharePoint, notifying the security team via Microsoft Teams, and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Piracy Risk Assessment Pipeline"
  description: "Assesses piracy risk for vessel routes by checking threat intelligence, updating vessel security plans in SharePoint, notifying the security team via Microsoft Teams, and logging in ServiceNow."
  tags:
    - security
    - maritime
    - risk
    - sharepoint
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: piracy-risk
      port: 8080
      tools:
        - name: assess-piracy-risk
          description: "Assess piracy risk for vessel routes."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: route
              in: body
              type: string
              description: "The planned route waypoints."
          steps:
            - name: check-threat-intel
              type: call
              call: "security.get-piracy-risk"
              with:
                route: "{{route}}"
            - name: update-security-plan
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "security_site"
                file_path: "SecurityPlans/{{vessel_id}}_risk_assessment.pdf"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "maritime-security"
                text: "Piracy risk assessment for {{vessel_id}}: Level {{check-threat-intel.riskLevel}}. High-risk zones: {{check-threat-intel.hotspots}}."
            - name: log-assessment
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_security_assessment"
                vessel: "{{vessel_id}}"
                risk_level: "{{check-threat-intel.riskLevel}}"
  consumes:
    - type: http
      namespace: security
      baseUri: "https://hapag-lloyd-security.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now/table"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"

Optimizes port call sequences by analyzing vessel schedules in SAP, running optimization algorithms, updating routes, and notifying the fleet management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Port Call Optimization Pipeline"
  description: "Optimizes port call sequences by analyzing vessel schedules in SAP, running optimization algorithms, updating routes, and notifying the fleet management team via Microsoft Teams."
  tags:
    - shipping
    - optimization
    - fleet
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: port-optimization
      port: 8080
      tools:
        - name: optimize-port-calls
          description: "Optimize vessel port call sequence."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: voyage_number
              in: body
              type: string
              description: "The voyage number."
          steps:
            - name: get-current-schedule
              type: call
              call: "sap.get-voyage-schedule"
              with:
                vessel: "{{vessel_id}}"
                voyage: "{{voyage_number}}"
            - name: run-optimization
              type: call
              call: "optimization.optimize-route"
              with:
                ports: "{{get-current-schedule.portList}}"
                constraints: "{{get-current-schedule.constraints}}"
            - name: update-schedule
              type: call
              call: "sap.update-voyage-schedule"
              with:
                vessel: "{{vessel_id}}"
                voyage: "{{voyage_number}}"
                new_ports: "{{run-optimization.optimizedRoute}}"
            - name: notify-fleet-mgmt
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fleet-management"
                text: "Port call optimized for {{vessel_id}} voyage {{voyage_number}}. Savings: {{run-optimization.fuelSavings}} tonnes fuel, {{run-optimization.timeSavingsHours}} hours."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_VOYAGE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: optimization
      baseUri: "https://hapag-lloyd-optimization.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.optimization_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Fetches current port congestion metrics from Google Analytics, enriches with vessel queue data from SAP, and pushes a summary to Power BI for operations visibility.

naftiko: "0.5"
info:
  label: "Port Congestion Dashboard Sync"
  description: "Fetches current port congestion metrics from Google Analytics, enriches with vessel queue data from SAP, and pushes a summary to Power BI for operations visibility."
  tags:
    - logistics
    - port-operations
    - google-analytics
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: port-congestion
      port: 8080
      tools:
        - name: sync-port-congestion
          description: "Pull port congestion analytics, enrich with SAP vessel data, and push to Power BI."
          inputParameters:
            - name: port_code
              in: body
              type: string
              description: "The UN/LOCODE port code."
          steps:
            - name: get-analytics
              type: call
              call: "ga.get-port-metrics"
              with:
                port_code: "{{port_code}}"
            - name: get-vessel-queue
              type: call
              call: "sap.get-port-queue"
              with:
                port_code: "{{port_code}}"
            - name: push-to-bi
              type: call
              call: "powerbi.push-rows"
              with:
                dataset_id: "port_congestion_ds"
                table_name: "CongestionMetrics"
                rows:
                  - port_code: "{{port_code}}"
                    avg_wait_hours: "{{get-analytics.avg_wait_time}}"
                    vessels_queued: "{{get-vessel-queue.queue_count}}"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: get-port-metrics
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_PORT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: port-queue
          path: "/PortQueueSet('{{port_code}}')"
          inputParameters:
            - name: port_code
              in: path
          operations:
            - name: get-port-queue
              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}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

When port congestion exceeds thresholds, reroutes affected vessels, updates bookings in SAP, notifies customers via Microsoft Outlook, and updates the Datadog monitoring dashboard.

naftiko: "0.5"
info:
  label: "Port Congestion Response Orchestrator"
  description: "When port congestion exceeds thresholds, reroutes affected vessels, updates bookings in SAP, notifies customers via Microsoft Outlook, and updates the Datadog monitoring dashboard."
  tags:
    - shipping
    - port
    - congestion
    - sap
    - microsoft-outlook
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: congestion-response
      port: 8080
      tools:
        - name: handle-port-congestion
          description: "Manage port congestion response."
          inputParameters:
            - name: port_code
              in: body
              type: string
              description: "The congested port UN/LOCODE."
            - name: congestion_level
              in: body
              type: string
              description: "Congestion severity level."
          steps:
            - name: get-affected-vessels
              type: call
              call: "sap.get-port-vessels"
              with:
                port: "{{port_code}}"
            - name: reroute-vessels
              type: call
              call: "routing.suggest-alternatives"
              with:
                port: "{{port_code}}"
                vessels: "{{get-affected-vessels.vesselList}}"
            - name: update-bookings
              type: call
              call: "sap.batch-update-port"
              with:
                port: "{{port_code}}"
                alternatives: "{{reroute-vessels.alternatives}}"
            - name: notify-customers
              type: call
              call: "outlook.send-email"
              with:
                to: "{{update-bookings.affectedEmails}}"
                subject: "Port Congestion Advisory - {{port_code}}"
                body: "Due to congestion at {{port_code}}, your shipment routing has been updated."
            - name: update-monitoring
              type: call
              call: "datadog.post-event"
              with:
                title: "Port Congestion: {{port_code}}"
                text: "Level: {{congestion_level}}. Affected vessels: {{get-affected-vessels.count}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_PORT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: routing
      baseUri: "https://hapag-lloyd-routing.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.routing_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"

Returns estimated transit time between two ports from the routing database.

naftiko: "0.5"
info:
  label: "Port Pair Transit Time Lookup"
  description: "Returns estimated transit time between two ports from the routing database."
  tags:
    - shipping
    - transit-time
    - routing
capability:
  exposes:
    - type: mcp
      namespace: shipping-transit
      port: 8080
      tools:
        - name: get-transit-time
          description: "Get estimated transit days between an origin and destination port."
          inputParameters:
            - name: origin_port
              in: body
              type: string
              description: "UN/LOCODE of the origin port."
            - name: destination_port
              in: body
              type: string
              description: "UN/LOCODE of the destination port."
          call: "routing.get-transit"
          with:
            origin: "{{origin_port}}"
            destination: "{{destination_port}}"
          outputParameters:
            - name: transit_days
              type: integer
              mapping: "$.transitDays"
            - name: service_name
              type: string
              mapping: "$.serviceName"
  consumes:
    - type: http
      namespace: routing
      baseUri: "https://hapag-lloyd-routing.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.routing_token"
      resources:
        - name: transit-times
          path: "/transit-times?origin={{origin}}&destination={{destination}}"
          inputParameters:
            - name: origin
              in: query
            - name: destination
              in: query
          operations:
            - name: get-transit
              method: GET

Returns current gate operating hours for a specified port terminal.

naftiko: "0.5"
info:
  label: "Port Terminal Gate Hours Lookup"
  description: "Returns current gate operating hours for a specified port terminal."
  tags:
    - shipping
    - port
    - terminal
capability:
  exposes:
    - type: mcp
      namespace: port-info
      port: 8080
      tools:
        - name: get-gate-hours
          description: "Look up terminal gate operating hours."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "The terminal facility code."
          call: "portinfo.get-hours"
          with:
            terminal: "{{terminal_code}}"
          outputParameters:
            - name: opening_time
              type: string
              mapping: "$.openingTime"
            - name: closing_time
              type: string
              mapping: "$.closingTime"
            - name: days
              type: string
              mapping: "$.operatingDays"
  consumes:
    - type: http
      namespace: portinfo
      baseUri: "https://hapag-lloyd-portinfo.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.port_api_token"
      resources:
        - name: terminal-hours
          path: "/terminals/{{terminal}}/gate-hours"
          inputParameters:
            - name: terminal
              in: path
          operations:
            - name: get-hours
              method: GET

Triggers a Qlik Sense app reload for shipping analytics, waits for completion, and notifies the analytics team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Qlik Sense Shipping Dashboard Refresh"
  description: "Triggers a Qlik Sense app reload for shipping analytics, waits for completion, and notifies the analytics team in Microsoft Teams."
  tags:
    - analytics
    - qlik-sense
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: analytics-refresh
      port: 8080
      tools:
        - name: refresh-qlik-dashboard
          description: "Trigger a Qlik Sense app reload and notify the analytics team."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Qlik Sense app ID."
          steps:
            - name: trigger-reload
              type: call
              call: "qlik.reload-app"
              with:
                app_id: "{{app_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "analytics-team"
                text: "Qlik Sense dashboard {{app_id}} reload triggered. Reload ID: {{trigger-reload.reloadId}}."
  consumes:
    - type: http
      namespace: qlik
      baseUri: "https://hapag-lloyd.us.qlikcloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
      resources:
        - name: reloads
          path: "/reloads"
          operations:
            - name: reload-app
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates quarterly business review reports by pulling KPIs from SAP, creating presentation data in Google Sheets, generating slides via SharePoint, and distributing to leadership via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Quarterly Business Review Generator"
  description: "Generates quarterly business review reports by pulling KPIs from SAP, creating presentation data in Google Sheets, generating slides via SharePoint, and distributing to leadership via Microsoft Outlook."
  tags:
    - business
    - reporting
    - sap
    - google-sheets
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: qbr-generator
      port: 8080
      tools:
        - name: generate-qbr
          description: "Generate quarterly business review."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "The quarter (Q1-Q4)."
            - name: year
              in: body
              type: string
              description: "The fiscal year."
          steps:
            - name: pull-kpis
              type: call
              call: "sap.get-quarterly-kpis"
              with:
                quarter: "{{quarter}}"
                year: "{{year}}"
            - name: update-dashboard
              type: call
              call: "gsheets.update-range"
              with:
                spreadsheet_id: "qbr_data"
                range: "{{quarter}}{{year}}!A1"
                values: "{{pull-kpis.summary}}"
            - name: generate-report
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "executive_reports"
                file_path: "QBR/{{year}}_{{quarter}}_review.pdf"
            - name: distribute-report
              type: call
              call: "outlook.send-email"
              with:
                to: "leadership@hapag-lloyd.com"
                subject: "{{quarter}} {{year}} Business Review"
                body: "The quarterly business review is ready. TEU volume: {{pull-kpis.totalTEU}}, Revenue: {{pull-kpis.revenue}}. Report: {{generate-report.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZBI_KPI_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_token"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

When a reefer container temperature breaches thresholds, logs the event in SAP, creates a ServiceNow incident, notifies the cold chain team via Microsoft Teams, and emails the customer.

naftiko: "0.5"
info:
  label: "Reefer Cargo Exception Handler"
  description: "When a reefer container temperature breaches thresholds, logs the event in SAP, creates a ServiceNow incident, notifies the cold chain team via Microsoft Teams, and emails the customer."
  tags:
    - shipping
    - reefer
    - cold-chain
    - sap
    - servicenow
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: reefer-exception
      port: 8080
      tools:
        - name: handle-reefer-exception
          description: "Handle reefer container temperature exceptions."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The reefer container number."
            - name: temperature
              in: body
              type: number
              description: "The recorded temperature."
          steps:
            - name: log-event
              type: call
              call: "sap.log-reefer-exception"
              with:
                container: "{{container_number}}"
                temp: "{{temperature}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Reefer exception: {{container_number}}"
                description: "Temperature {{temperature}} exceeds threshold. Cargo: {{log-event.cargoDescription}}."
            - name: notify-cold-chain
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "cold-chain-alerts"
                text: "ALERT: Reefer {{container_number}} at {{temperature}}C. Threshold: {{log-event.threshold}}C. Cargo: {{log-event.cargoDescription}}."
            - name: email-customer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{log-event.customerEmail}}"
                subject: "Reefer Alert - Container {{container_number}}"
                body: "A temperature exception has been detected for container {{container_number}}. Current: {{temperature}}C. Our team is investigating."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_REEFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now/table/incident"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Pulls reefer container telemetry from SAP, checks temperature thresholds, creates a Jira alert if out of range, and notifies operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Reefer Container Temperature Monitor"
  description: "Pulls reefer container telemetry from SAP, checks temperature thresholds, creates a Jira alert if out of range, and notifies operations via Microsoft Teams."
  tags:
    - logistics
    - reefer
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: reefer-monitoring
      port: 8080
      tools:
        - name: check-reefer-temperature
          description: "Check reefer container temperature and alert if out of range."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The reefer container number."
            - name: max_temp_celsius
              in: body
              type: number
              description: "The maximum allowed temperature in Celsius."
          steps:
            - name: get-telemetry
              type: call
              call: "sap.get-reefer-telemetry"
              with:
                container_id: "{{container_number}}"
            - name: create-alert
              type: call
              call: "jira.create-issue"
              with:
                project_key: "REEFER"
                summary: "Temperature alert: {{container_number}} at {{get-telemetry.current_temp}}C (max: {{max_temp_celsius}}C)"
                issue_type: "Bug"
                priority: "High"
                description: "Container {{container_number}} current temperature: {{get-telemetry.current_temp}}C. Set point: {{get-telemetry.set_point}}C. Location: {{get-telemetry.current_location}}."
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "reefer-alerts"
                text: "REEFER ALERT: {{container_number}} at {{get-telemetry.current_temp}}C (max {{max_temp_celsius}}C). Location: {{get-telemetry.current_location}}. Jira: {{create-alert.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_REEFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: telemetry
          path: "/ReeferTelemetrySet('{{container_id}}')"
          inputParameters:
            - name: container_id
              in: path
          operations:
            - name: get-reefer-telemetry
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.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.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Prepares for port state control inspections by gathering vessel certificates from SAP, compiling documents in SharePoint, notifying the captain via Microsoft Outlook, and alerting the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Port State Control Pipeline"
  description: "Prepares for port state control inspections by gathering vessel certificates from SAP, compiling documents in SharePoint, notifying the captain via Microsoft Outlook, and alerting the compliance team via Microsoft Teams."
  tags:
    - compliance
    - regulatory
    - maritime
    - sap
    - sharepoint
    - microsoft-outlook
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: psc-preparation
      port: 8080
      tools:
        - name: prepare-psc-inspection
          description: "Prepare for port state control inspection."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: port_code
              in: body
              type: string
              description: "The inspection port."
          steps:
            - name: gather-certificates
              type: call
              call: "sap.get-vessel-certs"
              with:
                vessel: "{{vessel_id}}"
            - name: compile-documents
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "marine_compliance"
                file_path: "PSC/{{vessel_id}}_{{port_code}}_docs.pdf"
            - name: notify-captain
              type: call
              call: "outlook.send-email"
              with:
                to: "{{gather-certificates.captainEmail}}"
                subject: "PSC Inspection Preparation - {{port_code}}"
                body: "Port state control inspection expected at {{port_code}}. Document package: {{compile-documents.url}}. Expiring certificates: {{gather-certificates.expiringCount}}."
            - name: alert-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "marine-compliance"
                text: "PSC prep for {{vessel_id}} at {{port_code}}. Certificates: {{gather-certificates.totalCerts}} valid, {{gather-certificates.expiringCount}} expiring soon."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_MARINE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves a customer account from Salesforce by account ID, returning company name, contract status, volume tier, and primary contact.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Lookup"
  description: "Retrieves a customer account from Salesforce by account ID, returning company name, contract status, volume tier, and primary contact."
  tags:
    - sales
    - crm
    - salesforce
    - customer
capability:
  exposes:
    - type: mcp
      namespace: crm-accounts
      port: 8080
      tools:
        - name: get-customer-account
          description: "Look up a Salesforce customer account by ID. Returns company name, contract status, volume tier, and contact."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.Name"
            - name: contract_status
              type: string
              mapping: "$.Contract_Status__c"
            - name: volume_tier
              type: string
              mapping: "$.Volume_Tier__c"
            - name: primary_contact
              type: string
              mapping: "$.Primary_Contact__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hapag-lloyd.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

When a SAP Ariba requisition exceeds a spend threshold, routes for approval via Workday manager lookup and notifies the requestor in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Requisition Approval Pipeline"
  description: "When a SAP Ariba requisition exceeds a spend threshold, routes for approval via Workday manager lookup and notifies the requestor in Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-approval
      port: 8080
      tools:
        - name: route-requisition-approval
          description: "Route a SAP Ariba requisition for manager approval and notify the requestor."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: "ariba.get-requisition"
              with:
                req_id: "{{requisition_id}}"
            - name: get-manager
              type: call
              call: "workday.get-manager"
              with:
                worker_id: "{{get-requisition.requestor_id}}"
            - name: notify-requestor
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-requisition.requestor_email}}"
                text: "Your requisition {{requisition_id}} ({{get-requisition.total_amount}} {{get-requisition.currency}}) has been routed to {{get-manager.full_name}} for approval."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{req_id}}"
          inputParameters:
            - name: req_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: managers
          path: "/workers/{{worker_id}}/manager"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-manager
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves key shipping performance indicators from SAP BW including on-time delivery rate, average transit time, and TEU throughput.

naftiko: "0.5"
info:
  label: "SAP BW Shipping KPI Extractor"
  description: "Retrieves key shipping performance indicators from SAP BW including on-time delivery rate, average transit time, and TEU throughput."
  tags:
    - analytics
    - sap-bw
    - kpi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: shipping-kpis
      port: 8080
      tools:
        - name: get-shipping-kpis
          description: "Extract shipping KPIs from SAP BW for a given period."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g. 2026-Q1)."
          call: "sapbw.get-kpis"
          with:
            period: "{{period}}"
          outputParameters:
            - name: on_time_rate
              type: string
              mapping: "$.d.OnTimeDeliveryRate"
            - name: avg_transit_days
              type: string
              mapping: "$.d.AvgTransitDays"
            - name: teu_throughput
              type: integer
              mapping: "$.d.TEUThroughput"
  consumes:
    - type: http
      namespace: sapbw
      baseUri: "https://hapag-lloyd-bw.sap.com/sap/opu/odata/sap/ZSH_KPI_BW_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_bw_user"
        password: "$secrets.sap_bw_password"
      resources:
        - name: kpis
          path: "/ShippingKPISet('{{period}}')"
          inputParameters:
            - name: period
              in: path
          operations:
            - name: get-kpis
              method: GET

Retrieves a travel expense report from SAP Concur, validates against Workday employee data, and creates a Jira approval task for out-of-policy expenses.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Processor"
  description: "Retrieves a travel expense report from SAP Concur, validates against Workday employee data, and creates a Jira approval task for out-of-policy expenses."
  tags:
    - finance
    - travel
    - sap-concur
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: travel-expenses
      port: 8080
      tools:
        - name: process-expense-report
          description: "Validate a Concur expense report and route out-of-policy items for approval."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-report.employee_id}}"
            - name: create-approval
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FIN"
                summary: "Expense review: {{get-employee.full_name}} - {{get-report.total_amount}} {{get-report.currency}}"
                issue_type: "Task"
                description: "Expense report {{report_id}} from {{get-employee.full_name}} ({{get-employee.department}}). Total: {{get-report.total_amount}} {{get-report.currency}}. Out-of-policy items: {{get-report.flagged_count}}."
  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-expense-report
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.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

Looks up goods receipt status for a purchase order in SAP.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Status"
  description: "Looks up goods receipt status for a purchase order in SAP."
  tags:
    - procurement
    - sap
    - goods-receipt
capability:
  exposes:
    - type: mcp
      namespace: procurement-gr
      port: 8080
      tools:
        - name: get-goods-receipt
          description: "Check goods receipt status for a SAP purchase order."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
          call: "sap.get-gr-status"
          with:
            po_id: "{{po_number}}"
          outputParameters:
            - name: receipt_date
              type: string
              mapping: "$.d.ReceiptDate"
            - name: status
              type: string
              mapping: "$.d.Status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZMM_GR_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-receipts
          path: "/GoodsReceiptSet('{{po_id}}')"
          inputParameters:
            - name: po_id
              in: path
          operations:
            - name: get-gr-status
              method: GET

Runs a cargo volume analytics query against SAP HANA and returns aggregated TEU counts by trade lane and period.

naftiko: "0.5"
info:
  label: "SAP HANA Cargo Analytics Query"
  description: "Runs a cargo volume analytics query against SAP HANA and returns aggregated TEU counts by trade lane and period."
  tags:
    - analytics
    - sap-hana
    - cargo
capability:
  exposes:
    - type: mcp
      namespace: cargo-analytics
      port: 8080
      tools:
        - name: query-cargo-volume
          description: "Query SAP HANA for cargo volume by trade lane and time period."
          inputParameters:
            - name: trade_lane
              in: body
              type: string
              description: "The trade lane code (e.g. ASIA-EUR, TPAC)."
            - name: period
              in: body
              type: string
              description: "The period in YYYY-MM format."
          call: "saphana.query-volume"
          with:
            trade_lane: "{{trade_lane}}"
            period: "{{period}}"
          outputParameters:
            - name: total_teu
              type: integer
              mapping: "$.d.results[0].TotalTEU"
            - name: full_containers
              type: integer
              mapping: "$.d.results[0].FullContainers"
            - name: empty_containers
              type: integer
              mapping: "$.d.results[0].EmptyContainers"
  consumes:
    - type: http
      namespace: saphana
      baseUri: "https://hapag-lloyd-hana.sap.com/sap/opu/odata/sap/ZSH_CARGO_ANALYTICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_hana_user"
        password: "$secrets.sap_hana_password"
      resources:
        - name: volumes
          path: "/CargoVolumeSet(TradeLane='{{trade_lane}}',Period='{{period}}')"
          inputParameters:
            - name: trade_lane
              in: path
            - name: period
              in: path
          operations:
            - name: query-volume
              method: GET

Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date for procurement visibility.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date for procurement visibility."
  tags:
    - procurement
    - sap
    - purchase-order
    - finance
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns status, vendor, value, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Synchronizes transport management orders between SAP TM and operational systems, validates routes, updates the logistics dashboard in Power BI, and notifies planners via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Transport Management Order Sync"
  description: "Synchronizes transport management orders between SAP TM and operational systems, validates routes, updates the logistics dashboard in Power BI, and notifies planners via Microsoft Teams."
  tags:
    - logistics
    - sap
    - transport-management
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tm-order-sync
      port: 8080
      tools:
        - name: sync-transport-orders
          description: "Synchronize SAP transport management orders."
          inputParameters:
            - name: tm_order_id
              in: body
              type: string
              description: "The SAP TM order ID."
          steps:
            - name: get-tm-order
              type: call
              call: "sap.get-tm-order"
              with:
                order_id: "{{tm_order_id}}"
            - name: validate-route
              type: call
              call: "routing.validate-route"
              with:
                origin: "{{get-tm-order.origin}}"
                destination: "{{get-tm-order.destination}}"
                mode: "{{get-tm-order.transportMode}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "logistics_dashboard"
            - name: notify-planners
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "logistics-planning"
                text: "TM order {{tm_order_id}} synced. Route: {{get-tm-order.origin}} to {{get-tm-order.destination}}. Mode: {{get-tm-order.transportMode}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZTM_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: routing
      baseUri: "https://hapag-lloyd-routing.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.routing_token"
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves vendor master data from SAP by vendor number.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP by vendor number."
  tags:
    - procurement
    - sap
    - vendor
capability:
  exposes:
    - type: mcp
      namespace: procurement-vendor
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up vendor master data in SAP."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: "sap.get-vendor"
          with:
            vendor_id: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.VendorName"
            - name: country
              type: string
              mapping: "$.d.Country"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZMM_VENDOR_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/VendorSet('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Retrieves a ServiceNow incident by number, returning its state, priority, assigned group, and last update timestamp.

naftiko: "0.5"
info:
  label: "ServiceNow Ticket Status"
  description: "Retrieves a ServiceNow incident by number, returning its state, priority, assigned group, and last update timestamp."
  tags:
    - it-service
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: itsm-tickets
      port: 8080
      tools:
        - name: get-ticket-status
          description: "Look up a ServiceNow incident by number and return its current state and assignment."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g. INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result[0].state"
            - name: priority
              type: string
              mapping: "$.result[0].priority"
            - name: assigned_group
              type: string
              mapping: "$.result[0].assignment_group.display_value"
            - name: updated_on
              type: string
              mapping: "$.result[0].sys_updated_on"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.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: path
          operations:
            - name: get-incident
              method: GET

Retrieves a document from a SharePoint site by path and returns the download URL and metadata.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves a document from a SharePoint site by path and returns the download URL and metadata."
  tags:
    - document-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-management
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a document from SharePoint by site and path."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: file_path
              in: body
              type: string
              description: "The file path within the document library."
          call: "sharepoint.get-file-metadata"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
          outputParameters:
            - name: download_url
              type: string
              mapping: "$.['@microsoft.graph.downloadUrl']"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
            - name: size_bytes
              type: integer
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file-metadata
              method: GET

When a vessel delay is detected, updates the shipment status in SAP, notifies affected customers via Microsoft Outlook, and posts an alert to the operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Shipment Delay Notification Pipeline"
  description: "When a vessel delay is detected, updates the shipment status in SAP, notifies affected customers via Microsoft Outlook, and posts an alert to the operations Microsoft Teams channel."
  tags:
    - shipping
    - delay
    - sap
    - microsoft-outlook
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: delay-notification
      port: 8080
      tools:
        - name: handle-shipment-delay
          description: "Process a shipment delay notification."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: new_eta
              in: body
              type: string
              description: "The revised ETA."
          steps:
            - name: get-affected-shipments
              type: call
              call: "sap.get-vessel-shipments"
              with:
                vessel: "{{vessel_id}}"
            - name: update-eta
              type: call
              call: "sap.update-shipment-eta"
              with:
                vessel: "{{vessel_id}}"
                eta: "{{new_eta}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "operations-alerts"
                text: "Vessel {{vessel_id}} delayed. New ETA: {{new_eta}}. Affected shipments: {{get-affected-shipments.count}}."
            - name: email-customers
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-affected-shipments.customerEmails}}"
                subject: "Shipment Delay Notification - Vessel {{vessel_id}}"
                body: "Your shipment has been delayed. Revised ETA: {{new_eta}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Checks the status of shipping documents like bill of lading and manifest in SAP.

naftiko: "0.5"
info:
  label: "Shipping Document Status Lookup"
  description: "Checks the status of shipping documents like bill of lading and manifest in SAP."
  tags:
    - shipping
    - documentation
    - sap
capability:
  exposes:
    - type: mcp
      namespace: shipping-docs
      port: 8080
      tools:
        - name: get-doc-status
          description: "Look up the status of shipping documents for a booking."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "The booking reference number."
          call: "sap.get-doc-status"
          with:
            booking_id: "{{booking_ref}}"
          outputParameters:
            - name: bl_status
              type: string
              mapping: "$.d.BLStatus"
            - name: manifest_status
              type: string
              mapping: "$.d.ManifestStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_DOC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: documents
          path: "/DocumentSet('{{booking_id}}')"
          inputParameters:
            - name: booking_id
              in: path
          operations:
            - name: get-doc-status
              method: GET

When a new supplier invoice arrives in SAP, matches it against the purchase order, creates a Jira approval task if there is a variance, and notifies finance via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Invoice Processor"
  description: "When a new supplier invoice arrives in SAP, matches it against the purchase order, creates a Jira approval task if there is a variance, and notifies finance via Microsoft Teams."
  tags:
    - finance
    - invoicing
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: invoice-processing
      port: 8080
      tools:
        - name: process-invoice
          description: "Match a supplier invoice against its PO and route for approval if variance is detected."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
            - name: po_number
              in: body
              type: string
              description: "The related purchase order number."
          steps:
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FIN"
                summary: "Invoice variance: {{invoice_number}} vs PO {{po_number}}"
                issue_type: "Task"
                description: "Invoice amount: {{get-invoice.total_amount}} {{get-invoice.currency}}. PO amount: {{get-po.TotalAmount}}. Variance requires approval."
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "finance-approvals"
                text: "Invoice {{invoice_number}} for PO {{po_number}} requires approval. Jira: {{create-approval.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://hapag-lloyd.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.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Synchronizes end-to-end supply chain visibility by pulling shipment data from SAP, aggregating metrics in Teradata, refreshing the Qlik Sense dashboard, and alerting stakeholders via Microsoft Teams on exceptions.

naftiko: "0.5"
info:
  label: "Supply Chain Visibility Dashboard Sync"
  description: "Synchronizes end-to-end supply chain visibility by pulling shipment data from SAP, aggregating metrics in Teradata, refreshing the Qlik Sense dashboard, and alerting stakeholders via Microsoft Teams on exceptions."
  tags:
    - supply-chain
    - visibility
    - sap
    - teradata
    - qlik-sense
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sc-visibility
      port: 8080
      tools:
        - name: sync-visibility-dashboard
          description: "Sync supply chain visibility dashboard."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The region to sync."
          steps:
            - name: pull-shipment-data
              type: call
              call: "sap.get-regional-shipments"
              with:
                region: "{{region}}"
            - name: aggregate-metrics
              type: call
              call: "teradata.execute-query"
              with:
                query: "CALL sp_refresh_sc_metrics('{{region}}')"
            - name: refresh-dashboard
              type: call
              call: "qlik.reload-app"
              with:
                app_id: "sc_visibility_{{region}}"
            - name: alert-exceptions
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supply-chain-ops"
                text: "SC visibility updated for {{region}}. Active shipments: {{pull-shipment-data.activeCount}}. Exceptions: {{pull-shipment-data.exceptionCount}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: teradata
      baseUri: "https://hapag-lloyd-teradata.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.teradata_token"
    - type: http
      namespace: qlik
      baseUri: "https://hapag-lloyd.eu.qlikcloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Pulls vessel emissions data from SAP, enriches with voyage details, and publishes a sustainability report to Confluence and notifies ESG stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sustainability Emissions Report"
  description: "Pulls vessel emissions data from SAP, enriches with voyage details, and publishes a sustainability report to Confluence and notifies ESG stakeholders via Microsoft Teams."
  tags:
    - sustainability
    - emissions
    - sap
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability-reporting
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Generate a vessel emissions report and publish to Confluence."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "The SAP voyage ID."
          steps:
            - name: get-emissions
              type: call
              call: "sap.get-emissions"
              with:
                voyage_id: "{{voyage_id}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "ESG"
                title: "Emissions Report: Voyage {{voyage_id}}"
                body: "CO2: {{get-emissions.co2_tonnes}} tonnes. SOx: {{get-emissions.sox_tonnes}} tonnes. NOx: {{get-emissions.nox_tonnes}} tonnes. Fuel consumed: {{get-emissions.fuel_mt}} MT."
            - name: notify-esg
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "esg-reporting"
                text: "Emissions report published for voyage {{voyage_id}}. CO2: {{get-emissions.co2_tonnes}}t. Report: {{publish-report.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_EMISSIONS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: emissions
          path: "/EmissionsSet('{{voyage_id}}')"
          inputParameters:
            - name: voyage_id
              in: path
          operations:
            - name: get-emissions
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://hapag-lloyd.atlassian.net/wiki/api/v2"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/pages"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries the Teradata cargo data warehouse for historical shipment volumes by trade lane and returns trend data.

naftiko: "0.5"
info:
  label: "Teradata Cargo Data Warehouse Query"
  description: "Queries the Teradata cargo data warehouse for historical shipment volumes by trade lane and returns trend data."
  tags:
    - analytics
    - data-warehouse
    - teradata
capability:
  exposes:
    - type: mcp
      namespace: cargo-dwh
      port: 8080
      tools:
        - name: query-cargo-trends
          description: "Query Teradata for historical cargo volume trends."
          inputParameters:
            - name: trade_lane
              in: body
              type: string
              description: "The trade lane code."
            - name: start_date
              in: body
              type: string
              description: "Start date for the trend query (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "End date for the trend query (YYYY-MM-DD)."
          call: "teradata.query-volumes"
          with:
            trade_lane: "{{trade_lane}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: data_points
              type: array
              mapping: "$.results"
            - name: total_teu
              type: integer
              mapping: "$.summary.total_teu"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://hapag-lloyd-td.teradata.com/api/query/v1"
      authentication:
        type: bearer
        token: "$secrets.teradata_token"
      resources:
        - name: queries
          path: "/execute"
          operations:
            - name: query-volumes
              method: POST

Optimizes terminal berth allocation by analyzing vessel arrival times, coordinating with terminal operators, updating SAP schedules, and notifying operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terminal Berth Allocation Optimizer"
  description: "Optimizes terminal berth allocation by analyzing vessel arrival times, coordinating with terminal operators, updating SAP schedules, and notifying operations via Microsoft Teams."
  tags:
    - shipping
    - terminal
    - optimization
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: berth-allocation
      port: 8080
      tools:
        - name: optimize-berth-allocation
          description: "Optimize terminal berth allocation."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "The terminal facility code."
            - name: date_range
              in: body
              type: string
              description: "The date range for optimization."
          steps:
            - name: get-vessel-arrivals
              type: call
              call: "sap.get-terminal-arrivals"
              with:
                terminal: "{{terminal_code}}"
                dates: "{{date_range}}"
            - name: optimize-berths
              type: call
              call: "optimization.allocate-berths"
              with:
                arrivals: "{{get-vessel-arrivals.vesselList}}"
                capacity: "{{get-vessel-arrivals.berthCount}}"
            - name: update-schedules
              type: call
              call: "sap.update-berth-assignments"
              with:
                terminal: "{{terminal_code}}"
                assignments: "{{optimize-berths.allocation}}"
            - name: notify-operations
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "terminal-operations"
                text: "Berth allocation optimized for {{terminal_code}}. Period: {{date_range}}. Vessels: {{get-vessel-arrivals.count}}. Utilization: {{optimize-berths.utilization}}%."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_TERMINAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: optimization
      baseUri: "https://hapag-lloyd-optimization.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.optimization_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Screens bookings against sanctioned entities, validates export licenses, stores compliance records in SharePoint, and escalates flagged items via ServiceNow.

naftiko: "0.5"
info:
  label: "Trade Compliance Screening Pipeline"
  description: "Screens bookings against sanctioned entities, validates export licenses, stores compliance records in SharePoint, and escalates flagged items via ServiceNow."
  tags:
    - compliance
    - sanctions
    - trade
    - sharepoint
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: trade-compliance
      port: 8080
      tools:
        - name: screen-trade-compliance
          description: "Screen bookings for trade compliance."
          inputParameters:
            - name: booking_ref
              in: body
              type: string
              description: "The booking reference."
            - name: shipper_name
              in: body
              type: string
              description: "The shipper entity name."
          steps:
            - name: screen-sanctions
              type: call
              call: "compliance.screen-entity"
              with:
                name: "{{shipper_name}}"
                booking: "{{booking_ref}}"
            - name: validate-license
              type: call
              call: "compliance.check-export-license"
              with:
                booking: "{{booking_ref}}"
            - name: store-record
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "compliance_site"
                file_path: "Screening/{{booking_ref}}_screening.pdf"
            - name: escalate-if-flagged
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Trade compliance flag: {{booking_ref}}"
                description: "Booking {{booking_ref}} flagged. Shipper: {{shipper_name}}. Score: {{screen-sanctions.riskScore}}."
  consumes:
    - type: http
      namespace: compliance
      baseUri: "https://hapag-lloyd-compliance.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: servicenow
      baseUri: "https://hapag-lloyd.service-now.com/api/now/table/incident"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"

Combines SAP shipping data with Google Analytics web traffic for a trade lane, pushes consolidated metrics to Power BI, and posts a weekly summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Lane Performance Analyzer"
  description: "Combines SAP shipping data with Google Analytics web traffic for a trade lane, pushes consolidated metrics to Power BI, and posts a weekly summary to Microsoft Teams."
  tags:
    - analytics
    - trade-lane
    - sap
    - google-analytics
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade-lane-analysis
      port: 8080
      tools:
        - name: analyze-trade-lane
          description: "Analyze trade lane performance by combining shipping and web analytics data."
          inputParameters:
            - name: trade_lane
              in: body
              type: string
              description: "The trade lane code."
            - name: period
              in: body
              type: string
              description: "The analysis period."
          steps:
            - name: get-shipping-data
              type: call
              call: "sap.get-trade-lane-metrics"
              with:
                trade_lane: "{{trade_lane}}"
                period: "{{period}}"
            - name: get-web-traffic
              type: call
              call: "ga.get-trade-lane-traffic"
              with:
                trade_lane: "{{trade_lane}}"
            - name: push-to-bi
              type: call
              call: "powerbi.push-rows"
              with:
                dataset_id: "trade_lane_ds"
                table_name: "Performance"
                rows:
                  - trade_lane: "{{trade_lane}}"
                    teu_volume: "{{get-shipping-data.teu_volume}}"
                    on_time_pct: "{{get-shipping-data.on_time_pct}}"
                    web_inquiries: "{{get-web-traffic.inquiry_count}}"
            - name: post-summary
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "trade-lane-ops"
                text: "Trade lane {{trade_lane}} ({{period}}): {{get-shipping-data.teu_volume}} TEU, {{get-shipping-data.on_time_pct}}% on-time, {{get-web-traffic.inquiry_count}} web inquiries."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_TRADE_LANE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: trade-lanes
          path: "/TradeLaneMetricSet(TradeLane='{{trade_lane}}',Period='{{period}}')"
          inputParameters:
            - name: trade_lane
              in: path
            - name: period
              in: path
          operations:
            - name: get-trade-lane-metrics
              method: GET
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: get-trade-lane-traffic
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Routes vendor invoices through approval workflow in SAP, validates against purchase orders, posts to the finance Microsoft Teams channel, and archives in Box.

naftiko: "0.5"
info:
  label: "Vendor Payment Approval Pipeline"
  description: "Routes vendor invoices through approval workflow in SAP, validates against purchase orders, posts to the finance Microsoft Teams channel, and archives in Box."
  tags:
    - procurement
    - finance
    - sap
    - microsoft-teams
    - box
capability:
  exposes:
    - type: mcp
      namespace: vendor-payment
      port: 8080
      tools:
        - name: approve-vendor-payment
          description: "Process vendor payment approval."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The vendor invoice number."
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
          steps:
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice: "{{invoice_number}}"
                vendor: "{{vendor_id}}"
            - name: validate-po-match
              type: call
              call: "sap.match-po"
              with:
                invoice: "{{invoice_number}}"
                po: "{{get-invoice.poNumber}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "finance-approvals"
                text: "Invoice {{invoice_number}} from {{get-invoice.vendorName}} for {{get-invoice.amount}} {{get-invoice.currency}} matched to PO {{get-invoice.poNumber}}."
            - name: archive-invoice
              type: call
              call: "box.upload-file"
              with:
                folder_id: "vendor_invoices"
                filename: "{{invoice_number}}.pdf"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZFI_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"

Retrieves current bunker fuel consumption metrics for a vessel from the fleet management system.

naftiko: "0.5"
info:
  label: "Vessel Bunker Consumption Lookup"
  description: "Retrieves current bunker fuel consumption metrics for a vessel from the fleet management system."
  tags:
    - shipping
    - fleet
    - bunker
capability:
  exposes:
    - type: mcp
      namespace: fleet-management
      port: 8080
      tools:
        - name: get-bunker-consumption
          description: "Look up bunker fuel consumption for a specific vessel."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The IMO number of the vessel."
          call: "fleet.get-bunker"
          with:
            vessel: "{{vessel_id}}"
          outputParameters:
            - name: daily_consumption
              type: number
              mapping: "$.dailyConsumption"
            - name: fuel_type
              type: string
              mapping: "$.fuelType"
  consumes:
    - type: http
      namespace: fleet
      baseUri: "https://hapag-lloyd-fleet.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fleet_token"
      resources:
        - name: vessel-bunker
          path: "/vessels/{{vessel}}/bunker"
          inputParameters:
            - name: vessel
              in: path
          operations:
            - name: get-bunker
              method: GET

Plans crew rotations by checking certification status in SAP, booking travel via SAP Concur, notifying crew via Microsoft Outlook, and updating the crew management dashboard in Google Sheets.

naftiko: "0.5"
info:
  label: "Vessel Crew Rotation Planner"
  description: "Plans crew rotations by checking certification status in SAP, booking travel via SAP Concur, notifying crew via Microsoft Outlook, and updating the crew management dashboard in Google Sheets."
  tags:
    - maritime
    - crew
    - sap
    - sap-concur
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: crew-rotation
      port: 8080
      tools:
        - name: plan-crew-rotation
          description: "Plan vessel crew rotation."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: rotation_date
              in: body
              type: string
              description: "The planned rotation date."
          steps:
            - name: get-crew-status
              type: call
              call: "sap.get-crew-certs"
              with:
                vessel: "{{vessel_id}}"
            - name: book-travel
              type: call
              call: "concur.create-trip"
              with:
                travelers: "{{get-crew-status.rotatingCrew}}"
                date: "{{rotation_date}}"
                destination: "{{get-crew-status.nextPort}}"
            - name: notify-crew
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-crew-status.crewEmails}}"
                subject: "Crew Rotation - {{vessel_id}} - {{rotation_date}}"
                body: "Your rotation is scheduled for {{rotation_date}} at {{get-crew-status.nextPort}}. Travel booking: {{book-travel.itineraryRef}}."
            - name: update-dashboard
              type: call
              call: "gsheets.update-range"
              with:
                spreadsheet_id: "crew_dashboard"
                range: "Rotations!A2"
                values: "{{vessel_id}},{{rotation_date}},{{get-crew-status.rotatingCount}},{{book-travel.itineraryRef}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_CREW_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_token"

Manages vessel bunker fuel procurement by getting consumption forecasts from SAP, sourcing quotes from suppliers, placing orders, and notifying the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vessel Fuel Procurement Pipeline"
  description: "Manages vessel bunker fuel procurement by getting consumption forecasts from SAP, sourcing quotes from suppliers, placing orders, and notifying the procurement team via Microsoft Teams."
  tags:
    - procurement
    - bunker
    - fuel
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fuel-procurement
      port: 8080
      tools:
        - name: procure-bunker-fuel
          description: "Manage bunker fuel procurement."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: port_code
              in: body
              type: string
              description: "The bunkering port."
          steps:
            - name: get-forecast
              type: call
              call: "sap.get-fuel-forecast"
              with:
                vessel: "{{vessel_id}}"
            - name: source-quotes
              type: call
              call: "procurement.get-bunker-quotes"
              with:
                port: "{{port_code}}"
                quantity: "{{get-forecast.requiredTonnes}}"
                fuel_type: "{{get-forecast.fuelType}}"
            - name: place-order
              type: call
              call: "sap.create-bunker-po"
              with:
                vessel: "{{vessel_id}}"
                supplier: "{{source-quotes.bestSupplier}}"
                quantity: "{{get-forecast.requiredTonnes}}"
                price: "{{source-quotes.bestPrice}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement-bunker"
                text: "Bunker order placed for {{vessel_id}} at {{port_code}}. Quantity: {{get-forecast.requiredTonnes}} MT. Supplier: {{source-quotes.bestSupplier}}. Price: {{source-quotes.bestPrice}}/MT."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZMM_BUNKER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: procurement
      baseUri: "https://hapag-lloyd-procurement.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

When a vessel schedule changes, updates all affected bookings in SAP, refreshes the Google Sheets operational dashboard, and notifies the planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vessel Schedule Change Propagator"
  description: "When a vessel schedule changes, updates all affected bookings in SAP, refreshes the Google Sheets operational dashboard, and notifies the planning team via Microsoft Teams."
  tags:
    - shipping
    - schedule
    - sap
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: schedule-change
      port: 8080
      tools:
        - name: propagate-schedule-change
          description: "Propagate vessel schedule changes across systems."
          inputParameters:
            - name: vessel_id
              in: body
              type: string
              description: "The vessel IMO number."
            - name: new_schedule
              in: body
              type: string
              description: "The updated schedule JSON."
          steps:
            - name: update-bookings
              type: call
              call: "sap.batch-update-schedule"
              with:
                vessel: "{{vessel_id}}"
                schedule: "{{new_schedule}}"
            - name: refresh-dashboard
              type: call
              call: "gsheets.update-range"
              with:
                spreadsheet_id: "ops_dashboard"
                range: "Schedules!A2"
                values: "{{update-bookings.summary}}"
            - name: notify-planning
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "planning-team"
                text: "Vessel {{vessel_id}} schedule updated. {{update-bookings.affectedCount}} bookings modified."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_SCHEDULE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_token"
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"

Retrieves the current vessel schedule from SAP by vessel code, returning port rotation, ETAs, and cargo load percentages.

naftiko: "0.5"
info:
  label: "Vessel Schedule Lookup"
  description: "Retrieves the current vessel schedule from SAP by vessel code, returning port rotation, ETAs, and cargo load percentages."
  tags:
    - shipping
    - vessel
    - sap
    - schedule
capability:
  exposes:
    - type: mcp
      namespace: vessel-schedule
      port: 8080
      tools:
        - name: get-vessel-schedule
          description: "Look up a vessel schedule by vessel code. Returns port rotation with ETAs and cargo utilization."
          inputParameters:
            - name: vessel_code
              in: body
              type: string
              description: "The IMO vessel code."
          call: "sap.get-vessel-schedule"
          with:
            vessel_code: "{{vessel_code}}"
          outputParameters:
            - name: vessel_name
              type: string
              mapping: "$.d.VesselName"
            - name: port_rotation
              type: array
              mapping: "$.d.PortRotation.results"
            - name: utilization_pct
              type: string
              mapping: "$.d.CargoUtilization"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_VESSEL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vessels
          path: "/VesselScheduleSet('{{vessel_code}}')"
          inputParameters:
            - name: vessel_code
              in: path
          operations:
            - name: get-vessel-schedule
              method: GET

Pulls voyage cost actuals from SAP, compares against budget in Microsoft Excel via SharePoint, and posts a variance summary to a Confluence page.

naftiko: "0.5"
info:
  label: "Voyage Cost Reconciliation"
  description: "Pulls voyage cost actuals from SAP, compares against budget in Microsoft Excel via SharePoint, and posts a variance summary to a Confluence page."
  tags:
    - finance
    - voyage-cost
    - sap
    - sharepoint
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: voyage-costs
      port: 8080
      tools:
        - name: reconcile-voyage-costs
          description: "Compare actual voyage costs from SAP against budget and publish a variance report to Confluence."
          inputParameters:
            - name: voyage_id
              in: body
              type: string
              description: "The SAP voyage identifier."
          steps:
            - name: get-actuals
              type: call
              call: "sap.get-voyage-costs"
              with:
                voyage_id: "{{voyage_id}}"
            - name: get-budget
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "finance_site"
                file_path: "VoyageBudgets/{{voyage_id}}_budget.xlsx"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "FIN"
                title: "Voyage Cost Reconciliation: {{voyage_id}}"
                body: "Actual fuel: {{get-actuals.fuel_cost}}. Actual port: {{get-actuals.port_cost}}. Total actual: {{get-actuals.total_cost}}. Budget: {{get-budget.total_budget}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hapag-lloyd-s4.sap.com/sap/opu/odata/sap/ZSH_VOYAGE_COST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: voyage-costs
          path: "/VoyageCostSet('{{voyage_id}}')"
          inputParameters:
            - name: voyage_id
              in: path
          operations:
            - name: get-voyage-costs
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://hapag-lloyd.atlassian.net/wiki/api/v2"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/pages"
          operations:
            - name: create-page
              method: POST

Calculates warehouse storage fees based on container dwell time and location.

naftiko: "0.5"
info:
  label: "Warehouse Storage Fee Calculator"
  description: "Calculates warehouse storage fees based on container dwell time and location."
  tags:
    - logistics
    - warehouse
    - fees
capability:
  exposes:
    - type: mcp
      namespace: warehouse-fees
      port: 8080
      tools:
        - name: calculate-storage-fee
          description: "Calculate storage fees for containers at a warehouse."
          inputParameters:
            - name: container_number
              in: body
              type: string
              description: "The container number."
            - name: warehouse_code
              in: body
              type: string
              description: "The warehouse facility code."
          call: "warehouse.calc-fee"
          with:
            container: "{{container_number}}"
            warehouse: "{{warehouse_code}}"
          outputParameters:
            - name: daily_rate
              type: number
              mapping: "$.dailyRate"
            - name: total_days
              type: integer
              mapping: "$.totalDays"
            - name: total_fee
              type: number
              mapping: "$.totalFee"
  consumes:
    - type: http
      namespace: warehouse
      baseUri: "https://hapag-lloyd-warehouse.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.warehouse_token"
      resources:
        - name: fee-calculator
          path: "/fees/calculate"
          inputParameters:
            - name: container
              in: query
            - name: warehouse
              in: query
          operations:
            - name: calc-fee
              method: GET

Retrieves current headcount data from Workday by department and returns employee count, open positions, and turnover rate.

naftiko: "0.5"
info:
  label: "Workday Headcount Report"
  description: "Retrieves current headcount data from Workday by department and returns employee count, open positions, and turnover rate."
  tags:
    - hr
    - workforce
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount
          description: "Get headcount metrics for a department from Workday."
          inputParameters:
            - name: department_id
              in: body
              type: string
              description: "The Workday department ID."
          call: "workday.get-headcount"
          with:
            department_id: "{{department_id}}"
          outputParameters:
            - name: employee_count
              type: integer
              mapping: "$.total_count"
            - name: open_positions
              type: integer
              mapping: "$.open_positions"
            - name: turnover_rate
              type: string
              mapping: "$.turnover_rate"
  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: "/departments/{{department_id}}/headcount"
          inputParameters:
            - name: department_id
              in: path
          operations:
            - name: get-headcount
              method: GET

Creates a Zoom meeting for a given topic and participants, then sends calendar invites via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Zoom Meeting Scheduler"
  description: "Creates a Zoom meeting for a given topic and participants, then sends calendar invites via Microsoft Outlook."
  tags:
    - communications
    - meetings
    - zoom
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: meeting-scheduler
      port: 8080
      tools:
        - name: schedule-meeting
          description: "Create a Zoom meeting and send calendar invites."
          inputParameters:
            - name: topic
              in: body
              type: string
              description: "The meeting topic."
            - name: start_time
              in: body
              type: string
              description: "Start time in ISO 8601 format."
            - name: duration_minutes
              in: body
              type: integer
              description: "Meeting duration in minutes."
            - name: attendee_emails
              in: body
              type: array
              description: "List of attendee email addresses."
          steps:
            - name: create-meeting
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "{{topic}}"
                start_time: "{{start_time}}"
                duration: "{{duration_minutes}}"
            - name: send-invite
              type: call
              call: "outlook.send-email"
              with:
                to: "{{attendee_emails}}"
                subject: "Meeting: {{topic}}"
                body: "You are invited to a Zoom meeting. Topic: {{topic}}. Time: {{start_time}}. Join: {{create-meeting.join_url}}"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-email
              method: POST