Airbus Capabilities

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

Sort
Expand

Queries SAP SuccessFactors for employees with elevated system access and cross-checks Entra ID group memberships to identify access that needs recertification. Creates a Jira review task for each exception found and notifies the security team.

naftiko: "0.5"
info:
  label: "Access Certification Review"
  description: "Queries SAP SuccessFactors for employees with elevated system access and cross-checks Entra ID group memberships to identify access that needs recertification. Creates a Jira review task for each exception found and notifies the security team."
  tags:
    - security
    - identity
    - access-management
    - sap-successfactors
    - microsoft-entra
    - jira
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: run-access-certification
          description: "Given a role group name and business unit, retrieve Entra ID group members, validate against SuccessFactors job roles, and create Jira review tasks for any access mismatches. Use for quarterly access certification campaigns."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Entra ID group ID to certify (e.g., grp-airbus-erp-admin)."
            - name: business_unit
              in: body
              type: string
              description: "The Airbus business unit scope for the review."
          steps:
            - name: get-group-members
              type: call
              call: "entra-access.get-group-members"
              with:
                group_id: "{{group_id}}"
            - name: get-job-roles
              type: call
              call: "successfactors-access.get-job-roles"
              with:
                businessUnit: "{{business_unit}}"
            - name: create-review-task
              type: call
              call: "jira-access.create-issue"
              with:
                project_key: "SEC"
                summary: "Access certification review: {{group_id}}"
                description: "Review required for {{business_unit}} — {{get-group-members.member_count}} members to certify."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: entra-access
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: successfactors-access
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: job-roles
          path: "/EmpJob"
          inputParameters:
            - name: businessUnit
              in: query
          operations:
            - name: get-job-roles
              method: GET
    - type: http
      namespace: jira-access
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: description
              in: body
            - name: issue_type
              in: body
          operations:
            - name: create-issue
              method: POST

Fetches a regulatory or certification document from SharePoint, sends the text to Anthropic Claude for structured summarization, and posts the summary to a Confluence compliance page. Accelerates Airbus regulatory team review of EASA and FAA documents.

naftiko: "0.5"
info:
  label: "AI-Assisted Regulatory Document Summarization"
  description: "Fetches a regulatory or certification document from SharePoint, sends the text to Anthropic Claude for structured summarization, and posts the summary to a Confluence compliance page. Accelerates Airbus regulatory team review of EASA and FAA documents."
  tags:
    - ai
    - compliance
    - regulatory
    - anthropic
    - sharepoint
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ai
      port: 8080
      tools:
        - name: summarize-regulatory-document
          description: "Given a SharePoint document URL and compliance regulation reference, fetch the document content, send it to Anthropic Claude for structured summarization, and publish the result to Confluence. Use when regulatory staff need rapid comprehension of EASA, FAA, or ICAO documents."
          inputParameters:
            - name: sharepoint_file_url
              in: body
              type: string
              description: "The SharePoint file URL of the regulatory document to summarize."
            - name: regulation_reference
              in: body
              type: string
              description: "The regulatory reference code (e.g., EASA CS-25, FAA AC 25.629-1)."
            - name: confluence_space_key
              in: body
              type: string
              description: "The Confluence space key where the summary will be published."
          steps:
            - name: fetch-document
              type: call
              call: "sharepoint-reg.get-file-content"
              with:
                file_url: "{{sharepoint_file_url}}"
            - name: summarize-with-claude
              type: call
              call: "anthropic-reg.create-message"
              with:
                model: "claude-opus-4-5"
                max_tokens: 1024
                messages: "[{\"role\":\"user\",\"content\":\"Summarize this regulatory document for aerospace compliance: {{fetch-document.content}}\"}]"
            - name: publish-confluence-summary
              type: call
              call: "confluence-reg.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                title: "Regulatory Summary: {{regulation_reference}}"
                body: "{{summarize-with-claude.content}}"
  consumes:
    - type: http
      namespace: sharepoint-reg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: file-content
          path: "/sites/{{site_id}}/drive/root:/{{file_url}}:/content"
          inputParameters:
            - name: file_url
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: anthropic-reg
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: message
          path: "/messages"
          inputParameters:
            - name: model
              in: body
            - name: max_tokens
              in: body
            - name: messages
              in: body
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: confluence-reg
      baseUri: "https://airbus.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: page
          path: "/content"
          inputParameters:
            - name: space_key
              in: body
            - name: title
              in: body
            - name: body
              in: body
          operations:
            - name: create-page
              method: POST

When queried for an aircraft serial number, retrieves the delivery milestone status from SAP, checks the latest test flight report in Snowflake, and posts a summary to the program management Teams channel.

naftiko: "0.5"
info:
  label: "Aircraft Delivery Milestone Tracker"
  description: "When queried for an aircraft serial number, retrieves the delivery milestone status from SAP, checks the latest test flight report in Snowflake, and posts a summary to the program management Teams channel."
  tags:
    - aerospace
    - sap-s4hana
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: delivery
      port: 8080
      tools:
        - name: track-delivery-milestone
          description: "Given an aircraft serial number, orchestrate milestone retrieval from SAP, test flight data from Snowflake, and post a summary to Teams."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The aircraft serial number (MSN)."
          steps:
            - name: get-milestone
              type: call
              call: "sap-s4.get-milestone"
              with:
                serial_number: "{{serial_number}}"
            - name: get-test-flight
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT flight_date, result, hours FROM test_flights WHERE msn = '{{serial_number}}' ORDER BY flight_date DESC LIMIT 1"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "delivery-program"
                message: "MSN {{serial_number}} | Milestone: {{get-milestone.current_phase}} | Last test flight: {{get-test-flight.data[0].FLIGHT_DATE}} - {{get-test-flight.data[0].RESULT}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: milestones
          path: "/A_ProductionOrder_2?$filter=SerialNumber eq '{{serial_number}}'"
          inputParameters:
            - name: serial_number
              in: query
          operations:
            - name: get-milestone
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/delivery-program/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When a new airworthiness directive is issued, searches the compliance database in Snowflake, identifies affected fleet MSNs, and creates a tracking Jira epic for the engineering team.

naftiko: "0.5"
info:
  label: "Airworthiness Directive Compliance Check"
  description: "When a new airworthiness directive is issued, searches the compliance database in Snowflake, identifies affected fleet MSNs, and creates a tracking Jira epic for the engineering team."
  tags:
    - compliance
    - snowflake
    - jira
    - aerospace
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: check-ad-compliance
          description: "Given an AD reference number, identify affected aircraft and create a tracking epic."
          inputParameters:
            - name: ad_reference
              in: body
              type: string
              description: "The airworthiness directive reference number."
            - name: affected_type
              in: body
              type: string
              description: "The aircraft type designation (e.g., A320, A350)."
          steps:
            - name: find-affected-aircraft
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT msn, operator, delivery_date FROM fleet_registry WHERE aircraft_type = '{{affected_type}}' AND status = 'IN_SERVICE'"
            - name: create-epic
              type: call
              call: "jira.create-issue"
              with:
                project: "COMPLY"
                summary: "AD {{ad_reference}} compliance - {{affected_type}}"
                issuetype: "Epic"
                description: "Airworthiness directive {{ad_reference}} affects {{find-affected-aircraft.row_count}} in-service {{affected_type}} aircraft."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "airworthiness"
                message: "New AD {{ad_reference}} for {{affected_type}}. {{find-affected-aircraft.row_count}} aircraft affected. Tracking epic: {{create-epic.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.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: messages
          path: "/teams/airworthiness/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When Datadog detects API gateway rate limit breaches, retrieves the offending client details, creates a ServiceNow problem ticket, and alerts the API platform team via Slack.

naftiko: "0.5"
info:
  label: "API Gateway Rate Limit Breach Handler"
  description: "When Datadog detects API gateway rate limit breaches, retrieves the offending client details, creates a ServiceNow problem ticket, and alerts the API platform team via Slack."
  tags:
    - platform-engineering
    - datadog
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: platform
      port: 8080
      tools:
        - name: handle-rate-limit-breach
          description: "Given an API endpoint and client ID, investigate the breach, create a problem ticket, and alert the team."
          inputParameters:
            - name: api_endpoint
              in: body
              type: string
              description: "The API endpoint experiencing rate limit breaches."
            - name: client_id
              in: body
              type: string
              description: "The API client ID causing the breach."
          steps:
            - name: get-metrics
              type: call
              call: "datadog.get-api-metrics"
              with:
                query: "api.rate_limit.breaches{endpoint:{{api_endpoint}},client:{{client_id}}}"
            - name: create-problem
              type: call
              call: "servicenow.create-problem"
              with:
                short_description: "API rate limit breach: {{api_endpoint}} by client {{client_id}}"
                description: "Rate limit breaches detected. Peak rate: {{get-metrics.max_rate}}/min. Duration: {{get-metrics.breach_duration}}"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "api-platform"
                text: "Rate limit breach on {{api_endpoint}} by client {{client_id}}. Peak: {{get-metrics.max_rate}}/min. Problem: {{create-problem.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query?query={{query}}"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: get-api-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a supplier invoice is submitted via SAP Ariba, retrieves the matching purchase order from SAP S/4HANA, validates line-item amounts, and triggers approval or exception routing in Ariba. Streamlines three-way matching for Airbus procurement.

naftiko: "0.5"
info:
  label: "Ariba Invoice Approval Workflow"
  description: "When a supplier invoice is submitted via SAP Ariba, retrieves the matching purchase order from SAP S/4HANA, validates line-item amounts, and triggers approval or exception routing in Ariba. Streamlines three-way matching for Airbus procurement."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: ap-approval
      port: 8080
      tools:
        - name: process-ariba-invoice
          description: "Given an Ariba invoice ID and SAP PO number, retrieve both the invoice and the PO, validate amounts, and trigger Ariba approval or flag an exception. Use when a new supplier invoice requires three-way matching validation."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice ID to process."
            - name: po_number
              in: body
              type: string
              description: "The related SAP purchase order number for three-way matching."
          steps:
            - name: get-ariba-invoice
              type: call
              call: "sap-ariba-ap.get-invoice"
              with:
                invoiceId: "{{invoice_id}}"
            - name: get-sap-po
              type: call
              call: "sap-s4-ap.get-purchase-order"
              with:
                PurchaseOrder: "{{po_number}}"
            - name: approve-invoice
              type: call
              call: "sap-ariba-ap.approve-invoice"
              with:
                invoiceId: "{{invoice_id}}"
                status: "Approved"
  consumes:
    - type: http
      namespace: sap-ariba-ap
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: apikey
        key: "apiKey"
        value: "$secrets.ariba_api_key"
        placement: query
      resources:
        - name: invoice
          path: "/invoices/{{invoiceId}}"
          inputParameters:
            - name: invoiceId
              in: path
          operations:
            - name: get-invoice
              method: GET
            - name: approve-invoice
              method: PATCH
    - type: http
      namespace: sap-s4-ap
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: purchase-order
          path: "/A_PurchaseOrder('{{PurchaseOrder}}')"
          inputParameters:
            - name: PurchaseOrder
              in: path
          operations:
            - name: get-purchase-order
              method: GET

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

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status"
  description: "Retrieves the latest build status from Azure DevOps for a given pipeline, returning build result, duration, and triggered-by information."
  tags:
    - engineering
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: ci-cd
      port: 8080
      tools:
        - name: get-build-status
          description: "Given an Azure DevOps pipeline ID, retrieve the latest build status including result and duration."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline ID."
          call: "azdo.get-builds"
          with:
            definitions: "{{pipeline_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: triggered_by
              type: string
              mapping: "$.value[0].requestedFor.displayName"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/airbus/aerospace/_apis/build"
      authentication:
        type: basic
        username: "$secrets.azdo_user"
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/builds?definitions={{definitions}}&$top=1&api-version=7.0"
          inputParameters:
            - name: definitions
              in: query
          operations:
            - name: get-builds
              method: GET

Compiles carbon emissions data from Snowflake manufacturing metrics, generates a Power BI report refresh, and distributes the summary to the sustainability team via email.

naftiko: "0.5"
info:
  label: "Carbon Emissions Reporting Pipeline"
  description: "Compiles carbon emissions data from Snowflake manufacturing metrics, generates a Power BI report refresh, and distributes the summary to the sustainability team via email."
  tags:
    - sustainability
    - snowflake
    - power-bi
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a reporting period, compile emissions data, refresh the dashboard, and email the sustainability team."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
            - name: facility
              in: body
              type: string
              description: "Facility code or 'ALL' for company-wide."
          steps:
            - name: get-emissions-data
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT facility, scope, total_co2_tonnes FROM emissions_summary WHERE period = '{{period}}' AND (facility = '{{facility}}' OR '{{facility}}' = 'ALL')"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "sustainability-emissions"
            - name: email-report
              type: call
              call: "msgraph.send-mail"
              with:
                to: "sustainability@airbus.com"
                subject: "Carbon Emissions Report: {{period}} - {{facility}}"
                body: "Emissions data compiled for {{period}}. Facilities reported: {{get-emissions-data.row_count}}. Dashboard refresh status: {{refresh-dashboard.status}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

When Datadog detects a cloud spend anomaly above threshold, retrieves Azure cost details, creates a ServiceNow incident, and alerts the FinOps team in Microsoft Teams. Enables rapid cost containment for Airbus cloud operations.

naftiko: "0.5"
info:
  label: "Cloud FinOps Cost Anomaly Responder"
  description: "When Datadog detects a cloud spend anomaly above threshold, retrieves Azure cost details, creates a ServiceNow incident, and alerts the FinOps team in Microsoft Teams. Enables rapid cost containment for Airbus cloud operations."
  tags:
    - finops
    - cloud
    - datadog
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given a Datadog alert ID and Azure subscription ID, retrieve cost breakdown, open a ServiceNow incident, and notify the FinOps Teams channel. Use when cloud spend exceeds expected thresholds."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog monitor alert ID that triggered the anomaly."
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where cost anomaly was detected."
            - name: threshold_percent
              in: body
              type: number
              description: "The percentage over budget that triggered the alert."
          steps:
            - name: get-datadog-alert
              type: call
              call: "datadog-finops.get-alert"
              with:
                monitor_id: "{{alert_id}}"
            - name: get-azure-cost
              type: call
              call: "azure-cost.get-usage"
              with:
                subscriptionId: "{{subscription_id}}"
            - name: create-snow-incident
              type: call
              call: "servicenow-finops.create-incident"
              with:
                short_description: "Cloud cost anomaly: {{threshold_percent}}% over budget"
                category: "Cloud"
                urgency: "2"
            - name: notify-finops-team
              type: call
              call: "msteams-finops.send-message"
              with:
                channel_id: "finops-alerts"
                message: "Cost anomaly detected: {{threshold_percent}}% over budget on subscription {{subscription_id}}. Incident: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: datadog-finops
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: alert
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com/subscriptions"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: usage
          path: "/{{subscriptionId}}/providers/Microsoft.Consumption/usageDetails"
          inputParameters:
            - name: subscriptionId
              in: path
          operations:
            - name: get-usage
              method: GET
    - type: http
      namespace: servicenow-finops
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          inputParameters:
            - name: short_description
              in: body
            - name: category
              in: body
            - name: urgency
              in: body
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Traces composite material batches by retrieving batch records from SAP, pulling cure cycle data from Snowflake, and logging the traceability query in ServiceNow for regulatory compliance.

naftiko: "0.5"
info:
  label: "Composite Material Traceability Lookup"
  description: "Traces composite material batches by retrieving batch records from SAP, pulling cure cycle data from Snowflake, and logging the traceability query in ServiceNow for regulatory compliance."
  tags:
    - manufacturing
    - sap-s4hana
    - snowflake
    - servicenow
    - quality
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: trace-composite-batch
          description: "Given a batch number, retrieve the full material traceability chain including cure cycle data."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The composite material batch number."
          steps:
            - name: get-batch-record
              type: call
              call: "sap-s4.get-batch"
              with:
                Batch: "{{batch_number}}"
            - name: get-cure-data
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT cure_temp, cure_pressure, cure_duration, autoclave_id, operator FROM cure_cycles WHERE batch_number = '{{batch_number}}'"
            - name: log-query
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_traceability_log"
                batch: "{{batch_number}}"
                material: "{{get-batch-record.Material}}"
                cure_records: "{{get-cure-data.row_count}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: batches
          path: "/A_Batch('{{Batch}}')"
          inputParameters:
            - name: Batch
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Tracks aircraft configuration changes by pulling change history from SAP PLM, cross-referencing with Jira engineering tickets, and archiving the audit trail to SharePoint for regulatory purposes.

naftiko: "0.5"
info:
  label: "Configuration Management Audit Trail"
  description: "Tracks aircraft configuration changes by pulling change history from SAP PLM, cross-referencing with Jira engineering tickets, and archiving the audit trail to SharePoint for regulatory purposes."
  tags:
    - engineering
    - sap-s4hana
    - jira
    - sharepoint
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: config-mgmt
      port: 8080
      tools:
        - name: generate-config-audit-trail
          description: "Given an MSN and date range, compile configuration change history and archive the audit trail."
          inputParameters:
            - name: msn
              in: body
              type: string
              description: "The aircraft MSN."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD."
          steps:
            - name: get-config-changes
              type: call
              call: "sap-s4.get-change-records"
              with:
                SerialNumber: "{{msn}}"
                DateFrom: "{{date_from}}"
                DateTo: "{{date_to}}"
            - name: get-linked-tickets
              type: call
              call: "jira.search-issues"
              with:
                jql: "labels = 'MSN-{{msn}}' AND updated >= '{{date_from}}' AND updated <= '{{date_to}}'"
            - name: archive-trail
              type: call
              call: "sharepoint.upload-file"
              with:
                folder: "Configuration/AuditTrails/{{msn}}"
                filename: "config_audit_{{date_from}}_{{date_to}}.json"
                content: "MSN: {{msn}} | Config changes: {{get-config-changes.count}} | Linked Jira tickets: {{get-linked-tickets.total}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_CHANGERECORD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: changes
          path: "/A_ChangeRecord?$filter=SerialNumber eq '{{SerialNumber}}' and ChangeDate ge datetime'{{DateFrom}}' and ChangeDate le datetime'{{DateTo}}'"
          inputParameters:
            - name: SerialNumber
              in: query
            - name: DateFrom
              in: query
            - name: DateTo
              in: query
          operations:
            - name: get-change-records
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT

Searches the Airbus engineering Confluence space for documents matching a query, returning titles, URLs, and last-modified dates.

naftiko: "0.5"
info:
  label: "Confluence Engineering Document Search"
  description: "Searches the Airbus engineering Confluence space for documents matching a query, returning titles, URLs, and last-modified dates."
  tags:
    - engineering
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: search-confluence
          description: "Search the engineering Confluence space for documents matching a text query."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The search query text."
          call: "confluence.search-content"
          with:
            cql: "space = ENG AND text ~ '{{query}}'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://airbus-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql={{cql}}"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET

When a contract milestone is completed, verifies delivery evidence in SharePoint, triggers the payment in SAP, and notifies the contract manager via email.

naftiko: "0.5"
info:
  label: "Contract Milestone Payment Trigger"
  description: "When a contract milestone is completed, verifies delivery evidence in SharePoint, triggers the payment in SAP, and notifies the contract manager via email."
  tags:
    - finance
    - sharepoint
    - sap-s4hana
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: trigger-milestone-payment
          description: "Given a contract ID and milestone number, verify evidence, trigger payment, and notify the contract manager."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The contract identifier."
            - name: milestone_number
              in: body
              type: string
              description: "The milestone sequence number."
          steps:
            - name: verify-evidence
              type: call
              call: "sharepoint.search-documents"
              with:
                query: "{{contract_id}} milestone {{milestone_number}} evidence"
            - name: create-payment
              type: call
              call: "sap-s4.create-payment-request"
              with:
                ContractID: "{{contract_id}}"
                Milestone: "{{milestone_number}}"
            - name: notify-manager
              type: call
              call: "msgraph.send-mail"
              with:
                to: "contracts@airbus.com"
                subject: "Milestone payment triggered: {{contract_id}} - M{{milestone_number}}"
                body: "Payment request {{create-payment.document_number}} created for contract {{contract_id}}, milestone {{milestone_number}}. Evidence documents: {{verify-evidence.result_count}} found."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-documents
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: payment-requests
          path: "/A_SupplierInvoice"
          operations:
            - name: create-payment-request
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

When a new contractor is approved, creates their profile in SAP SuccessFactors, provisions Okta access with restricted permissions, and opens a ServiceNow facilities request for badge and workspace.

naftiko: "0.5"
info:
  label: "Contractor Onboarding Orchestration"
  description: "When a new contractor is approved, creates their profile in SAP SuccessFactors, provisions Okta access with restricted permissions, and opens a ServiceNow facilities request for badge and workspace."
  tags:
    - hr
    - sap-successfactors
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: onboard-contractor
          description: "Given contractor details, create the SF profile, provision Okta access, and request facilities setup."
          inputParameters:
            - name: first_name
              in: body
              type: string
              description: "Contractor's first name."
            - name: last_name
              in: body
              type: string
              description: "Contractor's last name."
            - name: email
              in: body
              type: string
              description: "Contractor's email address."
            - name: department
              in: body
              type: string
              description: "Department the contractor will support."
            - name: end_date
              in: body
              type: string
              description: "Contract end date in YYYY-MM-DD format."
          steps:
            - name: create-sf-profile
              type: call
              call: "successfactors.create-contingent-worker"
              with:
                firstName: "{{first_name}}"
                lastName: "{{last_name}}"
                email: "{{email}}"
                department: "{{department}}"
                endDate: "{{end_date}}"
            - name: provision-okta
              type: call
              call: "okta.create-user"
              with:
                login: "{{email}}"
                firstName: "{{first_name}}"
                lastName: "{{last_name}}"
                groupIds: "contractors-{{department}}"
            - name: request-facilities
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Contractor facilities: {{first_name}} {{last_name}} - {{department}}"
                category: "facilities"
                description: "Badge and workspace needed for contractor {{first_name}} {{last_name}} in {{department}}. Contract through {{end_date}}."
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: contingent-workers
          path: "/PerPerson"
          operations:
            - name: create-contingent-worker
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://airbus.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Aggregates program status across engineering (Jira), manufacturing (SAP), and finance (Snowflake) for a given aircraft program, posting a unified executive summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cross-Functional Program Status Aggregator"
  description: "Aggregates program status across engineering (Jira), manufacturing (SAP), and finance (Snowflake) for a given aircraft program, posting a unified executive summary to Microsoft Teams."
  tags:
    - program-management
    - jira
    - sap-s4hana
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: program-mgmt
      port: 8080
      tools:
        - name: aggregate-program-status
          description: "Given a program code, pull engineering, manufacturing, and finance data into a unified summary."
          inputParameters:
            - name: program_code
              in: body
              type: string
              description: "The aircraft program code (e.g., A320, A350, A220)."
          steps:
            - name: get-eng-status
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = '{{program_code}}' AND status != Done"
            - name: get-mfg-status
              type: call
              call: "sap-s4.get-production-orders"
              with:
                Program: "{{program_code}}"
            - name: get-finance-status
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT budget_total, actual_spend, forecast FROM program_financials WHERE program = '{{program_code}}' AND period = CURRENT_MONTH()"
            - name: post-summary
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "executive-program-review"
                message: "Program {{program_code}} Status | Engineering: {{get-eng-status.total}} open items | Manufacturing: {{get-mfg-status.active_orders}} active orders | Finance: {{get-finance-status.data[0].ACTUAL_SPEND}}/{{get-finance-status.data[0].BUDGET_TOTAL}} spent"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2?$filter=Program eq '{{Program}}'"
          inputParameters:
            - name: Program
              in: query
          operations:
            - name: get-production-orders
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/executive-program-review/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When an aircraft delivery is confirmed, retrieves customer details from Salesforce, updates the delivery milestone in SAP, and sends a formal delivery notification email via Microsoft Graph.

naftiko: "0.5"
info:
  label: "Customer Delivery Notification Workflow"
  description: "When an aircraft delivery is confirmed, retrieves customer details from Salesforce, updates the delivery milestone in SAP, and sends a formal delivery notification email via Microsoft Graph."
  tags:
    - sales
    - salesforce
    - sap-s4hana
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: notify-customer-delivery
          description: "Given an aircraft MSN and delivery date, look up the customer, update SAP, and send the delivery notification."
          inputParameters:
            - name: msn
              in: body
              type: string
              description: "The aircraft manufacturer serial number."
            - name: delivery_date
              in: body
              type: string
              description: "Delivery date in YYYY-MM-DD format."
          steps:
            - name: get-customer
              type: call
              call: "salesforce.get-opportunity"
              with:
                msn: "{{msn}}"
            - name: update-milestone
              type: call
              call: "sap-s4.update-delivery-status"
              with:
                SerialNumber: "{{msn}}"
                DeliveryDate: "{{delivery_date}}"
                Status: "DELIVERED"
            - name: send-notification
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{get-customer.contact_email}}"
                subject: "Aircraft Delivery Confirmation - MSN {{msn}}"
                body: "Dear {{get-customer.contact_name}}, we are pleased to confirm the delivery of aircraft MSN {{msn}} to {{get-customer.airline_name}} on {{delivery_date}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://airbus.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query?q=SELECT+Id,Contact_Email__c,Contact_Name__c,Airline_Name__c+FROM+Opportunity+WHERE+MSN__c='{{msn}}'"
          inputParameters:
            - name: msn
              in: query
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: delivery
          path: "/A_ProductionOrder_2('{{SerialNumber}}')"
          inputParameters:
            - name: SerialNumber
              in: path
          operations:
            - name: update-delivery-status
              method: PATCH
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

When a customer support case arrives in Salesforce, enriches it with customer fleet data from Snowflake, assigns it to the appropriate regional team, and notifies the assigned engineer via Slack.

naftiko: "0.5"
info:
  label: "Customer Support Case Routing"
  description: "When a customer support case arrives in Salesforce, enriches it with customer fleet data from Snowflake, assigns it to the appropriate regional team, and notifies the assigned engineer via Slack."
  tags:
    - customer-support
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: route-support-case
          description: "Given a Salesforce case ID, enrich with fleet context, route to the right team, and notify the engineer."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: get-fleet-context
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT aircraft_count, region, support_tier FROM customer_fleet WHERE customer_id = '{{get-case.customer_id}}'"
            - name: notify-engineer
              type: call
              call: "slack.post-message"
              with:
                channel: "support-{{get-fleet-context.data[0].REGION}}"
                text: "New case {{case_id}} from {{get-case.customer_name}} | Fleet: {{get-fleet-context.data[0].AIRCRAFT_COUNT}} aircraft | Tier: {{get-fleet-context.data[0].SUPPORT_TIER}} | Subject: {{get-case.subject}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://airbus.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Aggregates threat intelligence from Datadog security signals and Snowflake SIEM data, creates a ServiceNow security advisory, and distributes the digest to the CISO team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cybersecurity Threat Intel Digest"
  description: "Aggregates threat intelligence from Datadog security signals and Snowflake SIEM data, creates a ServiceNow security advisory, and distributes the digest to the CISO team via Microsoft Teams."
  tags:
    - security
    - datadog
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: generate-threat-digest
          description: "Given a time range, compile security signals and SIEM data into a threat intelligence digest."
          inputParameters:
            - name: hours_back
              in: body
              type: string
              description: "Number of hours to look back for threat data."
          steps:
            - name: get-signals
              type: call
              call: "datadog.get-security-signals"
              with:
                filter: "severity:high"
                from: "-{{hours_back}}h"
            - name: get-siem-data
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT threat_type, count(*) as occurrences FROM siem_events WHERE event_time > DATEADD('hour', -{{hours_back}}, CURRENT_TIMESTAMP()) GROUP BY threat_type ORDER BY occurrences DESC"
            - name: create-advisory
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_security_advisory"
                title: "Threat Intel Digest - Last {{hours_back}}h"
                high_severity_count: "{{get-signals.count}}"
            - name: notify-ciso
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "ciso-team"
                message: "Threat Intel Digest | Period: Last {{hours_back}}h | High-severity signals: {{get-signals.count}} | Top threat: {{get-siem-data.data[0].THREAT_TYPE}} ({{get-siem-data.data[0].OCCURRENCES}}x) | Advisory: {{create-advisory.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v2"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: security-signals
          path: "/security_monitoring/signals?filter={{filter}}&from={{from}}"
          inputParameters:
            - name: filter
              in: query
            - name: from
              in: query
          operations:
            - name: get-security-signals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      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: messages
          path: "/teams/ciso-team/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When a Snowflake ETL pipeline fails, retrieves error details, creates a Jira bug ticket for the data engineering team, and sends a PagerDuty alert to the on-call data engineer.

naftiko: "0.5"
info:
  label: "Data Pipeline Failure Recovery"
  description: "When a Snowflake ETL pipeline fails, retrieves error details, creates a Jira bug ticket for the data engineering team, and sends a PagerDuty alert to the on-call data engineer."
  tags:
    - data-engineering
    - snowflake
    - jira
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a pipeline name and error message, log the failure, create a Jira ticket, and page the on-call engineer."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "The Snowflake pipeline name."
            - name: error_message
              in: body
              type: string
              description: "The pipeline error message."
          steps:
            - name: get-pipeline-history
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT * FROM pipeline_runs WHERE pipeline_name = '{{pipeline_name}}' ORDER BY run_time DESC LIMIT 5"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                summary: "Pipeline failure: {{pipeline_name}}"
                description: "Error: {{error_message}}. Recent runs: {{get-pipeline-history.row_count}}"
                issuetype: "Bug"
                priority: "High"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "ETL Pipeline Failure: {{pipeline_name}}"
                service_id: "data-engineering"
                urgency: "high"
                body: "Pipeline {{pipeline_name}} failed. Jira: {{create-bug.key}}. Error: {{error_message}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Retrieves performance metrics for a specified Airbus application from Datadog, identifies anomalies against baseline thresholds, and creates a ServiceNow incident if SLA breach is detected. Ensures proactive performance management for Airbus digital platforms.

naftiko: "0.5"
info:
  label: "Datadog Application Performance Monitoring Alert"
  description: "Retrieves performance metrics for a specified Airbus application from Datadog, identifies anomalies against baseline thresholds, and creates a ServiceNow incident if SLA breach is detected. Ensures proactive performance management for Airbus digital platforms."
  tags:
    - observability
    - performance
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: apm-ops
      port: 8080
      tools:
        - name: check-application-performance
          description: "Given an application service name and time window, retrieve Datadog APM metrics, evaluate against SLA thresholds, and create a ServiceNow incident if a breach is detected. Use for proactive performance monitoring of critical Airbus systems."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog APM service name (e.g., airbus-myairbus-api, erp-gateway)."
            - name: time_window_minutes
              in: body
              type: integer
              description: "The time window in minutes to evaluate (e.g., 15, 30, 60)."
            - name: latency_threshold_ms
              in: body
              type: number
              description: "The p95 latency threshold in milliseconds above which a breach is declared."
          steps:
            - name: get-apm-metrics
              type: call
              call: "datadog-apm.get-service-metrics"
              with:
                service: "{{service_name}}"
                from: "{{time_window_minutes}}"
            - name: create-performance-incident
              type: call
              call: "servicenow-apm.create-incident"
              with:
                short_description: "Performance breach: {{service_name}} exceeded {{latency_threshold_ms}}ms p95"
                category: "Performance"
                priority: "2"
  consumes:
    - type: http
      namespace: datadog-apm
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: service-metrics
          path: "/metrics/query"
          inputParameters:
            - name: service
              in: query
            - name: from
              in: query
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: servicenow-apm
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          inputParameters:
            - name: short_description
              in: body
            - name: category
              in: body
            - name: priority
              in: body
          operations:
            - name: create-incident
              method: POST

Queries Datadog for the health and metric summary of a specific infrastructure host, returning CPU, memory, and alert status.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Host Status"
  description: "Queries Datadog for the health and metric summary of a specific infrastructure host, returning CPU, memory, and alert status."
  tags:
    - it-operations
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-host-status
          description: "Given a hostname, retrieve the Datadog host health summary including CPU, memory, and active alerts."
          inputParameters:
            - name: hostname
              in: body
              type: string
              description: "The infrastructure hostname."
          call: "datadog.get-host"
          with:
            filter: "host:{{hostname}}"
          outputParameters:
            - name: cpu_pct
              type: string
              mapping: "$.host_list[0].metrics.cpu"
            - name: memory_pct
              type: string
              mapping: "$.host_list[0].metrics.memory"
            - name: status
              type: string
              mapping: "$.host_list[0].up"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: hosts
          path: "/hosts?filter={{filter}}"
          inputParameters:
            - name: filter
              in: query
          operations:
            - name: get-host
              method: GET

Prepares for a design review by gathering open Jira issues for the component, pulling the latest CAD revision references from SharePoint, and scheduling a Teams meeting with the review board.

naftiko: "0.5"
info:
  label: "Design Review Meeting Preparation"
  description: "Prepares for a design review by gathering open Jira issues for the component, pulling the latest CAD revision references from SharePoint, and scheduling a Teams meeting with the review board."
  tags:
    - engineering
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: prepare-design-review
          description: "Given a component ID and review date, gather issues, documents, and schedule the review meeting."
          inputParameters:
            - name: component_id
              in: body
              type: string
              description: "The component or assembly identifier."
            - name: review_date
              in: body
              type: string
              description: "Review date in YYYY-MM-DD format."
          steps:
            - name: get-open-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "component = '{{component_id}}' AND status != Done"
            - name: get-cad-docs
              type: call
              call: "sharepoint.search-documents"
              with:
                query: "{{component_id}} CAD revision"
            - name: schedule-meeting
              type: call
              call: "msteams.create-event"
              with:
                subject: "Design Review: {{component_id}}"
                start: "{{review_date}}T10:00:00"
                body: "Open issues: {{get-open-issues.total}}. Latest CAD documents available in SharePoint. Review package ready."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-documents
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/me/events"
          operations:
            - name: create-event
              method: POST

Verifies digital twin synchronization by checking the latest sync timestamp in Snowflake, comparing against SAP configuration data, and alerting the engineering team via Slack if drift is detected.

naftiko: "0.5"
info:
  label: "Digital Twin Sync Status Check"
  description: "Verifies digital twin synchronization by checking the latest sync timestamp in Snowflake, comparing against SAP configuration data, and alerting the engineering team via Slack if drift is detected."
  tags:
    - engineering
    - snowflake
    - sap-s4hana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: check-digital-twin-sync
          description: "Given an aircraft MSN, verify the digital twin is synchronized with SAP master data."
          inputParameters:
            - name: msn
              in: body
              type: string
              description: "The aircraft MSN."
          steps:
            - name: get-twin-status
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT last_sync, config_hash, drift_detected FROM digital_twins WHERE msn = '{{msn}}'"
            - name: get-sap-config
              type: call
              call: "sap-s4.get-config"
              with:
                SerialNumber: "{{msn}}"
            - name: alert-if-drift
              type: call
              call: "slack.post-message"
              with:
                channel: "digital-twin-ops"
                text: "Digital twin sync check for MSN {{msn}} | Last sync: {{get-twin-status.data[0].LAST_SYNC}} | Drift detected: {{get-twin-status.data[0].DRIFT_DETECTED}} | SAP config version: {{get-sap-config.version}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: config
          path: "/A_Product?$filter=SerialNumber eq '{{SerialNumber}}'"
          inputParameters:
            - name: SerialNumber
              in: query
          operations:
            - name: get-config
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors Airbus drone fleet health by querying telemetry from Snowflake, comparing against maintenance schedules in SAP, and posting health summaries to the UAS operations Teams channel.

naftiko: "0.5"
info:
  label: "Drone Fleet Health Monitoring"
  description: "Monitors Airbus drone fleet health by querying telemetry from Snowflake, comparing against maintenance schedules in SAP, and posting health summaries to the UAS operations Teams channel."
  tags:
    - aerospace
    - snowflake
    - sap-s4hana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: uas-ops
      port: 8080
      tools:
        - name: check-drone-fleet-health
          description: "Given a fleet group, check telemetry and maintenance data, then post a fleet health summary."
          inputParameters:
            - name: fleet_group
              in: body
              type: string
              description: "The drone fleet group identifier."
          steps:
            - name: get-telemetry
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT drone_id, battery_health_pct, flight_hours, last_check FROM drone_telemetry WHERE fleet_group = '{{fleet_group}}' AND battery_health_pct < 80"
            - name: get-maintenance
              type: call
              call: "sap-pm.get-due-maintenance"
              with:
                FleetGroup: "{{fleet_group}}"
            - name: post-summary
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "uas-operations"
                message: "Drone Fleet {{fleet_group}} Health | Low battery units: {{get-telemetry.row_count}} | Maintenance due: {{get-maintenance.count}} drones"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap-pm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: maintenance
          path: "/MaintenanceOrder?$filter=FleetGroup eq '{{FleetGroup}}' and Status eq 'DUE'"
          inputParameters:
            - name: FleetGroup
              in: query
          operations:
            - name: get-due-maintenance
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/uas-operations/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When an employee departure is confirmed in SAP SuccessFactors, deactivates their identity in Microsoft Entra ID, closes all open Jira tasks, and posts a handover summary to the manager in Microsoft Teams. Ensures complete access revocation and knowledge transfer for Airbus staff exits.

naftiko: "0.5"
info:
  label: "Employee Offboarding Orchestration"
  description: "When an employee departure is confirmed in SAP SuccessFactors, deactivates their identity in Microsoft Entra ID, closes all open Jira tasks, and posts a handover summary to the manager in Microsoft Teams. Ensures complete access revocation and knowledge transfer for Airbus staff exits."
  tags:
    - hr
    - offboarding
    - sap-successfactors
    - microsoft-entra
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a SuccessFactors employee ID and last working day, disable the Entra ID account, close open Jira tasks, and send a handover summary to the manager via Teams. Use when an employee departure is confirmed."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SAP SuccessFactors employee ID of the departing employee."
            - name: last_working_day
              in: body
              type: string
              description: "The employee's last working day in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-employee-details
              type: call
              call: "successfactors-off.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: disable-entra-account
              type: call
              call: "entra-id.disable-user"
              with:
                userPrincipalName: "{{get-employee-details.email}}"
                accountEnabled: false
            - name: notify-manager
              type: call
              call: "msteams-offboard.send-message"
              with:
                channel_id: "{{get-employee-details.manager_email}}"
                message: "Offboarding complete for {{get-employee-details.display_name}}. Last day: {{last_working_day}}. Account deactivated."
  consumes:
    - type: http
      namespace: successfactors-off
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employee
          path: "/PerPerson('{{employee_id}}')"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: entra-id
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user
          path: "/users/{{userPrincipalName}}"
          inputParameters:
            - name: userPrincipalName
              in: path
            - name: accountEnabled
              in: body
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: msteams-offboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/users/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

When a role change is approved in SAP SuccessFactors, updates the employee's Entra ID group memberships, modifies their SAP access permissions, and notifies both the employee and their new manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Role Change Provisioning"
  description: "When a role change is approved in SAP SuccessFactors, updates the employee's Entra ID group memberships, modifies their SAP access permissions, and notifies both the employee and their new manager via Microsoft Teams."
  tags:
    - hr
    - identity
    - role-change
    - sap-successfactors
    - microsoft-entra
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: provision-role-change
          description: "Given a SuccessFactors employee ID, old group ID, and new group ID, update Entra ID group memberships and notify the employee and new manager in Teams. Use when an employee's role or department changes are approved."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SAP SuccessFactors employee ID."
            - name: old_group_id
              in: body
              type: string
              description: "The Entra ID group ID to remove the employee from."
            - name: new_group_id
              in: body
              type: string
              description: "The Entra ID group ID to add the employee to."
          steps:
            - name: get-employee-info
              type: call
              call: "successfactors-role.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: remove-old-group
              type: call
              call: "entra-role.remove-group-member"
              with:
                group_id: "{{old_group_id}}"
                user_id: "{{get-employee-info.entra_object_id}}"
            - name: add-new-group
              type: call
              call: "entra-role.add-group-member"
              with:
                group_id: "{{new_group_id}}"
                user_id: "{{get-employee-info.entra_object_id}}"
            - name: notify-employee
              type: call
              call: "msteams-role.send-message"
              with:
                channel_id: "{{get-employee-info.email}}"
                message: "Your role has been updated. New access groups are active."
  consumes:
    - type: http
      namespace: successfactors-role
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employee
          path: "/PerPerson('{{employee_id}}')"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: entra-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-member
          path: "/groups/{{group_id}}/members/{{user_id}}/$ref"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-group-member
              method: POST
            - name: remove-group-member
              method: DELETE
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/users/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

When an employee transfers between departments, updates their Okta group memberships, creates a ServiceNow ticket for equipment transfer, and notifies the new manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Transfer Provisioning Workflow"
  description: "When an employee transfers between departments, updates their Okta group memberships, creates a ServiceNow ticket for equipment transfer, and notifies the new manager via Microsoft Teams."
  tags:
    - hr
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: process-transfer
          description: "Given an employee email and new department, update access groups, request equipment transfer, and notify the new manager."
          inputParameters:
            - name: employee_email
              in: body
              type: string
              description: "The employee's email address."
            - name: new_department
              in: body
              type: string
              description: "The new department name."
            - name: new_manager_email
              in: body
              type: string
              description: "The new manager's email."
          steps:
            - name: update-groups
              type: call
              call: "okta.update-user-groups"
              with:
                login: "{{employee_email}}"
                new_group: "{{new_department}}"
            - name: create-transfer-ticket
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Equipment transfer: {{employee_email}} to {{new_department}}"
                category: "facilities"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{new_manager_email}}"
                message: "{{employee_email}} has been transferred to {{new_department}}. Okta groups updated. Equipment transfer ticket: {{create-transfer-ticket.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://airbus.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{login}}/groups"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/chats/messages"
          operations:
            - name: send-message
              method: POST

When an engineering change request is submitted, creates a ServiceNow change record, retrieves the affected BOM from SAP, and notifies the design authority via email through Microsoft Graph.

naftiko: "0.5"
info:
  label: "Engineering Change Request Workflow"
  description: "When an engineering change request is submitted, creates a ServiceNow change record, retrieves the affected BOM from SAP, and notifies the design authority via email through Microsoft Graph."
  tags:
    - engineering
    - servicenow
    - sap-s4hana
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, affected assembly, and requestor, create a ServiceNow change, look up the SAP BOM, and email the design authority."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the engineering change."
            - name: assembly_number
              in: body
              type: string
              description: "The affected assembly or part number."
            - name: requestor_email
              in: body
              type: string
              description: "Email of the change requestor."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "ECR: {{assembly_number}} - {{change_description}}"
                category: "engineering"
                requested_by: "{{requestor_email}}"
            - name: get-bom
              type: call
              call: "sap-s4.get-bom"
              with:
                Material: "{{assembly_number}}"
            - name: email-authority
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{get-bom.design_authority_email}}"
                subject: "ECR {{create-change.number}}: {{assembly_number}}"
                body: "An engineering change request has been submitted for assembly {{assembly_number}}. Change: {{create-change.number}}. Description: {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: bom
          path: "/A_BillOfMaterial?$filter=Material eq '{{Material}}'"
          inputParameters:
            - name: Material
              in: query
          operations:
            - name: get-bom
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

When a GitHub Actions pipeline fails on a critical aerospace software repository, creates a Jira incident ticket, alerts the engineering team in Microsoft Teams, and logs the failure in Datadog. Ensures rapid response for flight-critical software defects.

naftiko: "0.5"
info:
  label: "Engineering CI/CD Pipeline Failure Response"
  description: "When a GitHub Actions pipeline fails on a critical aerospace software repository, creates a Jira incident ticket, alerts the engineering team in Microsoft Teams, and logs the failure in Datadog. Ensures rapid response for flight-critical software defects."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cicd-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub repository name, workflow run ID, and branch, create a Jira incident, post an alert to the engineering Teams channel, and log a Datadog event. Invoke when a CI/CD pipeline failure is detected on a critical branch."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name where the failure occurred (e.g., avionics-firmware)."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
            - name: branch
              in: body
              type: string
              description: "The branch where the failure occurred (e.g., main, release/A380)."
          steps:
            - name: create-jira-issue
              type: call
              call: "jira-eng.create-issue"
              with:
                project_key: "ENG"
                summary: "Pipeline failure: {{repo_name}} on {{branch}}"
                issue_type: "Bug"
                priority: "High"
            - name: notify-teams
              type: call
              call: "msteams-eng.send-message"
              with:
                channel_id: "engineering-alerts"
                message: "CI/CD failure in {{repo_name}} ({{branch}}). Jira: {{create-jira-issue.key}}"
            - name: log-datadog-event
              type: call
              call: "datadog-cicd.create-event"
              with:
                title: "Pipeline failure: {{repo_name}}"
                text: "Run {{run_id}} failed on {{branch}}"
                tags: "repo:{{repo_name}},branch:{{branch}}"
  consumes:
    - type: http
      namespace: jira-eng
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: issue_type
              in: body
            - name: priority
              in: body
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: datadog-cicd
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: event
          path: "/events"
          inputParameters:
            - name: title
              in: body
            - name: text
              in: body
            - name: tags
              in: body
          operations:
            - name: create-event
              method: POST

After a structural test completes, retrieves results from Snowflake, archives the report to SharePoint, and distributes a summary to the stress engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Engineering Test Report Distribution"
  description: "After a structural test completes, retrieves results from Snowflake, archives the report to SharePoint, and distributes a summary to the stress engineering team via Microsoft Teams."
  tags:
    - engineering
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: distribute-test-report
          description: "Given a test ID, retrieve results, archive to SharePoint, and notify the engineering team."
          inputParameters:
            - name: test_id
              in: body
              type: string
              description: "The structural test identifier."
            - name: test_type
              in: body
              type: string
              description: "Type of test (e.g., fatigue, static, damage-tolerance)."
          steps:
            - name: get-results
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT test_id, specimen, load_cycles, result, notes FROM test_results WHERE test_id = '{{test_id}}'"
            - name: archive-report
              type: call
              call: "sharepoint.upload-file"
              with:
                folder: "Engineering/TestReports/{{test_type}}"
                filename: "{{test_id}}_report.json"
                content: "{{get-results.data}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "stress-engineering"
                message: "Test report available: {{test_id}} ({{test_type}}) | Result: {{get-results.data[0].RESULT}} | Archived to SharePoint: Engineering/TestReports/{{test_type}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/stress-engineering/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When a shipment is planned, retrieves the material export classification from SAP, checks the destination against the compliance database in Snowflake, and logs the result in ServiceNow.

naftiko: "0.5"
info:
  label: "Export Control Classification Check"
  description: "When a shipment is planned, retrieves the material export classification from SAP, checks the destination against the compliance database in Snowflake, and logs the result in ServiceNow."
  tags:
    - compliance
    - sap-s4hana
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: check-export-control
          description: "Given a material number and destination country, verify export classification and log the compliance check."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material to be exported."
            - name: destination_country
              in: body
              type: string
              description: "ISO country code of the destination."
          steps:
            - name: get-classification
              type: call
              call: "sap-s4.get-export-class"
              with:
                Material: "{{material_number}}"
            - name: check-restrictions
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT restricted, reason FROM export_restrictions WHERE eccn = '{{get-classification.ECCN}}' AND country = '{{destination_country}}'"
            - name: log-check
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_export_compliance_log"
                material: "{{material_number}}"
                destination: "{{destination_country}}"
                eccn: "{{get-classification.ECCN}}"
                result: "{{check-restrictions.restricted}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: export-class
          path: "/A_Product('{{Material}}')/to_ExportControl"
          inputParameters:
            - name: Material
              in: path
          operations:
            - name: get-export-class
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Compiles a daily final assembly line status by querying production order progress from SAP, quality hold data from Snowflake, and posting the consolidated report to the operations Teams channel.

naftiko: "0.5"
info:
  label: "Final Assembly Line Status Report"
  description: "Compiles a daily final assembly line status by querying production order progress from SAP, quality hold data from Snowflake, and posting the consolidated report to the operations Teams channel."
  tags:
    - manufacturing
    - sap-s4hana
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-fal-status
          description: "Given a facility and date, compile production progress and quality hold data into a status report."
          inputParameters:
            - name: facility
              in: body
              type: string
              description: "The final assembly line facility code."
            - name: report_date
              in: body
              type: string
              description: "Report date in YYYY-MM-DD format."
          steps:
            - name: get-production-progress
              type: call
              call: "sap-s4.get-production-orders"
              with:
                Plant: "{{facility}}"
                ScheduledDate: "{{report_date}}"
            - name: get-quality-holds
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT msn, hold_reason, hold_date FROM quality_holds WHERE facility = '{{facility}}' AND status = 'OPEN'"
            - name: post-report
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fal-operations"
                message: "FAL {{facility}} Daily Status | Date: {{report_date}} | Active orders: {{get-production-progress.count}} | Quality holds: {{get-quality-holds.row_count}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2?$filter=Plant eq '{{Plant}}' and ScheduledStartDate eq datetime'{{ScheduledDate}}'"
          inputParameters:
            - name: Plant
              in: query
            - name: ScheduledDate
              in: query
          operations:
            - name: get-production-orders
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/fal-operations/channels/general/messages"
          operations:
            - name: send-message
              method: POST

After a test flight completes, ingests telemetry data into Snowflake, triggers a Power BI dataset refresh, and notifies the flight test engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Flight Test Data Pipeline Orchestration"
  description: "After a test flight completes, ingests telemetry data into Snowflake, triggers a Power BI dataset refresh, and notifies the flight test engineering team via Microsoft Teams."
  tags:
    - aerospace
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: flight-test
      port: 8080
      tools:
        - name: process-flight-test-data
          description: "Given a test flight ID, ingest telemetry to Snowflake, refresh the dashboard, and notify the team."
          inputParameters:
            - name: flight_id
              in: body
              type: string
              description: "The test flight identifier."
            - name: aircraft_msn
              in: body
              type: string
              description: "The aircraft MSN."
          steps:
            - name: ingest-telemetry
              type: call
              call: "snowflake.run-query"
              with:
                query: "CALL ingest_flight_telemetry('{{flight_id}}', '{{aircraft_msn}}')"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "flight-test-analytics"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "flight-test-engineering"
                message: "Flight test {{flight_id}} for MSN {{aircraft_msn}} data ingested. Dashboard refresh triggered. Status: {{refresh-dashboard.status}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/flight-test-engineering/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Creates a GitHub release tag on a specified repository, triggers the deployment workflow, and posts the release notes to the engineering Teams channel and a Confluence release page. Coordinates Airbus software release activities across teams.

naftiko: "0.5"
info:
  label: "GitHub Deployment Release Coordination"
  description: "Creates a GitHub release tag on a specified repository, triggers the deployment workflow, and posts the release notes to the engineering Teams channel and a Confluence release page. Coordinates Airbus software release activities across teams."
  tags:
    - devops
    - release-management
    - github
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: release-mgmt
      port: 8080
      tools:
        - name: coordinate-release
          description: "Given a GitHub repository, version tag, and release notes, create the GitHub release, post notes to Teams engineering channel, and publish to Confluence. Use when coordinating a software release for Airbus systems."
          inputParameters:
            - name: repo_owner
              in: body
              type: string
              description: "The GitHub organization or owner name."
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name for the release."
            - name: version_tag
              in: body
              type: string
              description: "The semantic version tag for the release (e.g., v2.4.1)."
            - name: release_notes
              in: body
              type: string
              description: "The release notes describing changes in this version."
          steps:
            - name: create-github-release
              type: call
              call: "github-release.create-release"
              with:
                owner: "{{repo_owner}}"
                repo: "{{repo_name}}"
                tag_name: "{{version_tag}}"
                body: "{{release_notes}}"
            - name: publish-confluence-release
              type: call
              call: "confluence-release.create-page"
              with:
                space_key: "ENG"
                title: "Release Notes: {{repo_name}} {{version_tag}}"
                body: "{{release_notes}}"
            - name: notify-engineering
              type: call
              call: "msteams-release.send-message"
              with:
                channel_id: "engineering-releases"
                message: "Release {{version_tag}} published for {{repo_name}}. Confluence: {{publish-confluence-release.url}}"
  consumes:
    - type: http
      namespace: github-release
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: release
          path: "/repos/{{owner}}/{{repo}}/releases"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: tag_name
              in: body
            - name: body
              in: body
          operations:
            - name: create-release
              method: POST
    - type: http
      namespace: confluence-release
      baseUri: "https://airbus.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: page
          path: "/content"
          inputParameters:
            - name: space_key
              in: body
            - name: title
              in: body
            - name: body
              in: body
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams-release
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Retrieves the status of a GitHub pull request by repo and PR number, returning review state, merge status, and CI checks summary.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Status"
  description: "Retrieves the status of a GitHub pull request by repo and PR number, returning review state, merge status, and CI checks summary."
  tags:
    - engineering
    - github
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-pr-status
          description: "Given a repository name and PR number, retrieve the pull request state, review status, and CI check results."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository name (org/repo format)."
            - name: pr_number
              in: body
              type: string
              description: "The pull request number."
          call: "github.get-pull-request"
          with:
            repo: "{{repo}}"
            pr_number: "{{pr_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state"
            - name: mergeable
              type: string
              mapping: "$.mergeable"
            - name: review_status
              type: string
              mapping: "$.reviews[0].state"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET

Triggers a GitHub Advanced Security code scan on a specified aerospace software repository, retrieves scan results, and creates Jira issues for any critical findings. Ensures Airbus software development meets security standards for airworthiness.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Scanning"
  description: "Triggers a GitHub Advanced Security code scan on a specified aerospace software repository, retrieves scan results, and creates Jira issues for any critical findings. Ensures Airbus software development meets security standards for airworthiness."
  tags:
    - devops
    - security
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: code-security
      port: 8080
      tools:
        - name: scan-repository-security
          description: "Given a GitHub repository name and branch, trigger a security scan via GitHub Advanced Security API, retrieve findings, and create Jira issues for critical vulnerabilities. Use for pre-release security validation of Airbus software repositories."
          inputParameters:
            - name: repo_owner
              in: body
              type: string
              description: "The GitHub organization or owner name (e.g., airbus-group)."
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name to scan (e.g., avionics-control-sw)."
            - name: branch
              in: body
              type: string
              description: "The branch to scan (e.g., main, release/2025)."
          steps:
            - name: get-code-scanning-alerts
              type: call
              call: "github-sec.list-code-alerts"
              with:
                owner: "{{repo_owner}}"
                repo: "{{repo_name}}"
                ref: "{{branch}}"
                severity: "critical"
            - name: create-jira-security-issue
              type: call
              call: "jira-security.create-issue"
              with:
                project_key: "SEC"
                summary: "Security findings: {{repo_name}} on {{branch}}"
                description: "{{get-code-scanning-alerts.total_count}} critical findings detected. Immediate remediation required."
                issue_type: "Bug"
                priority: "Critical"
  consumes:
    - type: http
      namespace: github-sec
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-alerts
          path: "/repos/{{owner}}/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: ref
              in: query
            - name: severity
              in: query
          operations:
            - name: list-code-alerts
              method: GET
    - type: http
      namespace: jira-security
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: description
              in: body
            - name: issue_type
              in: body
            - name: priority
              in: body
          operations:
            - name: create-issue
              method: POST

Pulls current headcount totals from SAP SuccessFactors by business unit and publishes the snapshot to a Snowflake analytics table and a Power BI dataset. Used by HR and finance leadership for workforce planning reviews.

naftiko: "0.5"
info:
  label: "Headcount Snapshot Report"
  description: "Pulls current headcount totals from SAP SuccessFactors by business unit and publishes the snapshot to a Snowflake analytics table and a Power BI dataset. Used by HR and finance leadership for workforce planning reviews."
  tags:
    - hr
    - reporting
    - sap-successfactors
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: publish-headcount-snapshot
          description: "Given a business unit code and reporting period, retrieve headcount from SuccessFactors, write the snapshot to Snowflake, and trigger a Power BI dataset refresh. Use for monthly or on-demand workforce headcount reports."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "The Airbus business unit code (e.g., COMMERCIAL, DEFENCE, HELICOPTERS)."
            - name: reporting_period
              in: body
              type: string
              description: "The reporting period in YYYY-MM format."
          steps:
            - name: get-headcount
              type: call
              call: "successfactors-hr.get-headcount"
              with:
                businessUnit: "{{business_unit}}"
                period: "{{reporting_period}}"
            - name: write-snowflake
              type: call
              call: "snowflake-hr.insert-rows"
              with:
                table: "HR.HEADCOUNT_SNAPSHOTS"
                data: "{{get-headcount.results}}"
            - name: refresh-powerbi
              type: call
              call: "powerbi-hr.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_headcount_dataset_id"
  consumes:
    - type: http
      namespace: successfactors-hr
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: headcount
          path: "/EmpJob"
          inputParameters:
            - name: businessUnit
              in: query
            - name: period
              in: query
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: snowflake-hr
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: rows
          path: "/statements"
          inputParameters:
            - name: table
              in: body
            - name: data
              in: body
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: powerbi-hr
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refresh
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Compiles helicopter fleet utilization data from Snowflake, enriches with maintenance compliance from SAP PM, and distributes the report to the rotorcraft division via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Helicopter Fleet Utilization Report"
  description: "Compiles helicopter fleet utilization data from Snowflake, enriches with maintenance compliance from SAP PM, and distributes the report to the rotorcraft division via Microsoft Teams."
  tags:
    - aerospace
    - snowflake
    - sap-s4hana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rotorcraft
      port: 8080
      tools:
        - name: generate-utilization-report
          description: "Given a fleet type and period, compile utilization and maintenance compliance data."
          inputParameters:
            - name: fleet_type
              in: body
              type: string
              description: "Helicopter fleet type (e.g., H135, H145, H175)."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-03)."
          steps:
            - name: get-utilization
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT aircraft_reg, total_flight_hours, missions_completed, availability_pct FROM helicopter_utilization WHERE fleet_type = '{{fleet_type}}' AND period = '{{period}}'"
            - name: get-maintenance-status
              type: call
              call: "sap-pm.get-fleet-maintenance"
              with:
                FleetType: "{{fleet_type}}"
            - name: post-report
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "rotorcraft-ops"
                message: "{{fleet_type}} Fleet Report ({{period}}) | Aircraft: {{get-utilization.row_count}} | Avg availability: {{get-utilization.avg_availability}}% | Maintenance overdue: {{get-maintenance-status.overdue_count}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap-pm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: fleet-maintenance
          path: "/MaintenanceOrder?$filter=FleetType eq '{{FleetType}}'"
          inputParameters:
            - name: FleetType
              in: query
          operations:
            - name: get-fleet-maintenance
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/rotorcraft-ops/channels/general/messages"
          operations:
            - name: send-message
              method: POST

After a major IT incident is resolved, retrieves the incident timeline from ServiceNow, pulls monitoring data from Datadog, and generates a postmortem document uploaded to Confluence.

naftiko: "0.5"
info:
  label: "Incident Postmortem Report Generator"
  description: "After a major IT incident is resolved, retrieves the incident timeline from ServiceNow, pulls monitoring data from Datadog, and generates a postmortem document uploaded to Confluence."
  tags:
    - it-operations
    - servicenow
    - datadog
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: generate-postmortem
          description: "Given a ServiceNow incident number, compile timeline and monitoring data into a postmortem report."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          steps:
            - name: get-incident-timeline
              type: call
              call: "servicenow.get-incident-history"
              with:
                number: "{{incident_number}}"
            - name: get-monitoring-data
              type: call
              call: "datadog.get-incident-metrics"
              with:
                incident_id: "{{incident_number}}"
            - name: create-postmortem
              type: call
              call: "confluence.create-page"
              with:
                space: "IT-OPS"
                title: "Postmortem: {{incident_number}}"
                body: "Incident: {{incident_number}} | Duration: {{get-incident-timeline.duration}} | Root cause: {{get-incident-timeline.root_cause}} | Impact: {{get-monitoring-data.affected_services}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident-history
          path: "/table/incident?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident-history
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v2"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://airbus-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Pulls cloud infrastructure costs from Datadog, maps them to cost centers in SAP, and uploads the allocation report to the finance SharePoint site for monthly chargeback.

naftiko: "0.5"
info:
  label: "Infrastructure Cost Allocation Report"
  description: "Pulls cloud infrastructure costs from Datadog, maps them to cost centers in SAP, and uploads the allocation report to the finance SharePoint site for monthly chargeback."
  tags:
    - finops
    - datadog
    - sap-s4hana
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: generate-cost-allocation
          description: "Given a month, compile cloud costs, map to SAP cost centers, and upload the allocation report."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "The reporting month in YYYY-MM format."
          steps:
            - name: get-cloud-costs
              type: call
              call: "datadog.get-cost-data"
              with:
                month: "{{month}}"
            - name: get-cost-center-mapping
              type: call
              call: "sap-s4.get-cost-centers"
              with:
                CompanyCode: "AIRBUS"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                folder: "Finance/CostAllocation"
                filename: "cloud_cost_allocation_{{month}}.json"
                content: "Total cloud spend: {{get-cloud-costs.total}} | Cost centers: {{get-cost-center-mapping.count}} | Month: {{month}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v2"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: cost
          path: "/usage/cost_by_org?start_month={{month}}"
          inputParameters:
            - name: month
              in: query
          operations:
            - name: get-cost-data
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: cost-centers
          path: "/A_CostCenter?$filter=CompanyCode eq '{{CompanyCode}}'"
          inputParameters:
            - name: CompanyCode
              in: query
          operations:
            - name: get-cost-centers
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT

When an IT asset reaches end-of-life, retrieves asset details from ServiceNow CMDB, decommissions the Okta service account, and creates a disposal request in SAP.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Management"
  description: "When an IT asset reaches end-of-life, retrieves asset details from ServiceNow CMDB, decommissions the Okta service account, and creates a disposal request in SAP."
  tags:
    - it-operations
    - servicenow
    - okta
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: decommission-asset
          description: "Given an asset tag, retrieve CMDB details, deactivate service accounts, and create a disposal request."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The IT asset tag identifier."
          steps:
            - name: get-asset
              type: call
              call: "servicenow.get-cmdb-ci"
              with:
                asset_tag: "{{asset_tag}}"
            - name: deactivate-account
              type: call
              call: "okta.deactivate-user"
              with:
                login: "{{get-asset.service_account}}"
            - name: create-disposal
              type: call
              call: "sap-s4.create-asset-retirement"
              with:
                AssetNumber: "{{get-asset.sap_asset_number}}"
                RetirementDate: "{{get-asset.eol_date}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: query
          operations:
            - name: get-cmdb-ci
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://airbus.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_FIXEDASSET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: retirements
          path: "/A_FixedAssetRetirement"
          operations:
            - name: create-asset-retirement
              method: POST

When a Priority-1 incident is created in ServiceNow, retrieves alert details from Datadog, assembles an incident war-room channel in Microsoft Teams, and pages the on-call engineer. Designed for rapid response to production outages affecting Airbus operational systems.

naftiko: "0.5"
info:
  label: "IT Priority-1 Incident Triage"
  description: "When a Priority-1 incident is created in ServiceNow, retrieves alert details from Datadog, assembles an incident war-room channel in Microsoft Teams, and pages the on-call engineer. Designed for rapid response to production outages affecting Airbus operational systems."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a ServiceNow incident number and Datadog monitor ID, retrieve alert context, create a Teams war-room channel, and trigger a PagerDuty page to the on-call engineer. Use when a P1 severity incident is created."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID associated with the triggering alert."
            - name: service_name
              in: body
              type: string
              description: "The affected service or system name."
          steps:
            - name: get-snow-incident
              type: call
              call: "servicenow-it.get-incident"
              with:
                number: "{{incident_number}}"
            - name: get-datadog-monitor
              type: call
              call: "datadog-it.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: page-oncall
              type: call
              call: "pagerduty-it.create-incident"
              with:
                title: "P1: {{get-snow-incident.short_description}}"
                service_id: "$secrets.pagerduty_service_id"
                urgency: "high"
  consumes:
    - type: http
      namespace: servicenow-it
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: datadog-it
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitor
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: pagerduty-it
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident
          path: "/incidents"
          inputParameters:
            - name: title
              in: body
            - name: service_id
              in: body
            - name: urgency
              in: body
          operations:
            - name: create-incident
              method: POST

Retrieves a Jira issue by key and returns status, assignee, priority, and summary for engineering project tracking.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves a Jira issue by key and returns status, assignee, priority, and summary for engineering project tracking."
  tags:
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Given a Jira issue key, retrieve the issue status, assignee, priority, and summary."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key, e.g. AERO-1234."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

When a Datadog alert signals high resource utilization on a Kubernetes cluster, retrieves node metrics, triggers a scaling action via Terraform, and posts the outcome to the platform engineering Slack channel.

naftiko: "0.5"
info:
  label: "Kubernetes Cluster Scaling Response"
  description: "When a Datadog alert signals high resource utilization on a Kubernetes cluster, retrieves node metrics, triggers a scaling action via Terraform, and posts the outcome to the platform engineering Slack channel."
  tags:
    - platform-engineering
    - datadog
    - terraform
    - slack
capability:
  exposes:
    - type: mcp
      namespace: platform
      port: 8080
      tools:
        - name: scale-cluster
          description: "Given a cluster name and target node count, check metrics, trigger scaling, and notify the team."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The Kubernetes cluster name."
            - name: target_nodes
              in: body
              type: string
              description: "Target number of worker nodes."
          steps:
            - name: get-metrics
              type: call
              call: "datadog.get-cluster-metrics"
              with:
                query: "kubernetes.cpu.usage{cluster:{{cluster_name}}}"
            - name: trigger-scale
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "k8s-{{cluster_name}}"
                variables: "node_count={{target_nodes}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "platform-engineering"
                text: "Cluster {{cluster_name}} scaling to {{target_nodes}} nodes. CPU was at {{get-metrics.avg_cpu}}%. Terraform run: {{trigger-scale.run_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query?query={{query}}&from=-600"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: get-cluster-metrics
              method: GET
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace}}/runs"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: trigger-run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries the LinkedIn Talent Solutions API for aerospace engineering candidates matching a job requisition, enriches candidate data with ZoomInfo, and creates Jira recruiting tasks for each qualified candidate. Supports Airbus talent acquisition for engineering roles.

naftiko: "0.5"
info:
  label: "LinkedIn Aerospace Talent Pipeline Enrichment"
  description: "Queries the LinkedIn Talent Solutions API for aerospace engineering candidates matching a job requisition, enriches candidate data with ZoomInfo, and creates Jira recruiting tasks for each qualified candidate. Supports Airbus talent acquisition for engineering roles."
  tags:
    - hr
    - recruiting
    - linkedin
    - jira
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: enrich-candidate-pipeline
          description: "Given a LinkedIn job posting ID and target discipline, retrieve matching candidate profiles, enrich with additional data, and create Jira tasks for recruiter follow-up. Use when sourcing engineering candidates for active Airbus requisitions."
          inputParameters:
            - name: job_posting_id
              in: body
              type: string
              description: "The LinkedIn job posting ID for the active requisition."
            - name: discipline
              in: body
              type: string
              description: "The engineering discipline to filter candidates (e.g., Avionics, Structures, Propulsion)."
          steps:
            - name: get-linkedin-candidates
              type: call
              call: "linkedin-talent.search-candidates"
              with:
                jobPostingId: "{{job_posting_id}}"
                discipline: "{{discipline}}"
            - name: create-recruiter-task
              type: call
              call: "jira-recruiting.create-issue"
              with:
                project_key: "RECRUIT"
                summary: "Candidate pipeline: {{discipline}} — {{job_posting_id}}"
                description: "{{get-linkedin-candidates.total_count}} candidates identified for {{discipline}} requisition."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: linkedin-talent
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: candidates
          path: "/talentSearch"
          inputParameters:
            - name: jobPostingId
              in: query
            - name: discipline
              in: query
          operations:
            - name: search-candidates
              method: GET
    - type: http
      namespace: jira-recruiting
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: description
              in: body
            - name: issue_type
              in: body
          operations:
            - name: create-issue
              method: POST

Retrieves Datadog SLO compliance metrics for Airbus manufacturing execution systems, computes breach counts, and publishes a weekly observability digest to Confluence and Power BI. Ensures operational excellence tracking for shop-floor systems.

naftiko: "0.5"
info:
  label: "Manufacturing SLO Observability Report"
  description: "Retrieves Datadog SLO compliance metrics for Airbus manufacturing execution systems, computes breach counts, and publishes a weekly observability digest to Confluence and Power BI. Ensures operational excellence tracking for shop-floor systems."
  tags:
    - observability
    - manufacturing
    - datadog
    - confluence
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: publish-slo-report
          description: "Given a Datadog SLO ID list and reporting week, retrieve compliance data, write the results to a Confluence page, and refresh the Power BI SLO dashboard. Use for weekly operational SLO reviews."
          inputParameters:
            - name: slo_ids
              in: body
              type: string
              description: "Comma-separated list of Datadog SLO IDs to include in the report."
            - name: report_week
              in: body
              type: string
              description: "The ISO week for the report (e.g., 2025-W12)."
          steps:
            - name: get-slo-history
              type: call
              call: "datadog-slo.get-slo-history"
              with:
                slo_ids: "{{slo_ids}}"
            - name: publish-confluence-report
              type: call
              call: "confluence-slo.create-page"
              with:
                space_key: "OPS"
                title: "SLO Report — {{report_week}}"
                body: "SLO compliance data for {{report_week}}: {{get-slo-history.summary}}"
            - name: refresh-powerbi
              type: call
              call: "powerbi-slo.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_slo_dataset_id"
  consumes:
    - type: http
      namespace: datadog-slo
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slo-history
          path: "/slo/history"
          inputParameters:
            - name: slo_ids
              in: query
          operations:
            - name: get-slo-history
              method: GET
    - type: http
      namespace: confluence-slo
      baseUri: "https://airbus.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: page
          path: "/content"
          inputParameters:
            - name: space_key
              in: body
            - name: title
              in: body
            - name: body
              in: body
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: powerbi-slo
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refresh
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

When inventory drops below reorder threshold in Snowflake, retrieves supplier lead times from SAP Ariba, creates an expedite request in ServiceNow, and alerts the procurement team on Slack.

naftiko: "0.5"
info:
  label: "Material Shortage Escalation Workflow"
  description: "When inventory drops below reorder threshold in Snowflake, retrieves supplier lead times from SAP Ariba, creates an expedite request in ServiceNow, and alerts the procurement team on Slack."
  tags:
    - supply-chain
    - snowflake
    - sap-ariba
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: escalate-shortage
          description: "Given a part number, check inventory, get supplier lead time, create expedite request, and alert procurement."
          inputParameters:
            - name: part_number
              in: body
              type: string
              description: "The part number with shortage."
            - name: current_qty
              in: body
              type: string
              description: "Current stock quantity."
          steps:
            - name: get-supplier-info
              type: call
              call: "ariba.get-preferred-supplier"
              with:
                part_number: "{{part_number}}"
            - name: create-expedite
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Material shortage: {{part_number}} - Qty: {{current_qty}}"
                priority: "2"
                category: "procurement"
            - name: alert-procurement
              type: call
              call: "slack.post-message"
              with:
                channel: "procurement-alerts"
                text: "SHORTAGE: Part {{part_number}} at {{current_qty}} units. Supplier: {{get-supplier-info.supplier_name}} (lead time: {{get-supplier-info.lead_days}} days). Expedite ticket: {{create-expedite.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_api_token"
      resources:
        - name: preferred-suppliers
          path: "/preferred-suppliers?partNumber={{part_number}}"
          inputParameters:
            - name: part_number
              in: query
          operations:
            - name: get-preferred-supplier
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves recent messages from a Microsoft Teams channel, returning message content, sender, and timestamp for team communication review.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Lookup"
  description: "Retrieves recent messages from a Microsoft Teams channel, returning message content, sender, and timestamp for team communication review."
  tags:
    - collaboration
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: get-channel-messages
          description: "Given a Teams team ID and channel ID, retrieve recent messages including sender and timestamp."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The channel ID within the team."
          call: "msteams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: messages
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages?$top=10"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Compiles monthly budget variance data from SAP controlling, enriches with actuals from Snowflake, and distributes the variance report to finance stakeholders via email.

naftiko: "0.5"
info:
  label: "Monthly Budget Variance Report"
  description: "Compiles monthly budget variance data from SAP controlling, enriches with actuals from Snowflake, and distributes the variance report to finance stakeholders via email."
  tags:
    - finance
    - sap-s4hana
    - snowflake
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: generate-variance-report
          description: "Given a cost center and period, compile budget vs actual data and email the variance report."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period (e.g., 2026-03)."
          steps:
            - name: get-budget
              type: call
              call: "sap-s4.get-budget"
              with:
                CostCenter: "{{cost_center}}"
                FiscalPeriod: "{{fiscal_period}}"
            - name: get-actuals
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT cost_element, actual_amount FROM cost_actuals WHERE cost_center = '{{cost_center}}' AND period = '{{fiscal_period}}'"
            - name: email-report
              type: call
              call: "msgraph.send-mail"
              with:
                to: "finance-controllers@airbus.com"
                subject: "Budget Variance: {{cost_center}} - {{fiscal_period}}"
                body: "Budget: {{get-budget.total_budget}} | Actuals: {{get-actuals.total_actual}} | Variance: {{get-budget.variance_pct}}%"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: budget
          path: "/A_CostCenterBudget?$filter=CostCenter eq '{{CostCenter}}' and FiscalPeriod eq '{{FiscalPeriod}}'"
          inputParameters:
            - name: CostCenter
              in: query
            - name: FiscalPeriod
              in: query
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

When a new hire is created in SAP SuccessFactors, opens a ServiceNow onboarding ticket, provisions a Microsoft Teams workspace, and sends a welcome notification. Ensures day-one readiness for Airbus engineering and operations staff.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestration"
  description: "When a new hire is created in SAP SuccessFactors, opens a ServiceNow onboarding ticket, provisions a Microsoft Teams workspace, and sends a welcome notification. Ensures day-one readiness for Airbus engineering and operations staff."
  tags:
    - hr
    - onboarding
    - sap-successfactors
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a SuccessFactors employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, and Microsoft Teams. Invoke when a new hire record is confirmed in SuccessFactors."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SAP SuccessFactors employee ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in ISO 8601 format (YYYY-MM-DD)."
            - name: department
              in: body
              type: string
              description: "The department or business unit the employee is joining (e.g., Engineering, Operations)."
          steps:
            - name: get-employee
              type: call
              call: "successfactors.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: create-onboarding-ticket
              type: call
              call: "servicenow-onboard.create-incident"
              with:
                short_description: "Onboarding: {{get-employee.display_name}}"
                caller_id: "{{get-employee.manager_email}}"
                assignment_group: "IT Onboarding"
            - name: notify-teams
              type: call
              call: "msteams-hr.send-message"
              with:
                channel_id: "{{department}}-general"
                message: "Welcome {{get-employee.display_name}} joining on {{start_date}}!"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employee
          path: "/PerPerson('{{employee_id}}')"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: servicenow-onboard
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          inputParameters:
            - name: short_description
              in: body
            - name: caller_id
              in: body
            - name: assignment_group
              in: body
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-hr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Retrieves the group memberships of an Okta user by login email, returning group names and IDs for access review purposes.

naftiko: "0.5"
info:
  label: "Okta User Group Membership Lookup"
  description: "Retrieves the group memberships of an Okta user by login email, returning group names and IDs for access review purposes."
  tags:
    - security
    - okta
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-groups
          description: "Given an Okta user login email, retrieve all group memberships for access review."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The user's Okta login email."
          call: "okta.get-user-groups"
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: groups
              type: array
              mapping: "$.groups"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://airbus.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: get-user-groups
              method: GET

Retrieves the current on-call engineer for a given PagerDuty schedule, returning name, email, and rotation end time.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a given PagerDuty schedule, returning name, email, and rotation end time."
  tags:
    - it-operations
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-oncall
          description: "Given a PagerDuty schedule ID, retrieve the currently on-call engineer's name and contact details."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "The PagerDuty schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: oncall_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: oncall_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_api_key"
      resources:
        - name: oncalls
          path: "/oncalls?schedule_ids[]={{schedule_id}}"
          inputParameters:
            - name: schedule_id
              in: query
          operations:
            - name: get-oncall
              method: GET

Retrieves the paint shop queue from SAP, checks weather conditions via an external API for outdoor curing windows, and posts an optimized schedule to the operations Slack channel.

naftiko: "0.5"
info:
  label: "Paint Shop Scheduling Optimizer"
  description: "Retrieves the paint shop queue from SAP, checks weather conditions via an external API for outdoor curing windows, and posts an optimized schedule to the operations Slack channel."
  tags:
    - manufacturing
    - sap-s4hana
    - slack
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: optimize-paint-schedule
          description: "Given a facility code and date, retrieve queue and weather data to post an optimized paint schedule."
          inputParameters:
            - name: facility
              in: body
              type: string
              description: "The paint shop facility code."
            - name: schedule_date
              in: body
              type: string
              description: "The schedule date in YYYY-MM-DD."
          steps:
            - name: get-queue
              type: call
              call: "sap-s4.get-paint-queue"
              with:
                Plant: "{{facility}}"
                Date: "{{schedule_date}}"
            - name: post-schedule
              type: call
              call: "slack.post-message"
              with:
                channel: "paint-shop-ops"
                text: "Paint schedule for {{facility}} on {{schedule_date}} | Aircraft in queue: {{get-queue.count}} | Priority MSN: {{get-queue.results[0].MSN}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: paint-queue
          path: "/A_ProductionOrder_2?$filter=Plant eq '{{Plant}}' and OrderType eq 'PAINT' and ScheduledStartDate eq datetime'{{Date}}'"
          inputParameters:
            - name: Plant
              in: query
            - name: Date
              in: query
          operations:
            - name: get-paint-queue
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When an engineering change order (ECO) is approved in Teamcenter PLM, creates a linked Jira epic, notifies the affected engineering teams in Microsoft Teams, and updates the SAP production order. Bridges engineering design changes to manufacturing execution.

naftiko: "0.5"
info:
  label: "PLM Engineering Change Order Sync"
  description: "When an engineering change order (ECO) is approved in Teamcenter PLM, creates a linked Jira epic, notifies the affected engineering teams in Microsoft Teams, and updates the SAP production order. Bridges engineering design changes to manufacturing execution."
  tags:
    - engineering
    - plm
    - teamcenter
    - jira
    - sap-s4hana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plm-change
      port: 8080
      tools:
        - name: sync-engineering-change-order
          description: "Given a Teamcenter ECO ID and affected part number, create a Jira epic, notify engineering teams in Teams, and update the SAP production order status. Use when an approved ECO needs to propagate to project tracking and manufacturing."
          inputParameters:
            - name: eco_id
              in: body
              type: string
              description: "The Teamcenter engineering change order ID."
            - name: part_number
              in: body
              type: string
              description: "The affected aircraft part number."
            - name: affected_team
              in: body
              type: string
              description: "The engineering team channel to notify (e.g., structures-eng, avionics-eng)."
          steps:
            - name: get-eco-details
              type: call
              call: "teamcenter.get-eco"
              with:
                eco_id: "{{eco_id}}"
            - name: create-jira-epic
              type: call
              call: "jira-plm.create-issue"
              with:
                project_key: "PLM"
                summary: "ECO {{eco_id}}: {{get-eco-details.title}}"
                issue_type: "Epic"
            - name: notify-engineering-team
              type: call
              call: "msteams-plm.send-message"
              with:
                channel_id: "{{affected_team}}"
                message: "ECO {{eco_id}} approved for part {{part_number}}. Jira epic: {{create-jira-epic.key}}"
  consumes:
    - type: http
      namespace: teamcenter
      baseUri: "https://teamcenter.airbus.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.teamcenter_token"
      resources:
        - name: eco
          path: "/change-orders/{{eco_id}}"
          inputParameters:
            - name: eco_id
              in: path
          operations:
            - name: get-eco
              method: GET
    - type: http
      namespace: jira-plm
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: issue_type
              in: body
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-plm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Triggers a scheduled refresh of the Airbus program delivery Power BI dataset, validates the refresh completed successfully, and notifies the program management office via Microsoft Teams. Ensures leadership has current program status data.

naftiko: "0.5"
info:
  label: "Power BI Executive Delivery Dashboard Refresh"
  description: "Triggers a scheduled refresh of the Airbus program delivery Power BI dataset, validates the refresh completed successfully, and notifies the program management office via Microsoft Teams. Ensures leadership has current program status data."
  tags:
    - reporting
    - power-bi
    - microsoft-teams
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: executive-reporting
      port: 8080
      tools:
        - name: refresh-delivery-dashboard
          description: "Given a Power BI dataset ID, trigger a refresh, poll for completion, and notify the PMO Teams channel with the result. Use at the start of each business day or before executive program reviews."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the delivery dashboard."
            - name: report_name
              in: body
              type: string
              description: "The human-readable name of the report for notification purposes."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi-exec.trigger-refresh"
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-pmo
              type: call
              call: "msteams-exec.send-message"
              with:
                channel_id: "pmo-updates"
                message: "Power BI refresh triggered for {{report_name}}. Dataset: {{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi-exec
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refresh
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams-exec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Checks the refresh status of the manufacturing KPI Power BI dataset, returning last refresh time, status, and any failure messages.

naftiko: "0.5"
info:
  label: "Power BI Manufacturing KPI Dashboard Status"
  description: "Checks the refresh status of the manufacturing KPI Power BI dataset, returning last refresh time, status, and any failure messages."
  tags:
    - manufacturing
    - power-bi
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-manufacturing-kpi-refresh
          description: "Retrieve the Power BI manufacturing KPI dataset refresh status and last refresh timestamp."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the manufacturing KPI dashboard."
          call: "powerbi.get-refresh-history"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Generates a request for quotation by retrieving material specifications from SAP, pulling qualified suppliers from Ariba, and creating an RFQ document posted to the procurement SharePoint site.

naftiko: "0.5"
info:
  label: "Procurement RFQ Generation Workflow"
  description: "Generates a request for quotation by retrieving material specifications from SAP, pulling qualified suppliers from Ariba, and creating an RFQ document posted to the procurement SharePoint site."
  tags:
    - procurement
    - sap-s4hana
    - sap-ariba
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: generate-rfq
          description: "Given a material number and quantity, pull specs and suppliers to generate an RFQ document."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material number to source."
            - name: quantity
              in: body
              type: string
              description: "Required quantity."
            - name: delivery_date
              in: body
              type: string
              description: "Required delivery date in YYYY-MM-DD."
          steps:
            - name: get-material-spec
              type: call
              call: "sap-s4.get-material"
              with:
                MaterialNumber: "{{material_number}}"
            - name: get-suppliers
              type: call
              call: "ariba.get-qualified-suppliers"
              with:
                commodity: "{{get-material-spec.MaterialGroup}}"
            - name: upload-rfq
              type: call
              call: "sharepoint.upload-file"
              with:
                folder: "Procurement/RFQs"
                filename: "RFQ_{{material_number}}_{{delivery_date}}.json"
                content: "Material: {{get-material-spec.MaterialDescription}} | Qty: {{quantity}} | Delivery: {{delivery_date}} | Qualified suppliers: {{get-suppliers.count}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: materials
          path: "/A_Product('{{MaterialNumber}}')"
          inputParameters:
            - name: MaterialNumber
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_api_token"
      resources:
        - name: qualified-suppliers
          path: "/suppliers?commodity={{commodity}}&status=QUALIFIED"
          inputParameters:
            - name: commodity
              in: query
          operations:
            - name: get-qualified-suppliers
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT

When a production line downtime alert fires in Datadog, retrieves the affected line details from SAP, creates a PagerDuty incident, and posts an alert to the manufacturing operations Slack channel.

naftiko: "0.5"
info:
  label: "Production Line Downtime Response"
  description: "When a production line downtime alert fires in Datadog, retrieves the affected line details from SAP, creates a PagerDuty incident, and posts an alert to the manufacturing operations Slack channel."
  tags:
    - manufacturing
    - datadog
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: respond-to-downtime
          description: "Given a production line ID and alert details, look up the line in SAP, page the on-call engineer, and notify the ops channel."
          inputParameters:
            - name: line_id
              in: body
              type: string
              description: "The production line identifier."
            - name: alert_title
              in: body
              type: string
              description: "The Datadog alert title."
          steps:
            - name: get-line-info
              type: call
              call: "sap-s4.get-work-center"
              with:
                WorkCenter: "{{line_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Production downtime: Line {{line_id}} - {{alert_title}}"
                service_id: "manufacturing-ops"
                urgency: "high"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "mfg-operations"
                text: "Production Line {{line_id}} ({{get-line-info.WorkCenterName}}) is DOWN. PagerDuty incident: {{create-incident.incident.id}}. Alert: {{alert_title}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_WORKCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: work-centers
          path: "/A_WorkCenter('{{WorkCenter}}')"
          inputParameters:
            - name: WorkCenter
              in: path
          operations:
            - name: get-work-center
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Prepares for an EASA regulatory audit by gathering compliance documents from SharePoint, retrieving certification records from SAP QM, and compiling an audit readiness summary sent to the compliance team via email.

naftiko: "0.5"
info:
  label: "Regulatory Audit Preparation Workflow"
  description: "Prepares for an EASA regulatory audit by gathering compliance documents from SharePoint, retrieving certification records from SAP QM, and compiling an audit readiness summary sent to the compliance team via email."
  tags:
    - compliance
    - sharepoint
    - sap-s4hana
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: prepare-audit-package
          description: "Given an audit type and aircraft program, gather compliance documents, certification records, and email the readiness summary."
          inputParameters:
            - name: audit_type
              in: body
              type: string
              description: "The type of regulatory audit (e.g., EASA Part 21, DOA)."
            - name: program_code
              in: body
              type: string
              description: "The aircraft program code."
          steps:
            - name: get-documents
              type: call
              call: "sharepoint.search-documents"
              with:
                query: "{{audit_type}} {{program_code}} compliance"
            - name: get-certifications
              type: call
              call: "sap-qm.get-certificates"
              with:
                program: "{{program_code}}"
            - name: send-summary
              type: call
              call: "msgraph.send-mail"
              with:
                to: "compliance-team@airbus.com"
                subject: "Audit Readiness: {{audit_type}} - {{program_code}}"
                body: "Audit package prepared. Documents found: {{get-documents.result_count}}. Active certifications: {{get-certifications.cert_count}}. Review package in SharePoint."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-documents
              method: GET
    - type: http
      namespace: sap-qm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_QUALITYCERTIFICATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: certificates
          path: "/A_QualityCertificate?$filter=Program eq '{{program}}'"
          inputParameters:
            - name: program
              in: query
          operations:
            - name: get-certificates
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

When a workplace safety incident is reported, creates a case in ServiceNow, records the event in SAP EHS, and sends an immediate notification to the HSE leadership team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Safety Incident Report Orchestration"
  description: "When a workplace safety incident is reported, creates a case in ServiceNow, records the event in SAP EHS, and sends an immediate notification to the HSE leadership team via Microsoft Teams."
  tags:
    - safety
    - servicenow
    - sap-s4hana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Given incident details, create a ServiceNow case, log in SAP EHS, and notify HSE leadership."
          inputParameters:
            - name: incident_description
              in: body
              type: string
              description: "Description of the safety incident."
            - name: location
              in: body
              type: string
              description: "Location where the incident occurred."
            - name: severity
              in: body
              type: string
              description: "Severity level (low, medium, high, critical)."
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Safety incident: {{location}} - {{severity}}"
                description: "{{incident_description}}"
                priority: "1"
                category: "safety"
            - name: log-ehs
              type: call
              call: "sap-ehs.create-safety-event"
              with:
                Location: "{{location}}"
                Severity: "{{severity}}"
                Description: "{{incident_description}}"
            - name: notify-hse
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hse-leadership"
                message: "SAFETY INCIDENT at {{location}} | Severity: {{severity}} | ServiceNow: {{create-case.number}} | {{incident_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sap-ehs
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_EHS_INCIDENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: safety-events
          path: "/A_SafetyEvent"
          operations:
            - name: create-safety-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/hse-leadership/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Queries SAP Ariba for supplier contracts approaching renewal within a configurable lead time, creates Jira tracking tasks for the procurement team, and sends a summary notification to the sourcing manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Tracking"
  description: "Queries SAP Ariba for supplier contracts approaching renewal within a configurable lead time, creates Jira tracking tasks for the procurement team, and sends a summary notification to the sourcing manager in Microsoft Teams."
  tags:
    - procurement
    - contracts
    - sap-ariba
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-mgmt
      port: 8080
      tools:
        - name: track-contract-renewals
          description: "Given a number of days until expiry, retrieve Ariba contracts expiring within that window, create Jira tracking tasks, and notify the sourcing manager in Teams. Use for proactive contract renewal management."
          inputParameters:
            - name: days_to_expiry
              in: body
              type: integer
              description: "The number of days before contract expiry to trigger renewal tracking (e.g., 90, 60, 30)."
            - name: category
              in: body
              type: string
              description: "The procurement category to filter contracts (e.g., IT, Services, Manufacturing)."
          steps:
            - name: get-expiring-contracts
              type: call
              call: "sap-ariba-contract.list-contracts"
              with:
                daysToExpiry: "{{days_to_expiry}}"
                category: "{{category}}"
            - name: create-jira-task
              type: call
              call: "jira-contract.create-issue"
              with:
                project_key: "PROC"
                summary: "Contract renewals due in {{days_to_expiry}} days: {{category}}"
                description: "{{get-expiring-contracts.count}} contracts expiring within {{days_to_expiry}} days in category {{category}}."
                issue_type: "Task"
            - name: notify-sourcing-manager
              type: call
              call: "msteams-contract.send-message"
              with:
                channel_id: "sourcing-alerts"
                message: "{{get-expiring-contracts.count}} {{category}} contracts expiring in {{days_to_expiry}} days. Jira: {{create-jira-task.key}}"
  consumes:
    - type: http
      namespace: sap-ariba-contract
      baseUri: "https://openapi.ariba.com/api/contract/v1"
      authentication:
        type: apikey
        key: "apiKey"
        value: "$secrets.ariba_api_key"
        placement: query
      resources:
        - name: contracts
          path: "/contracts"
          inputParameters:
            - name: daysToExpiry
              in: query
            - name: category
              in: query
          operations:
            - name: list-contracts
              method: GET
    - type: http
      namespace: jira-contract
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: description
              in: body
            - name: issue_type
              in: body
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-contract
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Retrieves supplier profile details from SAP Ariba by supplier ID, returning qualification status, certifications, and risk rating.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Profile Lookup"
  description: "Retrieves supplier profile details from SAP Ariba by supplier ID, returning qualification status, certifications, and risk rating."
  tags:
    - procurement
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-supplier-profile
          description: "Given an Ariba supplier ID, retrieve the supplier's qualification status, certifications, and risk rating."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
          call: "ariba.get-supplier"
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.supplier.companyName"
            - name: qualification_status
              type: string
              mapping: "$.supplier.qualificationStatus"
            - name: risk_rating
              type: string
              mapping: "$.supplier.riskRating"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_api_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET

Retrieves submitted travel expense reports from SAP Concur for a given employee and fiscal period, returning report status, total amount, and approval chain. Used by finance and managers to monitor travel spend compliance.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Report Lookup"
  description: "Retrieves submitted travel expense reports from SAP Concur for a given employee and fiscal period, returning report status, total amount, and approval chain. Used by finance and managers to monitor travel spend compliance."
  tags:
    - finance
    - travel
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: travel-finance
      port: 8080
      tools:
        - name: get-expense-reports
          description: "Given an employee login ID and date range, retrieve all submitted expense reports from SAP Concur including status, amounts, and approver details. Use when reviewing employee travel spend or approving expense reports."
          inputParameters:
            - name: employee_login
              in: body
              type: string
              description: "The SAP Concur employee login ID (typically the corporate email)."
            - name: date_from
              in: body
              type: string
              description: "Start date for the report query in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date for the report query in YYYY-MM-DD format."
          call: "sap-concur.get-reports"
          with:
            userLoginID: "{{employee_login}}"
            submitDateBegin: "{{date_from}}"
            submitDateEnd: "{{date_to}}"
          outputParameters:
            - name: total_count
              type: integer
              mapping: "$.TotalCount"
            - name: items
              type: string
              mapping: "$.Items"
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reportdigests"
          inputParameters:
            - name: userLoginID
              in: query
            - name: submitDateBegin
              in: query
            - name: submitDateEnd
              in: query
          operations:
            - name: get-reports
              method: GET

Retrieves the current flight-hour cost allocation for a specific aircraft program from SAP S/4HANA, returning cost per hour, program code, and budget consumed.

naftiko: "0.5"
info:
  label: "SAP Flight Hour Cost Lookup"
  description: "Retrieves the current flight-hour cost allocation for a specific aircraft program from SAP S/4HANA, returning cost per hour, program code, and budget consumed."
  tags:
    - finance
    - sap-s4hana
    - aerospace
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-flight-hour-cost
          description: "Given an aircraft program code, retrieve the flight-hour cost allocation including cost per hour and budget consumed."
          inputParameters:
            - name: program_code
              in: body
              type: string
              description: "The aircraft program code (e.g., A320, A350)."
          call: "sap-s4.get-cost-center"
          with:
            CostCenter: "{{program_code}}"
          outputParameters:
            - name: cost_per_hour
              type: string
              mapping: "$.d.CostPerHour"
            - name: budget_consumed
              type: string
              mapping: "$.d.BudgetConsumed"
            - name: currency
              type: string
              mapping: "$.d.Currency"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{CostCenter}}')"
          inputParameters:
            - name: CostCenter
              in: path
          operations:
            - name: get-cost-center
              method: GET

When a goods movement reversal is needed, retrieves the original document from SAP, posts the reversal, and logs the action in ServiceNow for audit trail purposes.

naftiko: "0.5"
info:
  label: "SAP Goods Movement Reversal Handler"
  description: "When a goods movement reversal is needed, retrieves the original document from SAP, posts the reversal, and logs the action in ServiceNow for audit trail purposes."
  tags:
    - supply-chain
    - sap-s4hana
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: warehouse
      port: 8080
      tools:
        - name: reverse-goods-movement
          description: "Given a material document number, retrieve the original posting, execute reversal, and create an audit log."
          inputParameters:
            - name: material_doc
              in: body
              type: string
              description: "The SAP material document number to reverse."
            - name: reason
              in: body
              type: string
              description: "Reason for the reversal."
          steps:
            - name: get-original
              type: call
              call: "sap-s4.get-material-doc"
              with:
                MaterialDocument: "{{material_doc}}"
            - name: post-reversal
              type: call
              call: "sap-s4.create-reversal"
              with:
                OriginalDocument: "{{material_doc}}"
                ReversalReason: "{{reason}}"
            - name: log-audit
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_goods_movement_audit"
                original_doc: "{{material_doc}}"
                reversal_doc: "{{post-reversal.document_number}}"
                reason: "{{reason}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: material-docs
          path: "/A_MaterialDocumentHeader('{{MaterialDocument}}')"
          inputParameters:
            - name: MaterialDocument
              in: path
          operations:
            - name: get-material-doc
              method: GET
        - name: reversals
          path: "/A_MaterialDocumentHeader"
          operations:
            - name: create-reversal
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Reconciles intercompany billing documents between Airbus entities in SAP, flags discrepancies via Snowflake analysis, and creates a ServiceNow ticket for the finance shared services team.

naftiko: "0.5"
info:
  label: "SAP Intercompany Billing Reconciliation"
  description: "Reconciles intercompany billing documents between Airbus entities in SAP, flags discrepancies via Snowflake analysis, and creates a ServiceNow ticket for the finance shared services team."
  tags:
    - finance
    - sap-s4hana
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: reconcile-intercompany
          description: "Given sending and receiving company codes and a period, reconcile intercompany billing and flag discrepancies."
          inputParameters:
            - name: sending_company
              in: body
              type: string
              description: "The sending company code."
            - name: receiving_company
              in: body
              type: string
              description: "The receiving company code."
            - name: period
              in: body
              type: string
              description: "Fiscal period (e.g., 2026-03)."
          steps:
            - name: get-billing-docs
              type: call
              call: "sap-s4.get-intercompany-docs"
              with:
                SendingCompany: "{{sending_company}}"
                ReceivingCompany: "{{receiving_company}}"
                Period: "{{period}}"
            - name: find-discrepancies
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT doc_number, sender_amount, receiver_amount, ABS(sender_amount - receiver_amount) as diff FROM intercompany_recon WHERE sender = '{{sending_company}}' AND receiver = '{{receiving_company}}' AND period = '{{period}}' AND diff > 0"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "IC recon discrepancy: {{sending_company}} -> {{receiving_company}} ({{period}})"
                description: "Discrepancies found: {{find-discrepancies.row_count}} documents. Total billing docs: {{get-billing-docs.count}}"
                category: "finance"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: billing-docs
          path: "/A_BillingDocument?$filter=SenderCompany eq '{{SendingCompany}}' and ReceiverCompany eq '{{ReceivingCompany}}'"
          inputParameters:
            - name: SendingCompany
              in: query
            - name: ReceivingCompany
              in: query
          operations:
            - name: get-intercompany-docs
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries SAP S/4HANA for the current financial period close status across all Airbus legal entities, identifies open posting periods, and publishes a status report to Power BI for the finance leadership team.

naftiko: "0.5"
info:
  label: "SAP Period Close Status Check"
  description: "Queries SAP S/4HANA for the current financial period close status across all Airbus legal entities, identifies open posting periods, and publishes a status report to Power BI for the finance leadership team."
  tags:
    - finance
    - period-close
    - sap-s4hana
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: get-period-close-status
          description: "Given a fiscal year and period number, retrieve open/closed posting period status from SAP S/4HANA and trigger a Power BI refresh of the period close dashboard. Use during month-end close to monitor financial period status."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year to check (e.g., 2025)."
            - name: period
              in: body
              type: string
              description: "The fiscal period number (e.g., 01 for January)."
          steps:
            - name: get-posting-periods
              type: call
              call: "sap-s4-close.get-posting-periods"
              with:
                FiscalYear: "{{fiscal_year}}"
                FiscalPeriod: "{{period}}"
            - name: refresh-powerbi-dashboard
              type: call
              call: "powerbi-finance.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_period_close_dataset_id"
  consumes:
    - type: http
      namespace: sap-s4-close
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_FINANCIALACCOUNTING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: posting-periods
          path: "/A_FinancialAccountingPeriod"
          inputParameters:
            - name: FiscalYear
              in: query
            - name: FiscalPeriod
              in: query
          operations:
            - name: get-posting-periods
              method: GET
    - type: http
      namespace: powerbi-finance
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refresh
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Retrieves a plant maintenance order from SAP PM by order number, returning equipment, work center, priority, and current status.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Order Lookup"
  description: "Retrieves a plant maintenance order from SAP PM by order number, returning equipment, work center, priority, and current status."
  tags:
    - manufacturing
    - sap-s4hana
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: maintenance
      port: 8080
      tools:
        - name: get-maintenance-order
          description: "Given a maintenance order number, retrieve the order details including equipment, work center, and priority."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP plant maintenance order number."
          call: "sap-pm.get-order"
          with:
            MaintenanceOrder: "{{order_number}}"
          outputParameters:
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
            - name: work_center
              type: string
              mapping: "$.d.MainWorkCenter"
            - name: priority
              type: string
              mapping: "$.d.MaintenancePriority"
            - name: status
              type: string
              mapping: "$.d.MaintOrdBasicOrderStatus"
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: orders
          path: "/MaintenanceOrder('{{MaintenanceOrder}}')"
          inputParameters:
            - name: MaintenanceOrder
              in: path
          operations:
            - name: get-order
              method: GET

Retrieves the status of a production order from SAP S/4HANA by order number, returning order type, scheduled dates, and completion percentage.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Lookup"
  description: "Retrieves the status of a production order from SAP S/4HANA by order number, returning order type, scheduled dates, and completion percentage."
  tags:
    - manufacturing
    - sap-s4hana
    - production
capability:
  exposes:
    - type: mcp
      namespace: production
      port: 8080
      tools:
        - name: get-production-order
          description: "Given a production order number, retrieve order status, type, and completion percentage from SAP."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap-s4.get-production-order"
          with:
            ManufacturingOrder: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
            - name: order_type
              type: string
              mapping: "$.d.ManufacturingOrderType"
            - name: completion_pct
              type: string
              mapping: "$.d.CompletionPercent"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2('{{ManufacturingOrder}}')"
          inputParameters:
            - name: ManufacturingOrder
              in: path
          operations:
            - name: get-production-order
              method: GET

Retrieves purchase order details from SAP S/4HANA given a PO number. Used by procurement and finance teams to verify order status, supplier, and line-item details without accessing the ERP UI.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Retrieves purchase order details from SAP S/4HANA given a PO number. Used by procurement and finance teams to verify order status, supplier, and line-item details without accessing the ERP UI."
  tags:
    - finance
    - procurement
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given an SAP purchase order number, retrieve full PO details including supplier, line items, delivery date, and status from SAP S/4HANA. Use when an agent or user needs to verify PO data."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., 4500012345)."
          call: "sap-s4.get-purchase-order"
          with:
            PurchaseOrder: "{{po_number}}"
          outputParameters:
            - name: supplier
              type: string
              mapping: "$.d.Supplier"
            - name: status
              type: string
              mapping: "$.d.PurchaseOrderStatus"
            - name: total_net_amount
              type: string
              mapping: "$.d.PurchaseOrderNetAmount"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: purchase-order
          path: "/A_PurchaseOrder('{{PurchaseOrder}}')"
          inputParameters:
            - name: PurchaseOrder
              in: path
          operations:
            - name: get-purchase-order
              method: GET

Retrieves quality inspection lot details from SAP QM by inspection lot number, returning inspection status, defect count, and material reference.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves quality inspection lot details from SAP QM by inspection lot number, returning inspection status, defect count, and material reference."
  tags:
    - quality
    - sap-s4hana
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Given an inspection lot number, retrieve the quality inspection details including status and defect count."
          inputParameters:
            - name: lot_number
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: "sap-qm.get-inspection-lot"
          with:
            InspectionLot: "{{lot_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.InspectionLotStatus"
            - name: defect_count
              type: string
              mapping: "$.d.NumberOfDefects"
            - name: material
              type: string
              mapping: "$.d.Material"
  consumes:
    - type: http
      namespace: sap-qm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{InspectionLot}}')"
          inputParameters:
            - name: InspectionLot
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group for engineering and procurement teams.

naftiko: "0.5"
info:
  label: "SAP S/4 Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group for engineering and procurement teams."
  tags:
    - manufacturing
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: materials
      port: 8080
      tools:
        - name: get-material
          description: "Given a material number, retrieve the material master record from SAP S/4HANA including description, UoM, and material group."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap-s4.get-material"
          with:
            MaterialNumber: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: materials
          path: "/A_Product('{{MaterialNumber}}')"
          inputParameters:
            - name: MaterialNumber
              in: path
          operations:
            - name: get-material
              method: GET

Retrieves payroll processing results from SAP SuccessFactors for a given pay cycle, compares totals against the previous period in Snowflake, and flags any variance above threshold for finance review in a Jira task.

naftiko: "0.5"
info:
  label: "SAP SuccessFactors Payroll Reconciliation"
  description: "Retrieves payroll processing results from SAP SuccessFactors for a given pay cycle, compares totals against the previous period in Snowflake, and flags any variance above threshold for finance review in a Jira task."
  tags:
    - hr
    - payroll
    - sap-successfactors
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: payroll-ops
      port: 8080
      tools:
        - name: reconcile-payroll
          description: "Given a pay cycle ID and variance threshold percentage, retrieve payroll totals from SuccessFactors, compare against the prior period stored in Snowflake, and create a Jira task if variance exceeds the threshold. Use for pay cycle reconciliation."
          inputParameters:
            - name: pay_cycle_id
              in: body
              type: string
              description: "The SAP SuccessFactors pay cycle ID to reconcile."
            - name: variance_threshold_pct
              in: body
              type: number
              description: "The percentage variance above which a Jira review task is created (e.g., 5.0 for 5%)."
          steps:
            - name: get-payroll-results
              type: call
              call: "successfactors-payroll.get-pay-run"
              with:
                payCycleId: "{{pay_cycle_id}}"
            - name: query-prior-period
              type: call
              call: "snowflake-payroll.query-prior-period"
              with:
                pay_cycle_id: "{{pay_cycle_id}}"
            - name: create-variance-task
              type: call
              call: "jira-payroll.create-issue"
              with:
                project_key: "PAY"
                summary: "Payroll variance alert: {{pay_cycle_id}}"
                description: "Variance of {{variance_threshold_pct}}% detected versus prior period. Finance review required."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: successfactors-payroll
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: pay-run
          path: "/PaymentInformation(payCycleId='{{payCycleId}}')"
          inputParameters:
            - name: payCycleId
              in: path
          operations:
            - name: get-pay-run
              method: GET
    - type: http
      namespace: snowflake-payroll
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: prior-period
          path: "/statements"
          inputParameters:
            - name: pay_cycle_id
              in: body
          operations:
            - name: query-prior-period
              method: POST
    - type: http
      namespace: jira-payroll
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: description
              in: body
            - name: issue_type
              in: body
          operations:
            - name: create-issue
              method: POST

Retrieves the status of a vendor invoice in SAP by invoice document number, returning payment status, amount, and posting date.

naftiko: "0.5"
info:
  label: "SAP Vendor Invoice Status Lookup"
  description: "Retrieves the status of a vendor invoice in SAP by invoice document number, returning payment status, amount, and posting date."
  tags:
    - finance
    - sap-s4hana
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-invoice-status
          description: "Given an SAP invoice document number, retrieve the payment status, amount, and posting date."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
          call: "sap-s4.get-invoice"
          with:
            SupplierInvoice: "{{invoice_number}}"
          outputParameters:
            - name: payment_status
              type: string
              mapping: "$.d.PaymentStatus"
            - name: amount
              type: string
              mapping: "$.d.InvoiceGrossAmount"
            - name: posting_date
              type: string
              mapping: "$.d.PostingDate"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{SupplierInvoice}}')"
          inputParameters:
            - name: SupplierInvoice
              in: path
          operations:
            - name: get-invoice
              method: GET

When satellite telemetry anomalies are detected in Snowflake, creates a Jira investigation ticket for the space systems team and sends an urgent notification to the mission control Slack channel.

naftiko: "0.5"
info:
  label: "Satellite Program Telemetry Alert"
  description: "When satellite telemetry anomalies are detected in Snowflake, creates a Jira investigation ticket for the space systems team and sends an urgent notification to the mission control Slack channel."
  tags:
    - aerospace
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: space-systems
      port: 8080
      tools:
        - name: handle-telemetry-anomaly
          description: "Given a satellite ID and anomaly type, retrieve telemetry context, create an investigation ticket, and alert mission control."
          inputParameters:
            - name: satellite_id
              in: body
              type: string
              description: "The satellite identifier."
            - name: anomaly_type
              in: body
              type: string
              description: "Type of telemetry anomaly detected."
          steps:
            - name: get-telemetry
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT timestamp, subsystem, value, threshold FROM satellite_telemetry WHERE satellite_id = '{{satellite_id}}' AND anomaly_flag = TRUE ORDER BY timestamp DESC LIMIT 10"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SPACE"
                summary: "Telemetry anomaly: {{satellite_id}} - {{anomaly_type}}"
                description: "Anomalous readings detected. Recent anomalies: {{get-telemetry.row_count}}"
                issuetype: "Bug"
                priority: "Critical"
            - name: alert-mission-control
              type: call
              call: "slack.post-message"
              with:
                channel: "mission-control"
                text: "TELEMETRY ANOMALY: Satellite {{satellite_id}} | Type: {{anomaly_type}} | Investigation: {{create-ticket.key}} | {{get-telemetry.row_count}} anomalous readings in recent window"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a critical CVE is reported, queries the Datadog security signals feed, creates a ServiceNow security incident, assigns it to the appropriate security team, and notifies the CISO office via Microsoft Teams. Accelerates Airbus vulnerability response.

naftiko: "0.5"
info:
  label: "Security CVE Vulnerability Triage"
  description: "When a critical CVE is reported, queries the Datadog security signals feed, creates a ServiceNow security incident, assigns it to the appropriate security team, and notifies the CISO office via Microsoft Teams. Accelerates Airbus vulnerability response."
  tags:
    - security
    - cve
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-cve
          description: "Given a CVE identifier and affected system, retrieve security signals from Datadog, create a ServiceNow security incident, and notify the security team in Teams. Use when a critical or high CVE requires immediate triage."
          inputParameters:
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier (e.g., CVE-2024-12345)."
            - name: affected_system
              in: body
              type: string
              description: "The name or identifier of the affected system or application."
            - name: severity
              in: body
              type: string
              description: "The CVE severity level (critical, high, medium, low)."
          steps:
            - name: get-security-signals
              type: call
              call: "datadog-sec.list-signals"
              with:
                query: "cve:{{cve_id}}"
            - name: create-security-incident
              type: call
              call: "servicenow-sec.create-incident"
              with:
                short_description: "CVE {{cve_id}} on {{affected_system}}"
                category: "Security"
                priority: "1"
            - name: notify-security-team
              type: call
              call: "msteams-sec.send-message"
              with:
                channel_id: "security-alerts"
                message: "CVE {{cve_id}} ({{severity}}) detected on {{affected_system}}. Incident: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: datadog-sec
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: signals
          path: "/security_analytics/signals/search"
          inputParameters:
            - name: query
              in: body
          operations:
            - name: list-signals
              method: POST
    - type: http
      namespace: servicenow-sec
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          inputParameters:
            - name: short_description
              in: body
            - name: category
              in: body
            - name: priority
              in: body
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-sec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

When a new service bulletin is published, identifies affected operators from Snowflake fleet data, creates distribution records in Salesforce, and sends notification emails via Microsoft Graph.

naftiko: "0.5"
info:
  label: "Service Bulletin Distribution Tracker"
  description: "When a new service bulletin is published, identifies affected operators from Snowflake fleet data, creates distribution records in Salesforce, and sends notification emails via Microsoft Graph."
  tags:
    - customer-support
    - snowflake
    - salesforce
    - microsoft-graph
    - aerospace
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: distribute-service-bulletin
          description: "Given a service bulletin number and affected aircraft type, identify operators and distribute the bulletin."
          inputParameters:
            - name: sb_number
              in: body
              type: string
              description: "The service bulletin number."
            - name: aircraft_type
              in: body
              type: string
              description: "The affected aircraft type."
          steps:
            - name: get-affected-operators
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT DISTINCT operator_name, operator_email, aircraft_count FROM fleet_registry WHERE aircraft_type = '{{aircraft_type}}' AND status = 'IN_SERVICE'"
            - name: create-distribution-records
              type: call
              call: "salesforce.create-distribution"
              with:
                sb_number: "{{sb_number}}"
                operator_count: "{{get-affected-operators.row_count}}"
            - name: send-notifications
              type: call
              call: "msgraph.send-mail"
              with:
                to: "sb-distribution@airbus.com"
                subject: "Service Bulletin {{sb_number}} - {{aircraft_type}} Distribution"
                body: "SB {{sb_number}} distributed to {{get-affected-operators.row_count}} operators for {{aircraft_type}} fleet. Distribution record: {{create-distribution-records.id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbus.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: distributions
          path: "/sobjects/SB_Distribution__c"
          operations:
            - name: create-distribution
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Submits a change request in ServiceNow for a planned infrastructure or software modification, retrieves the change advisory board (CAB) schedule, and notifies approvers via Microsoft Teams. Supports Airbus ITIL-compliant change governance.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management Approval"
  description: "Submits a change request in ServiceNow for a planned infrastructure or software modification, retrieves the change advisory board (CAB) schedule, and notifies approvers via Microsoft Teams. Supports Airbus ITIL-compliant change governance."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change title, risk level, and planned start date, create a ServiceNow change request and notify the CAB approval group in Teams. Use when a planned change to production systems needs formal approval."
          inputParameters:
            - name: change_title
              in: body
              type: string
              description: "The title of the change request (e.g., SAP S/4HANA upgrade to 2025)."
            - name: risk_level
              in: body
              type: string
              description: "The change risk level (low, medium, high)."
            - name: planned_start
              in: body
              type: string
              description: "Planned start date and time in ISO 8601 format."
            - name: assigned_group
              in: body
              type: string
              description: "The ServiceNow assignment group responsible for the change."
          steps:
            - name: create-change-request
              type: call
              call: "servicenow-change.create-change"
              with:
                short_description: "{{change_title}}"
                risk: "{{risk_level}}"
                start_date: "{{planned_start}}"
                assignment_group: "{{assigned_group}}"
            - name: notify-cab
              type: call
              call: "msteams-change.send-message"
              with:
                channel_id: "cab-approvals"
                message: "New change request pending approval: {{change_title}} ({{risk_level}} risk). CHG: {{create-change-request.number}}. Planned: {{planned_start}}"
  consumes:
    - type: http
      namespace: servicenow-change
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: change
          path: "/table/change_request"
          inputParameters:
            - name: short_description
              in: body
            - name: risk
              in: body
            - name: start_date
              in: body
            - name: assignment_group
              in: body
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-change
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Retrieves the current status of a ServiceNow incident by incident number, returning priority, state, assigned group, and short description.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current status of a ServiceNow incident by incident number, returning priority, state, assigned group, and short description."
  tags:
    - it-operations
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, retrieve its current state, priority, and assignment group."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Searches the Airbus SharePoint document library for technical documents by keyword, returning document title, URL, and last modified date.

naftiko: "0.5"
info:
  label: "SharePoint Technical Document Retrieval"
  description: "Searches the Airbus SharePoint document library for technical documents by keyword, returning document title, URL, and last modified date."
  tags:
    - engineering
    - sharepoint
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: search-technical-docs
          description: "Search the SharePoint technical document library for files matching a keyword."
          inputParameters:
            - name: keyword
              in: body
              type: string
              description: "The search keyword."
          call: "sharepoint.search-documents"
          with:
            query: "{{keyword}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-documents
              method: GET

Retrieves recent message history from an Airbus engineering Slack channel, returning messages with timestamps and authors.

naftiko: "0.5"
info:
  label: "Slack Engineering Channel History"
  description: "Retrieves recent message history from an Airbus engineering Slack channel, returning messages with timestamps and authors."
  tags:
    - collaboration
    - slack
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: get-slack-history
          description: "Given a Slack channel ID, retrieve the latest messages including sender and timestamp."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The Slack channel ID."
          call: "slack.get-history"
          with:
            channel: "{{channel_id}}"
          outputParameters:
            - name: messages
              type: array
              mapping: "$.messages"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: conversations
          path: "/conversations.history?channel={{channel}}&limit=20"
          inputParameters:
            - name: channel
              in: query
          operations:
            - name: get-history
              method: GET

Queries Snowflake for pipeline execution status of manufacturing data feeds, identifies failed or stalled jobs, and creates Jira tickets for data engineering follow-up. Ensures continuous data availability for Airbus production analytics.

naftiko: "0.5"
info:
  label: "Snowflake Manufacturing Data Pipeline Health Check"
  description: "Queries Snowflake for pipeline execution status of manufacturing data feeds, identifies failed or stalled jobs, and creates Jira tickets for data engineering follow-up. Ensures continuous data availability for Airbus production analytics."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Given a Snowflake pipeline name prefix, query job execution history, identify failures, and open Jira tickets for each failed job. Use for daily or on-demand data pipeline health checks."
          inputParameters:
            - name: pipeline_prefix
              in: body
              type: string
              description: "The Snowflake task name prefix to filter pipelines (e.g., MFG_, SUPPLY_)."
            - name: lookback_hours
              in: body
              type: integer
              description: "Number of hours to look back for failed tasks."
          steps:
            - name: query-snowflake-tasks
              type: call
              call: "snowflake-data.query-tasks"
              with:
                prefix: "{{pipeline_prefix}}"
                hours: "{{lookback_hours}}"
            - name: create-jira-for-failures
              type: call
              call: "jira-data.create-issue"
              with:
                project_key: "DATA"
                summary: "Pipeline failures detected: {{pipeline_prefix}}"
                description: "{{query-snowflake-tasks.failed_count}} tasks failed in the last {{lookback_hours}} hours."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: snowflake-data
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: tasks
          path: "/statements"
          inputParameters:
            - name: prefix
              in: body
            - name: hours
              in: body
          operations:
            - name: query-tasks
              method: POST
    - type: http
      namespace: jira-data
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue
          path: "/issue"
          inputParameters:
            - name: project_key
              in: body
            - name: summary
              in: body
            - name: description
              in: body
            - name: issue_type
              in: body
          operations:
            - name: create-issue
              method: POST

Queries the Snowflake data warehouse for current parts inventory levels by part number, returning stock quantity, warehouse location, and reorder threshold.

naftiko: "0.5"
info:
  label: "Snowflake Parts Inventory Query"
  description: "Queries the Snowflake data warehouse for current parts inventory levels by part number, returning stock quantity, warehouse location, and reorder threshold."
  tags:
    - manufacturing
    - snowflake
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-parts-inventory
          description: "Given a part number, query Snowflake for current inventory levels, warehouse location, and reorder status."
          inputParameters:
            - name: part_number
              in: body
              type: string
              description: "The aerospace part number."
          call: "snowflake.run-query"
          with:
            query: "SELECT part_number, stock_qty, warehouse, reorder_threshold FROM parts_inventory WHERE part_number = '{{part_number}}'"
          outputParameters:
            - name: stock_qty
              type: string
              mapping: "$.data[0].STOCK_QTY"
            - name: warehouse
              type: string
              mapping: "$.data[0].WAREHOUSE"
            - name: reorder_threshold
              type: string
              mapping: "$.data[0].REORDER_THRESHOLD"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Retrieves completed story points from Jira for the last sprint across engineering squads, computes velocity trends, and publishes the digest to a Confluence page and posts a summary to the Teams engineering channel. Supports Airbus agile delivery tracking.

naftiko: "0.5"
info:
  label: "Sprint Velocity Digest"
  description: "Retrieves completed story points from Jira for the last sprint across engineering squads, computes velocity trends, and publishes the digest to a Confluence page and posts a summary to the Teams engineering channel. Supports Airbus agile delivery tracking."
  tags:
    - devops
    - reporting
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: digest-sprint-velocity
          description: "Given a Jira project key and sprint ID, retrieve completed story points, compute velocity, publish a Confluence page, and post a summary to Teams. Use at the end of each sprint to distribute velocity metrics."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key (e.g., ENG, AVIONICS)."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira-agile.get-sprint-issues"
              with:
                project_key: "{{project_key}}"
                sprint_id: "{{sprint_id}}"
            - name: publish-confluence-page
              type: call
              call: "confluence-agile.create-page"
              with:
                space_key: "ENG"
                title: "Sprint Velocity Report — {{project_key}} Sprint {{sprint_id}}"
                body: "Story points completed: {{get-sprint-issues.completed_points}}"
            - name: notify-teams
              type: call
              call: "msteams-agile.send-message"
              with:
                channel_id: "engineering-metrics"
                message: "Sprint {{sprint_id}} complete: {{get-sprint-issues.completed_points}} story points. Report: {{publish-confluence-page.url}}"
  consumes:
    - type: http
      namespace: jira-agile
      baseUri: "https://airbus.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/search"
          inputParameters:
            - name: project_key
              in: query
            - name: sprint_id
              in: query
          operations:
            - name: get-sprint-issues
              method: GET
    - type: http
      namespace: confluence-agile
      baseUri: "https://airbus.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: page
          path: "/content"
          inputParameters:
            - name: space_key
              in: body
            - name: title
              in: body
            - name: body
              in: body
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams-agile
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Checks mandatory training compliance for a department in SuccessFactors, identifies overdue learners, and sends reminder notifications to their managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SuccessFactors Learning Compliance Tracker"
  description: "Checks mandatory training compliance for a department in SuccessFactors, identifies overdue learners, and sends reminder notifications to their managers via Microsoft Teams."
  tags:
    - hr
    - sap-successfactors
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Given a department and training course ID, find overdue learners and notify their managers."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to check."
            - name: course_id
              in: body
              type: string
              description: "The mandatory training course ID."
          steps:
            - name: get-overdue
              type: call
              call: "successfactors.get-overdue-learners"
              with:
                department: "{{department}}"
                courseId: "{{course_id}}"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{department}}-managers"
                message: "Training compliance alert: {{get-overdue.count}} employees in {{department}} are overdue on course {{course_id}}. Please ensure completion by end of month."
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: learning
          path: "/LearningHistoryV2?$filter=department eq '{{department}}' and courseId eq '{{courseId}}' and status eq 'OVERDUE'"
          inputParameters:
            - name: department
              in: query
            - name: courseId
              in: query
          operations:
            - name: get-overdue-learners
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates the annual performance review cycle by retrieving the active employee roster from SuccessFactors, creating review forms, and notifying managers via Microsoft Teams to begin evaluations.

naftiko: "0.5"
info:
  label: "SuccessFactors Performance Review Kickoff"
  description: "Initiates the annual performance review cycle by retrieving the active employee roster from SuccessFactors, creating review forms, and notifying managers via Microsoft Teams to begin evaluations."
  tags:
    - hr
    - sap-successfactors
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: kickoff-performance-reviews
          description: "Given a review cycle ID and department, initiate the performance review process and notify managers."
          inputParameters:
            - name: cycle_id
              in: body
              type: string
              description: "The performance review cycle identifier."
            - name: department
              in: body
              type: string
              description: "The department to initiate reviews for."
          steps:
            - name: get-roster
              type: call
              call: "successfactors.get-active-employees"
              with:
                department: "{{department}}"
            - name: create-forms
              type: call
              call: "successfactors.create-review-forms"
              with:
                cycleId: "{{cycle_id}}"
                department: "{{department}}"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{department}}-managers"
                message: "Performance review cycle {{cycle_id}} has been initiated for {{department}}. {{get-roster.count}} employees enrolled. {{create-forms.forms_created}} review forms created. Please begin evaluations."
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employees
          path: "/PerPerson?$filter=department eq '{{department}}' and status eq 'ACTIVE'"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: get-active-employees
              method: GET
        - name: review-forms
          path: "/FormContent"
          operations:
            - name: create-review-forms
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current time-off balance for an employee from SAP SuccessFactors, returning available days by leave type.

naftiko: "0.5"
info:
  label: "SuccessFactors Time Off Balance Check"
  description: "Retrieves the current time-off balance for an employee from SAP SuccessFactors, returning available days by leave type."
  tags:
    - hr
    - sap-successfactors
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given an employee ID, retrieve their current time-off balances by leave type from SuccessFactors."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SuccessFactors employee ID."
          call: "successfactors.get-time-off"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: balances
              type: array
              mapping: "$.d.results"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: time-off
          path: "/EmployeeTimeBalance?$filter=userId eq '{{employee_id}}'"
          inputParameters:
            - name: employee_id
              in: query
          operations:
            - name: get-time-off
              method: GET

When a quality non-conformance is detected, retrieves supplier details from SAP Ariba, creates a Jira ticket for the quality team, and sends an escalation notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Non-Conformance Escalation"
  description: "When a quality non-conformance is detected, retrieves supplier details from SAP Ariba, creates a Jira ticket for the quality team, and sends an escalation notification via Microsoft Teams."
  tags:
    - quality
    - sap-ariba
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: escalate-non-conformance
          description: "Given a supplier ID and non-conformance description, retrieve supplier details, create a quality Jira ticket, and notify the team."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: nc_description
              in: body
              type: string
              description: "Description of the non-conformance."
            - name: part_number
              in: body
              type: string
              description: "The affected part number."
          steps:
            - name: get-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{supplier_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "QUAL"
                summary: "NC: {{get-supplier.companyName}} - Part {{part_number}}"
                description: "{{nc_description}}"
                issuetype: "Bug"
                priority: "High"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality-engineering"
                message: "Non-conformance escalated for {{get-supplier.companyName}} | Part: {{part_number}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_api_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.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: messages
          path: "/teams/quality-engineering/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When a supplier quality deviation is reported via SAP Quality Management, creates a ServiceNow case, enriches supplier data from SAP Ariba, and notifies the quality assurance team. Accelerates supplier non-conformance resolution across Airbus supply chain.

naftiko: "0.5"
info:
  label: "Supplier Quality Deviation Triage"
  description: "When a supplier quality deviation is reported via SAP Quality Management, creates a ServiceNow case, enriches supplier data from SAP Ariba, and notifies the quality assurance team. Accelerates supplier non-conformance resolution across Airbus supply chain."
  tags:
    - quality
    - supply-chain
    - sap-qm
    - servicenow
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: handle-supplier-deviation
          description: "Given a SAP quality notification ID and supplier number, create a ServiceNow quality case, retrieve Ariba supplier profile, and notify the QA team in Teams. Use when a supplier quality deviation requires cross-functional escalation."
          inputParameters:
            - name: notification_id
              in: body
              type: string
              description: "The SAP quality notification ID (e.g., QM-2024-001234)."
            - name: supplier_number
              in: body
              type: string
              description: "The SAP supplier number associated with the deviation."
          steps:
            - name: get-qm-notification
              type: call
              call: "sap-qm.get-notification"
              with:
                notification_id: "{{notification_id}}"
            - name: get-ariba-supplier
              type: call
              call: "sap-ariba-qa.get-supplier"
              with:
                supplierId: "{{supplier_number}}"
            - name: create-snow-case
              type: call
              call: "servicenow-qa.create-case"
              with:
                short_description: "Supplier deviation: {{get-qm-notification.short_text}}"
                category: "Quality"
                priority: "2"
  consumes:
    - type: http
      namespace: sap-qm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: notification
          path: "/A_QualityNotification('{{notification_id}}')"
          inputParameters:
            - name: notification_id
              in: path
          operations:
            - name: get-notification
              method: GET
    - type: http
      namespace: sap-ariba-qa
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: apikey
        key: "apiKey"
        value: "$secrets.ariba_api_key"
        placement: query
      resources:
        - name: supplier
          path: "/suppliers/{{supplierId}}"
          inputParameters:
            - name: supplierId
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: servicenow-qa
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: case
          path: "/table/sn_customerservice_case"
          inputParameters:
            - name: short_description
              in: body
            - name: category
              in: body
            - name: priority
              in: body
          operations:
            - name: create-case
              method: POST

When a supply chain disruption is reported, retrieves affected purchase orders from SAP, identifies impacted production schedules in Snowflake, and creates an escalation ticket in ServiceNow.

naftiko: "0.5"
info:
  label: "Supply Chain Disruption Alert Handler"
  description: "When a supply chain disruption is reported, retrieves affected purchase orders from SAP, identifies impacted production schedules in Snowflake, and creates an escalation ticket in ServiceNow."
  tags:
    - supply-chain
    - sap-s4hana
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: handle-disruption
          description: "Given a supplier ID and disruption details, identify affected POs, impacted schedules, and create an escalation ticket."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The affected supplier ID."
            - name: disruption_type
              in: body
              type: string
              description: "Type of disruption (e.g., delay, quality, force-majeure)."
          steps:
            - name: get-affected-pos
              type: call
              call: "sap-s4.get-open-pos"
              with:
                Supplier: "{{supplier_id}}"
            - name: check-production-impact
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT program, line, scheduled_date FROM production_schedule WHERE supplier_id = '{{supplier_id}}' AND status = 'PENDING'"
            - name: create-escalation
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Supply chain disruption: {{disruption_type}} - Supplier {{supplier_id}}"
                priority: "2"
                category: "supply_chain"
                description: "Affected POs: {{get-affected-pos.count}}. Impacted production lines: {{check-production-impact.row_count}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder?$filter=Supplier eq '{{Supplier}}' and PurchasingDocumentDeletionCode eq ''"
          inputParameters:
            - name: Supplier
              in: query
          operations:
            - name: get-open-pos
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Pulls open requisitions from SAP SuccessFactors, enriches with LinkedIn candidate pipeline data, and posts a weekly talent pipeline summary to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Talent Acquisition Pipeline Review"
  description: "Pulls open requisitions from SAP SuccessFactors, enriches with LinkedIn candidate pipeline data, and posts a weekly talent pipeline summary to the HR leadership Teams channel."
  tags:
    - hr
    - sap-successfactors
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: review-talent-pipeline
          description: "Given a department filter, compile open reqs, candidate pipeline data, and post the summary."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "Department to filter requisitions."
          steps:
            - name: get-open-reqs
              type: call
              call: "successfactors.get-requisitions"
              with:
                department: "{{department}}"
                status: "OPEN"
            - name: get-pipeline
              type: call
              call: "linkedin.get-pipeline"
              with:
                company: "airbus"
                department: "{{department}}"
            - name: post-summary
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hr-leadership"
                message: "Talent Pipeline: {{department}} | Open reqs: {{get-open-reqs.count}} | Active candidates: {{get-pipeline.active_candidates}} | Interviews scheduled: {{get-pipeline.interviews_this_week}}"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://airbus.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: requisitions
          path: "/JobRequisition?$filter=department eq '{{department}}' and status eq '{{status}}'"
          inputParameters:
            - name: department
              in: query
            - name: status
              in: query
          operations:
            - name: get-requisitions
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: pipeline
          path: "/talentPipeline?company={{company}}&department={{department}}"
          inputParameters:
            - name: company
              in: query
            - name: department
              in: query
          operations:
            - name: get-pipeline
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/hr-leadership/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Applies a Terraform Cloud workspace run to provision or update Airbus cloud infrastructure, then logs the run outcome to Datadog and notifies the platform engineering team. Automates infrastructure-as-code deployments for Airbus Azure and multi-cloud environments.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning"
  description: "Applies a Terraform Cloud workspace run to provision or update Airbus cloud infrastructure, then logs the run outcome to Datadog and notifies the platform engineering team. Automates infrastructure-as-code deployments for Airbus Azure and multi-cloud environments."
  tags:
    - cloud
    - infrastructure
    - terraform
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and target environment, trigger a plan-and-apply run, poll for completion, log the outcome to Datadog, and notify the platform team in Teams. Use when infrastructure changes need to be applied."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID to run (e.g., ws-abc123)."
            - name: environment
              in: body
              type: string
              description: "The target environment (e.g., prod, staging, dev)."
          steps:
            - name: create-terraform-run
              type: call
              call: "terraform-cloud.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                auto_apply: true
            - name: log-datadog-event
              type: call
              call: "datadog-infra.create-event"
              with:
                title: "Terraform run triggered: {{workspace_id}}"
                text: "Run {{create-terraform-run.run_id}} started for {{environment}}"
                tags: "env:{{environment}},workspace:{{workspace_id}}"
            - name: notify-platform-team
              type: call
              call: "msteams-infra.send-message"
              with:
                channel_id: "platform-engineering"
                message: "Terraform run started for {{workspace_id}} ({{environment}}). Run ID: {{create-terraform-run.run_id}}"
  consumes:
    - type: http
      namespace: terraform-cloud
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: run
          path: "/runs"
          inputParameters:
            - name: workspace_id
              in: body
            - name: auto_apply
              in: body
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: datadog-infra
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: event
          path: "/events"
          inputParameters:
            - name: title
              in: body
            - name: text
              in: body
            - name: tags
              in: body
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams-infra
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: message
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
            - name: message
              in: body
          operations:
            - name: send-message
              method: POST

Queries SAP PM for tooling assets with upcoming calibration due dates, creates ServiceNow work orders for the maintenance team, and sends a summary to the tooling Slack channel.

naftiko: "0.5"
info:
  label: "Tooling Calibration Due Alert"
  description: "Queries SAP PM for tooling assets with upcoming calibration due dates, creates ServiceNow work orders for the maintenance team, and sends a summary to the tooling Slack channel."
  tags:
    - manufacturing
    - sap-s4hana
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: maintenance
      port: 8080
      tools:
        - name: alert-calibration-due
          description: "Given a facility code and date range, find tools due for calibration, create work orders, and notify the team."
          inputParameters:
            - name: facility_code
              in: body
              type: string
              description: "The manufacturing facility code."
            - name: days_ahead
              in: body
              type: string
              description: "Number of days to look ahead for calibration due dates."
          steps:
            - name: get-due-tools
              type: call
              call: "sap-pm.get-calibration-due"
              with:
                Plant: "{{facility_code}}"
                DaysAhead: "{{days_ahead}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Calibration batch: {{facility_code}} - {{get-due-tools.count}} tools due"
                category: "maintenance"
                priority: "3"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "tooling-maintenance"
                text: "Calibration alert for {{facility_code}}: {{get-due-tools.count}} tools due in next {{days_ahead}} days. ServiceNow: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: calibration
          path: "/MaintenanceOrder?$filter=Plant eq '{{Plant}}' and OrderType eq 'CALIB'"
          inputParameters:
            - name: Plant
              in: query
          operations:
            - name: get-calibration-due
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Pulls submitted travel expense reports from SAP Concur, validates against corporate policy thresholds in Snowflake, and flags non-compliant reports by creating ServiceNow audit tickets.

naftiko: "0.5"
info:
  label: "Travel Expense Compliance Audit"
  description: "Pulls submitted travel expense reports from SAP Concur, validates against corporate policy thresholds in Snowflake, and flags non-compliant reports by creating ServiceNow audit tickets."
  tags:
    - finance
    - sap-concur
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: audit-travel-expenses
          description: "Given a reporting period, pull expense reports, validate compliance, and flag violations."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-03)."
          steps:
            - name: get-expense-reports
              type: call
              call: "concur.get-reports"
              with:
                period: "{{period}}"
                status: "APPROVED"
            - name: check-compliance
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT report_id, employee_name, total_amount, policy_limit, (total_amount - policy_limit) as excess FROM expense_reports WHERE period = '{{period}}' AND total_amount > policy_limit"
            - name: flag-violations
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Travel expense compliance violations: {{period}}"
                description: "{{check-compliance.row_count}} reports exceed policy limits. Total approved reports: {{get-expense-reports.count}}"
                category: "audit"
  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?approvalStatus={{status}}&modifiedAfter={{period}}"
          inputParameters:
            - name: status
              in: query
            - name: period
              in: query
          operations:
            - name: get-reports
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbus.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves outstanding vendor invoices from SAP, cross-references payment records in the treasury system, and generates a reconciliation report posted to the finance SharePoint site.

naftiko: "0.5"
info:
  label: "Vendor Payment Reconciliation Workflow"
  description: "Retrieves outstanding vendor invoices from SAP, cross-references payment records in the treasury system, and generates a reconciliation report posted to the finance SharePoint site."
  tags:
    - finance
    - sap-s4hana
    - sharepoint
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: reconcile-vendor-payments
          description: "Given a vendor ID and date range, pull invoices from SAP, check payment status, and upload reconciliation report to SharePoint."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-invoices
              type: call
              call: "sap-s4.get-vendor-invoices"
              with:
                Supplier: "{{vendor_id}}"
                PostingDateFrom: "{{date_from}}"
                PostingDateTo: "{{date_to}}"
            - name: get-payments
              type: call
              call: "sap-s4.get-payment-docs"
              with:
                Supplier: "{{vendor_id}}"
                ClearingDateFrom: "{{date_from}}"
                ClearingDateTo: "{{date_to}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                folder: "Finance/Reconciliation"
                filename: "recon_{{vendor_id}}_{{date_from}}_{{date_to}}.json"
                content: "Invoices: {{get-invoices.count}}, Payments: {{get-payments.count}}, Unmatched: {{get-invoices.unmatched_count}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice?$filter=Supplier eq '{{Supplier}}' and PostingDate ge datetime'{{PostingDateFrom}}' and PostingDate le datetime'{{PostingDateTo}}'"
          inputParameters:
            - name: Supplier
              in: query
            - name: PostingDateFrom
              in: query
            - name: PostingDateTo
              in: query
          operations:
            - name: get-vendor-invoices
              method: GET
        - name: payments
          path: "/A_PaymentDocument?$filter=Supplier eq '{{Supplier}}'"
          inputParameters:
            - name: Supplier
              in: query
          operations:
            - name: get-payment-docs
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/airbus.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT

Compiles a vendor scorecard by pulling delivery performance from SAP, quality metrics from Snowflake, and updating the vendor record in Salesforce with the latest score.

naftiko: "0.5"
info:
  label: "Vendor Scorecarding Workflow"
  description: "Compiles a vendor scorecard by pulling delivery performance from SAP, quality metrics from Snowflake, and updating the vendor record in Salesforce with the latest score."
  tags:
    - procurement
    - sap-s4hana
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: generate-vendor-scorecard
          description: "Given a vendor ID and period, compile delivery and quality metrics into a scorecard."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
            - name: period
              in: body
              type: string
              description: "Scoring period (e.g., 2026-Q1)."
          steps:
            - name: get-delivery-performance
              type: call
              call: "sap-s4.get-vendor-deliveries"
              with:
                Supplier: "{{vendor_id}}"
                Period: "{{period}}"
            - name: get-quality-metrics
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT defect_rate, acceptance_rate, avg_lead_time FROM vendor_quality WHERE vendor_id = '{{vendor_id}}' AND period = '{{period}}'"
            - name: update-salesforce
              type: call
              call: "salesforce.update-vendor-score"
              with:
                vendor_id: "{{vendor_id}}"
                delivery_score: "{{get-delivery-performance.on_time_pct}}"
                quality_score: "{{get-quality-metrics.data[0].ACCEPTANCE_RATE}}"
                period: "{{period}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: vendor-deliveries
          path: "/A_PurchaseOrder?$filter=Supplier eq '{{Supplier}}'"
          inputParameters:
            - name: Supplier
              in: query
          operations:
            - name: get-vendor-deliveries
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbus.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: vendor-scores
          path: "/sobjects/Vendor_Scorecard__c"
          operations:
            - name: update-vendor-score
              method: POST

When goods are received at a warehouse, posts the goods receipt in SAP, triggers a quality inspection lot, and notifies the receiving team via Slack with inspection requirements.

naftiko: "0.5"
info:
  label: "Warehouse Receiving Inspection Workflow"
  description: "When goods are received at a warehouse, posts the goods receipt in SAP, triggers a quality inspection lot, and notifies the receiving team via Slack with inspection requirements."
  tags:
    - supply-chain
    - sap-s4hana
    - slack
    - quality
capability:
  exposes:
    - type: mcp
      namespace: warehouse
      port: 8080
      tools:
        - name: process-receiving
          description: "Given a PO number and delivery note, post goods receipt, create inspection lot, and notify the team."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The purchase order number."
            - name: delivery_note
              in: body
              type: string
              description: "The supplier delivery note number."
          steps:
            - name: post-goods-receipt
              type: call
              call: "sap-s4.post-goods-receipt"
              with:
                PurchaseOrder: "{{po_number}}"
                DeliveryNote: "{{delivery_note}}"
            - name: create-inspection
              type: call
              call: "sap-qm.create-inspection-lot"
              with:
                Material: "{{post-goods-receipt.Material}}"
                Batch: "{{post-goods-receipt.Batch}}"
            - name: notify-receiving
              type: call
              call: "slack.post-message"
              with:
                channel: "warehouse-receiving"
                text: "GR posted for PO {{po_number}} | Material: {{post-goods-receipt.Material}} | Qty: {{post-goods-receipt.Quantity}} | Inspection lot: {{create-inspection.InspectionLot}} created"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_GOODS_RECEIPT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: goods-receipts
          path: "/A_GoodsReceipt"
          operations:
            - name: post-goods-receipt
              method: POST
    - type: http
      namespace: sap-qm
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot"
          operations:
            - name: create-inspection-lot
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a warranty claim is submitted, retrieves the part warranty terms from SAP, validates the claim against delivery records in Snowflake, and creates a Salesforce case for the customer support team.

naftiko: "0.5"
info:
  label: "Warranty Claim Processing Workflow"
  description: "When a warranty claim is submitted, retrieves the part warranty terms from SAP, validates the claim against delivery records in Snowflake, and creates a Salesforce case for the customer support team."
  tags:
    - customer-support
    - sap-s4hana
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: process-warranty-claim
          description: "Given a part number, MSN, and claim description, validate warranty eligibility and create a support case."
          inputParameters:
            - name: part_number
              in: body
              type: string
              description: "The affected part number."
            - name: msn
              in: body
              type: string
              description: "The aircraft MSN."
            - name: claim_description
              in: body
              type: string
              description: "Description of the warranty claim."
          steps:
            - name: get-warranty-terms
              type: call
              call: "sap-s4.get-warranty"
              with:
                Material: "{{part_number}}"
            - name: validate-delivery
              type: call
              call: "snowflake.run-query"
              with:
                query: "SELECT delivery_date, warranty_end_date FROM part_deliveries WHERE part_number = '{{part_number}}' AND msn = '{{msn}}'"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Warranty claim: {{part_number}} on MSN {{msn}}"
                description: "{{claim_description}}. Warranty end: {{validate-delivery.data[0].WARRANTY_END_DATE}}"
                type: "Warranty"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://airbus-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_s4_user"
        password: "$secrets.sap_s4_pass"
      resources:
        - name: warranty
          path: "/A_Product('{{Material}}')/to_Warranty"
          inputParameters:
            - name: Material
              in: path
          operations:
            - name: get-warranty
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://airbus.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbus.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

Compiles a weekly engineering digest by pulling sprint data from Jira, build metrics from Azure DevOps, and posting the summary to the engineering leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Weekly Engineering Progress Digest"
  description: "Compiles a weekly engineering digest by pulling sprint data from Jira, build metrics from Azure DevOps, and posting the summary to the engineering leadership Microsoft Teams channel."
  tags:
    - engineering
    - jira
    - azure-devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: generate-weekly-digest
          description: "Given a sprint name, compile Jira velocity data, Azure DevOps build metrics, and post to the leadership channel."
          inputParameters:
            - name: sprint_name
              in: body
              type: string
              description: "The Jira sprint name."
            - name: project_key
              in: body
              type: string
              description: "The Jira project key."
          steps:
            - name: get-sprint-data
              type: call
              call: "jira.get-sprint-report"
              with:
                project: "{{project_key}}"
                sprint: "{{sprint_name}}"
            - name: get-build-metrics
              type: call
              call: "azdo.get-build-summary"
              with:
                project: "aerospace"
                period: "7d"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-leadership"
                message: "Weekly Engineering Digest | Sprint: {{sprint_name}} | Completed: {{get-sprint-data.completed_points}} pts | Builds: {{get-build-metrics.total_builds}} ({{get-build-metrics.success_rate}}% pass)"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://airbus-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/search?jql=project={{project}} AND sprint='{{sprint}}'"
          inputParameters:
            - name: project
              in: query
            - name: sprint
              in: query
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/airbus/{{project}}/_apis/build"
      authentication:
        type: basic
        username: "$secrets.azdo_user"
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/builds?minTime={{period}}&api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: period
              in: query
          operations:
            - name: get-build-summary
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/engineering-leadership/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and manager information.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and manager information."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday worker ID, retrieve the employee profile including name, department, title, and manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Worker_Data.Personal_Data.Name_Data.Legal_Name.Name_Detail_Data.Formatted_Name"
            - name: department
              type: string
              mapping: "$.Worker.Worker_Data.Organization_Data.Organization_Name"
            - name: job_title
              type: string
              mapping: "$.Worker.Worker_Data.Job_Data.Position_Data.Business_Title"
  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: "/airbus/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET