Anheuser Busch Capabilities

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

Sort
Expand

Extracts current year actuals from SAP controlling, loads them into Snowflake planning tables, and triggers a Power BI dataset refresh for budget dashboards.

naftiko: "0.5"
info:
  label: "Annual Budget Planning Data Sync"
  description: "Extracts current year actuals from SAP controlling, loads them into Snowflake planning tables, and triggers a Power BI dataset refresh for budget dashboards."
  tags:
    - finance
    - sap
    - snowflake
    - power-bi
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: budget-ops
      port: 8080
      tools:
        - name: sync-budget-data
          description: "Given a fiscal year, extract SAP actuals, load into Snowflake, and refresh the Power BI budget dashboard."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year (e.g. 2025)."
          steps:
            - name: get-actuals
              type: call
              call: "sap-budget.get-fiscal-actuals"
              with:
                year: "{{fiscal_year}}"
            - name: load-snowflake
              type: call
              call: "snowflake-budget.insert-actuals"
              with:
                table: "FINANCE.BUDGET_ACTUALS"
                year: "{{fiscal_year}}"
                data: "{{get-actuals.records}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi-budget.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_budget_dataset_id"
  consumes:
    - type: http
      namespace: sap-budget
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: actuals
          path: "/A_CostCenter"
          operations:
            - name: get-fiscal-actuals
              method: GET
    - type: http
      namespace: snowflake-budget
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-actuals
              method: POST
    - type: http
      namespace: powerbi-budget
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          operations:
            - name: trigger-refresh
              method: POST

Validates a release pipeline stage by checking Datadog service health, Snowflake data integrity, and updating the ServiceNow change request with results.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Gate Check"
  description: "Validates a release pipeline stage by checking Datadog service health, Snowflake data integrity, and updating the ServiceNow change request with results."
  tags:
    - devops
    - datadog
    - snowflake
    - servicenow
    - release-management
capability:
  exposes:
    - type: mcp
      namespace: release-gate
      port: 8080
      tools:
        - name: check-release-gates
          description: "Given a release ID and change number, validate Datadog health, Snowflake data integrity, and update the ServiceNow change request."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "The release pipeline identifier."
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          steps:
            - name: check-health
              type: call
              call: "datadog-gate.get-service-health"
              with:
                release: "{{release_id}}"
            - name: check-data
              type: call
              call: "snowflake-gate.run-integrity-check"
              with:
                release: "{{release_id}}"
            - name: update-change
              type: call
              call: "servicenow-gate.update-change"
              with:
                number: "{{change_number}}"
                work_notes: "Release Gate: Health {{check-health.status}} | Data Integrity {{check-data.status}} | Release: {{release_id}}"
  consumes:
    - type: http
      namespace: datadog-gate
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: get-service-health
              method: GET
    - type: http
      namespace: snowflake-gate
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-integrity-check
              method: POST
    - type: http
      namespace: servicenow-gate
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: update-change
              method: PATCH

Queries Azure Resource Health for the availability status of a specified resource.

naftiko: "0.5"
info:
  label: "Azure Resource Health Check"
  description: "Queries Azure Resource Health for the availability status of a specified resource."
  tags:
    - cloud
    - azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: azure-health
      port: 8080
      tools:
        - name: get-resource-health
          description: "Check the health status of an Azure resource. Returns availability state and summary."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "The Azure resource ID."
          call: "azure-health.get-health"
          with:
            resource_id: "{{resource_id}}"
          outputParameters:
            - name: availability_state
              type: string
              mapping: "$.properties.availabilityState"
            - name: summary
              type: string
              mapping: "$.properties.summary"
            - name: reason_type
              type: string
              mapping: "$.properties.reasonType"
  consumes:
    - type: http
      namespace: azure-health
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: health
          path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current"
          inputParameters:
            - name: resource_id
              in: path
          operations:
            - name: get-health
              method: GET

Initiates a product recall by blocking the batch in SAP QM, creating a Salesforce case for affected retailers, and broadcasting an alert to the crisis management Teams channel.

naftiko: "0.5"
info:
  label: "Beverage Recall Coordination"
  description: "Initiates a product recall by blocking the batch in SAP QM, creating a Salesforce case for affected retailers, and broadcasting an alert to the crisis management Teams channel."
  tags:
    - quality
    - sap
    - salesforce
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: recall-ops
      port: 8080
      tools:
        - name: initiate-product-recall
          description: "Given a batch number and reason, block the batch in SAP, create Salesforce cases for affected retailers, and alert crisis management via Teams."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number to recall."
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: recall_reason
              in: body
              type: string
              description: "The reason for the recall."
          steps:
            - name: block-batch
              type: call
              call: "sap-qm.update-batch-status"
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
                status: "BLOCKED"
            - name: create-sf-case
              type: call
              call: "salesforce-recall.create-case"
              with:
                subject: "Product Recall: {{material_number}} batch {{batch_number}}"
                description: "Reason: {{recall_reason}}"
                priority: "Critical"
            - name: alert-crisis
              type: call
              call: "msteams-crisis.post-message"
              with:
                channel_id: "$secrets.teams_crisis_channel_id"
                message: "RECALL INITIATED: Material {{material_number}} Batch {{batch_number}} | Reason: {{recall_reason}} | Case: {{create-sf-case.CaseNumber}}"
  consumes:
    - type: http
      namespace: sap-qm
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch"
          operations:
            - name: update-batch-status
              method: PATCH
    - type: http
      namespace: salesforce-recall
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams-crisis
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls campaign spend from SAP, revenue lift from Snowflake, and posts an ROI summary to the marketing Teams channel.

naftiko: "0.5"
info:
  label: "Brand Campaign ROI Report"
  description: "Pulls campaign spend from SAP, revenue lift from Snowflake, and posts an ROI summary to the marketing Teams channel."
  tags:
    - marketing
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: generate-campaign-roi
          description: "Given a campaign ID, pull spend from SAP and revenue data from Snowflake, then post an ROI summary to the marketing Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The marketing campaign identifier."
          steps:
            - name: get-spend
              type: call
              call: "sap-mktg.get-campaign-costs"
              with:
                campaign: "{{campaign_id}}"
            - name: get-revenue
              type: call
              call: "snowflake-mktg.query-revenue-lift"
              with:
                campaign: "{{campaign_id}}"
            - name: post-roi
              type: call
              call: "msteams-mktg.post-message"
              with:
                channel_id: "$secrets.teams_marketing_channel_id"
                message: "Campaign {{campaign_id}} ROI: Spend {{get-spend.total_cost}} | Revenue Lift {{get-revenue.incremental_revenue}} | ROI {{get-revenue.roi_percent}}%"
  consumes:
    - type: http
      namespace: sap-mktg
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/A_CostCenter"
          operations:
            - name: get-campaign-costs
              method: GET
    - type: http
      namespace: snowflake-mktg
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-revenue-lift
              method: POST
    - type: http
      namespace: msteams-mktg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls energy consumption data from the plant historian via Snowflake, compares to SAP cost center budgets, and alerts sustainability team via Teams.

naftiko: "0.5"
info:
  label: "Brewery Energy Consumption Monitor"
  description: "Pulls energy consumption data from the plant historian via Snowflake, compares to SAP cost center budgets, and alerts sustainability team via Teams."
  tags:
    - sustainability
    - snowflake
    - sap
    - microsoft-teams
    - energy
capability:
  exposes:
    - type: mcp
      namespace: energy-ops
      port: 8080
      tools:
        - name: monitor-energy-consumption
          description: "Given a plant code, pull energy data from Snowflake, compare to SAP budget, and alert sustainability via Teams if over threshold."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
            - name: month
              in: body
              type: string
              description: "The reporting month in YYYY-MM format."
          steps:
            - name: get-energy
              type: call
              call: "snowflake-energy.query-consumption"
              with:
                plant: "{{plant_code}}"
                month: "{{month}}"
            - name: get-budget
              type: call
              call: "sap-energy.get-energy-budget"
              with:
                plant: "{{plant_code}}"
                period: "{{month}}"
            - name: alert-team
              type: call
              call: "msteams-energy.post-message"
              with:
                channel_id: "$secrets.teams_sustainability_channel_id"
                message: "Energy Report — {{plant_code}} ({{month}}): Consumed {{get-energy.total_kwh}} kWh | Budget {{get-budget.budget_kwh}} kWh | Variance {{get-energy.variance_percent}}%"
  consumes:
    - type: http
      namespace: snowflake-energy
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-consumption
              method: POST
    - type: http
      namespace: sap-energy
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenter"
          operations:
            - name: get-energy-budget
              method: GET
    - type: http
      namespace: msteams-energy
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves the status of a production order from SAP S/4HANA for a specific brewery and product, returning scheduled quantities and completion status.

naftiko: "0.5"
info:
  label: "Brewery Production Order Status Check"
  description: "Retrieves the status of a production order from SAP S/4HANA for a specific brewery and product, returning scheduled quantities and completion status."
  tags:
    - manufacturing
    - sap
    - erp
    - production
capability:
  exposes:
    - type: mcp
      namespace: brewery-ops
      port: 8080
      tools:
        - name: get-production-order-status
          description: "Look up a SAP production order by order number. Returns scheduled quantity, completed quantity, status, and planned completion date. Use for brewery operations monitoring."
          inputParameters:
            - name: production_order_id
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap-prod.get-production-order"
          with:
            order_id: "{{production_order_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.SystemStatus"
            - name: scheduled_qty
              type: number
              mapping: "$.d.TotalQuantity"
            - name: completed_qty
              type: number
              mapping: "$.d.ConfirmedYieldQuantity"
            - name: planned_end_date
              type: string
              mapping: "$.d.PlannedEndDate"
  consumes:
    - type: http
      namespace: sap-prod
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_id}}')"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-production-order
              method: GET

Pulls shift production data from SAP, open incidents from ServiceNow, and posts a consolidated handover report to the plant operations Teams channel.

naftiko: "0.5"
info:
  label: "Brewery Shift Handover Report"
  description: "Pulls shift production data from SAP, open incidents from ServiceNow, and posts a consolidated handover report to the plant operations Teams channel."
  tags:
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: shift-ops
      port: 8080
      tools:
        - name: generate-shift-handover
          description: "Given a plant code and shift ID, pull SAP production data and open ServiceNow incidents, then post a handover report to Teams."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
            - name: shift_id
              in: body
              type: string
              description: "The shift identifier (e.g. DAY, SWING, NIGHT)."
          steps:
            - name: get-production
              type: call
              call: "sap-shift.get-shift-output"
              with:
                plant: "{{plant_code}}"
                shift: "{{shift_id}}"
            - name: get-incidents
              type: call
              call: "servicenow-shift.get-open-incidents"
              with:
                plant: "{{plant_code}}"
            - name: post-handover
              type: call
              call: "msteams-shift.post-message"
              with:
                channel_id: "$secrets.teams_plant_ops_channel_id"
                message: "Shift Handover — {{plant_code}} ({{shift_id}}): Output {{get-production.total_units}} units | Efficiency {{get-production.efficiency}}% | Open Incidents: {{get-incidents.count}} | Critical: {{get-incidents.critical_count}}"
  consumes:
    - type: http
      namespace: sap-shift
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production
          path: "/A_ProductionOrder"
          operations:
            - name: get-shift-output
              method: GET
    - type: http
      namespace: servicenow-shift
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-open-incidents
              method: GET
    - type: http
      namespace: msteams-shift
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Logs brewery waste disposal records from SAP EHS into Snowflake for regulatory reporting and creates a compliance task in ServiceNow.

naftiko: "0.5"
info:
  label: "Brewery Waste Disposal Tracking"
  description: "Logs brewery waste disposal records from SAP EHS into Snowflake for regulatory reporting and creates a compliance task in ServiceNow."
  tags:
    - sustainability
    - sap
    - snowflake
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: waste-ops
      port: 8080
      tools:
        - name: track-waste-disposal
          description: "Given a plant code and disposal date, pull SAP EHS waste records, load into Snowflake, and create a ServiceNow compliance task."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
            - name: disposal_date
              in: body
              type: string
              description: "The disposal date in YYYY-MM-DD format."
          steps:
            - name: get-waste-records
              type: call
              call: "sap-ehs.get-waste-disposal"
              with:
                plant: "{{plant_code}}"
                date: "{{disposal_date}}"
            - name: load-records
              type: call
              call: "snowflake-waste.insert-records"
              with:
                table: "COMPLIANCE.WASTE_DISPOSAL"
                data: "{{get-waste-records.records}}"
            - name: create-task
              type: call
              call: "servicenow-waste.create-task"
              with:
                short_description: "Waste disposal compliance: {{plant_code}} on {{disposal_date}}"
                description: "Records loaded: {{get-waste-records.record_count}} | Total weight: {{get-waste-records.total_weight_kg}} kg"
  consumes:
    - type: http
      namespace: sap-ehs
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: waste
          path: "/A_WasteDisposal"
          operations:
            - name: get-waste-disposal
              method: GET
    - type: http
      namespace: snowflake-waste
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-records
              method: POST
    - type: http
      namespace: servicenow-waste
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Creates a ServiceNow change request for infrastructure changes and routes it to the CAB board, notifying the requestor in Teams.

naftiko: "0.5"
info:
  label: "Change Management Approval Workflow"
  description: "Creates a ServiceNow change request for infrastructure changes and routes it to the CAB board, notifying the requestor in Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: create-change-request
          description: "Given change description, type, and risk level, create a ServiceNow change request and notify the requestor in Teams."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the change."
            - name: change_type
              in: body
              type: string
              description: "Change type: normal, standard, or emergency."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, high, or critical."
            - name: requestor_upn
              in: body
              type: string
              description: "The UPN of the requestor for Teams notification."
          steps:
            - name: create-cr
              type: call
              call: "servicenow-chg.create-change"
              with:
                short_description: "{{short_description}}"
                type: "{{change_type}}"
                risk: "{{risk_level}}"
                assignment_group: "CAB"
            - name: notify-requestor
              type: call
              call: "msteams-chg.send-message"
              with:
                recipient_upn: "{{requestor_upn}}"
                message: "Change request submitted: {{create-cr.number}}. Type: {{change_type}}. Risk: {{risk_level}}. Pending CAB review."
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-chg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an AWS cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow FinOps ticket, and notifies the finance team in Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Responder"
  description: "When an AWS cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow FinOps ticket, and notifies the finance team in Teams."
  tags:
    - finops
    - cloud
    - aws
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an AWS cost anomaly ID, affected service, and estimated overage, create a Datadog event, open a ServiceNow FinOps ticket, and notify the finance Teams channel."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "The AWS Cost Anomaly Detection anomaly ID."
            - name: aws_service
              in: body
              type: string
              description: "The AWS service generating the anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated dollar overage detected."
            - name: business_unit
              in: body
              type: string
              description: "The Anheuser-Busch business unit owning the account."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog-finops.create-event"
              with:
                title: "AWS Cost Anomaly: {{aws_service}}"
                text: "Anomaly {{anomaly_id}} — estimated overage: ${{estimated_overage_usd}} — BU: {{business_unit}}"
                alert_type: "warning"
            - name: create-finops-ticket
              type: call
              call: "servicenow-finops.create-incident"
              with:
                short_description: "AWS cost anomaly on {{aws_service}} — ${{estimated_overage_usd}} overage"
                description: "Anomaly {{anomaly_id}} on {{aws_service}} for {{business_unit}}. Datadog event: {{annotate-datadog.id}}."
                assignment_group: "FinOps"
            - name: notify-finance
              type: call
              call: "msteams-finops.post-channel-message"
              with:
                channel_id: "cloud-finance-alerts"
                message: "AWS Cost Anomaly: {{aws_service}} | Overage: ${{estimated_overage_usd}} | BU: {{business_unit}} | Ticket: {{create-finops-ticket.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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow-finops
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls CO2 emissions data from SAP EHS and Snowflake, calculates against targets, and posts a sustainability report to the ESG Teams channel.

naftiko: "0.5"
info:
  label: "CO2 Emissions Tracking Report"
  description: "Pulls CO2 emissions data from SAP EHS and Snowflake, calculates against targets, and posts a sustainability report to the ESG Teams channel."
  tags:
    - sustainability
    - sap
    - snowflake
    - microsoft-teams
    - emissions
capability:
  exposes:
    - type: mcp
      namespace: emissions-ops
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a plant code and reporting period, pull emissions data and post a sustainability report to the ESG Teams channel."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
            - name: period
              in: body
              type: string
              description: "Reporting period in YYYY-MM format."
          steps:
            - name: get-emissions
              type: call
              call: "sap-emissions.get-plant-emissions"
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: get-targets
              type: call
              call: "snowflake-emissions.query-reduction-targets"
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: post-report
              type: call
              call: "msteams-emissions.post-message"
              with:
                channel_id: "$secrets.teams_esg_channel_id"
                message: "CO2 Report — {{plant_code}} ({{period}}): Emissions {{get-emissions.total_tonnes}} tonnes | Target {{get-targets.target_tonnes}} tonnes | Variance {{get-targets.variance_percent}}%"
  consumes:
    - type: http
      namespace: sap-emissions
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: emissions
          path: "/A_EmissionsData"
          operations:
            - name: get-plant-emissions
              method: GET
    - type: http
      namespace: snowflake-emissions
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-reduction-targets
              method: POST
    - type: http
      namespace: msteams-emissions
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves a Confluence wiki page by ID, returning title, version, last modifier, and space key.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence wiki page by ID, returning title, version, last modifier, and space key."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence
      port: 8080
      tools:
        - name: get-page
          description: "Look up a Confluence page by ID. Returns title, space, version number, and last editor."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: space
              type: string
              mapping: "$.space.key"
            - name: version
              type: number
              mapping: "$.version.number"
            - name: last_modifier
              type: string
              mapping: "$.version.by.displayName"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://anheuser-busch.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

When a customer complaint is logged in Salesforce, creates a quality investigation in SAP QM and assigns a ServiceNow task to the quality team.

naftiko: "0.5"
info:
  label: "Customer Complaint Resolution Workflow"
  description: "When a customer complaint is logged in Salesforce, creates a quality investigation in SAP QM and assigns a ServiceNow task to the quality team."
  tags:
    - quality
    - salesforce
    - sap
    - servicenow
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: complaint-ops
      port: 8080
      tools:
        - name: process-customer-complaint
          description: "Given a Salesforce case ID, pull complaint details, create a SAP QM notification, and assign a ServiceNow task to the quality team."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID for the complaint."
          steps:
            - name: get-case
              type: call
              call: "salesforce-complaint.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-qm-notification
              type: call
              call: "sap-complaint.create-quality-notification"
              with:
                material: "{{get-case.Product_Material__c}}"
                batch: "{{get-case.Batch_Number__c}}"
                description: "Customer complaint: {{get-case.Subject}}"
            - name: create-task
              type: call
              call: "servicenow-complaint.create-task"
              with:
                short_description: "Quality investigation: {{get-case.Subject}}"
                description: "SF Case: {{case_id}} | SAP QN: {{create-qm-notification.notification_id}} | Material: {{get-case.Product_Material__c}}"
                assignment_group: "Quality Assurance"
  consumes:
    - type: http
      namespace: salesforce-complaint
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: sap-complaint
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/A_QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: servicenow-complaint
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Retrieves the current health status of Anheuser-Busch's monitored infrastructure hosts and active Datadog monitors.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Retrieves the current health status of Anheuser-Busch's monitored infrastructure hosts and active Datadog monitors."
  tags:
    - observability
    - datadog
    - monitoring
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-infrastructure-health
          description: "Query Datadog for the current status of all monitored hosts and active alerts for a given environment."
          inputParameters:
            - name: environment
              in: body
              type: string
              description: "The deployment environment: production, staging, or development."
          call: "datadog.list-monitors"
          with:
            tags: "env:{{environment}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: list-monitors
              method: GET
              inputParameters:
                - name: tags
                  in: query

Queries Datadog for the current health status of a monitored service, returning uptime and error rate.

naftiko: "0.5"
info:
  label: "Datadog Service Status Check"
  description: "Queries Datadog for the current health status of a monitored service, returning uptime and error rate."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: datadog-monitor
      port: 8080
      tools:
        - name: get-service-status
          description: "Check a Datadog-monitored service status. Returns current state, uptime percentage, and error rate."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The name of the service in Datadog."
          call: "datadog-monitor.get-status"
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.attributes.status"
            - name: uptime
              type: number
              mapping: "$.data.attributes.uptime"
            - name: error_rate
              type: number
              mapping: "$.data.attributes.error_rate"
  consumes:
    - type: http
      namespace: datadog-monitor
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: services
          path: "/service_dependencies"
          inputParameters:
            - name: service
              in: query
          operations:
            - name: get-status
              method: GET

Identifies contracts approaching renewal in Salesforce, pulls historical performance from Snowflake, and creates a Jira task for the account manager.

naftiko: "0.5"
info:
  label: "Distributor Contract Renewal Pipeline"
  description: "Identifies contracts approaching renewal in Salesforce, pulls historical performance from Snowflake, and creates a Jira task for the account manager."
  tags:
    - sales
    - salesforce
    - snowflake
    - jira
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: contract-ops
      port: 8080
      tools:
        - name: process-contract-renewal
          description: "Given a contract ID, pull Salesforce contract details, Snowflake performance data, and create a Jira renewal task."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The Salesforce contract record ID."
          steps:
            - name: get-contract
              type: call
              call: "salesforce-contracts.get-contract"
              with:
                contract_id: "{{contract_id}}"
            - name: get-performance
              type: call
              call: "snowflake-contracts.query-performance"
              with:
                distributor_id: "{{get-contract.AccountId}}"
            - name: create-task
              type: call
              call: "jira-contracts.create-issue"
              with:
                project: "SALES"
                summary: "Contract renewal: {{get-contract.Account.Name}} expiring {{get-contract.EndDate}}"
                description: "Historical volume: {{get-performance.total_volume}} | Revenue: {{get-performance.total_revenue}}"
  consumes:
    - type: http
      namespace: salesforce-contracts
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/sobjects/Contract/{{contract_id}}"
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: snowflake-contracts
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-performance
              method: POST
    - type: http
      namespace: jira-contracts
      baseUri: "https://anheuser-busch.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

Retrieves distributor credit data from SAP and Salesforce, calculates risk exposure, and posts a summary to the finance Teams channel.

naftiko: "0.5"
info:
  label: "Distributor Credit Limit Review"
  description: "Retrieves distributor credit data from SAP and Salesforce, calculates risk exposure, and posts a summary to the finance Teams channel."
  tags:
    - finance
    - sap
    - salesforce
    - microsoft-teams
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: credit-ops
      port: 8080
      tools:
        - name: review-distributor-credit
          description: "Given a distributor account ID, pull credit data from SAP and Salesforce, then alert finance via Teams if exposure exceeds threshold."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce distributor account ID."
          steps:
            - name: get-sf-account
              type: call
              call: "salesforce-credit.get-account"
              with:
                account_id: "{{account_id}}"
            - name: get-sap-credit
              type: call
              call: "sap-credit.get-credit-exposure"
              with:
                customer_id: "{{get-sf-account.SAP_Customer_ID__c}}"
            - name: notify-finance
              type: call
              call: "msteams-credit.post-message"
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                message: "Credit Review: {{get-sf-account.Name}} | Limit: {{get-sap-credit.credit_limit}} | Exposure: {{get-sap-credit.total_receivables}} | Available: {{get-sap-credit.available_credit}}"
  consumes:
    - type: http
      namespace: salesforce-credit
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: sap-credit
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_CREDIT_MGMT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: credit
          path: "/A_CreditExposure('{{customer_id}}')"
          operations:
            - name: get-credit-exposure
              method: GET
    - type: http
      namespace: msteams-credit
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Calculates distributor rebates by pulling sales volume from Snowflake, applying SAP rebate conditions, and creating a Salesforce rebate statement.

naftiko: "0.5"
info:
  label: "Distributor Rebate Calculation"
  description: "Calculates distributor rebates by pulling sales volume from Snowflake, applying SAP rebate conditions, and creating a Salesforce rebate statement."
  tags:
    - finance
    - snowflake
    - sap
    - salesforce
    - rebate-management
capability:
  exposes:
    - type: mcp
      namespace: rebate-ops
      port: 8080
      tools:
        - name: calculate-distributor-rebate
          description: "Given a distributor ID and period, pull sales volumes, apply rebate rules, and create a Salesforce rebate statement."
          inputParameters:
            - name: distributor_id
              in: body
              type: string
              description: "The Salesforce distributor account ID."
            - name: period
              in: body
              type: string
              description: "The rebate period in YYYY-QN format."
          steps:
            - name: get-volume
              type: call
              call: "snowflake-rebate.query-sales-volume"
              with:
                distributor: "{{distributor_id}}"
                period: "{{period}}"
            - name: get-conditions
              type: call
              call: "sap-rebate.get-rebate-conditions"
              with:
                customer: "{{distributor_id}}"
            - name: create-statement
              type: call
              call: "salesforce-rebate.create-rebate-statement"
              with:
                distributor_id: "{{distributor_id}}"
                period: "{{period}}"
                volume: "{{get-volume.total_volume}}"
                rebate_amount: "{{get-conditions.calculated_rebate}}"
  consumes:
    - type: http
      namespace: snowflake-rebate
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-sales-volume
              method: POST
    - type: http
      namespace: sap-rebate
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: conditions
          path: "/A_SlsPrcgCndnRecdValidity"
          operations:
            - name: get-rebate-conditions
              method: GET
    - type: http
      namespace: salesforce-rebate
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: rebates
          path: "/sobjects/Rebate_Statement__c"
          operations:
            - name: create-rebate-statement
              method: POST

Generates a weekly account health digest from Salesforce for Anheuser-Busch's distributor accounts and posts it to the regional sales Teams channel.

naftiko: "0.5"
info:
  label: "Distributor Sales Account Health Digest"
  description: "Generates a weekly account health digest from Salesforce for Anheuser-Busch's distributor accounts and posts it to the regional sales Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: account-health
      port: 8080
      tools:
        - name: digest-distributor-health
          description: "Given a Salesforce account ID and Teams channel, retrieve open orders, contracts, and account status, then post a distributor health digest."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce distributor account ID."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel to post the digest to."
          steps:
            - name: get-account
              type: call
              call: "salesforce-health.get-account"
              with:
                account_id: "{{account_id}}"
            - name: get-opportunities
              type: call
              call: "salesforce-health.get-account-opportunities"
              with:
                account_id: "{{account_id}}"
            - name: post-digest
              type: call
              call: "msteams-health.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "Distributor Health: {{get-account.name}} | Region: {{get-account.region}} | Open Orders: {{get-opportunities.total_count}} | Volume: {{get-account.annual_volume}}"
  consumes:
    - type: http
      namespace: salesforce-health
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
        - name: account-opportunities
          path: "/sobjects/Account/{{account_id}}/Opportunities"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-opportunities
              method: GET
    - type: http
      namespace: msteams-health
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries SAP PM for draft beer equipment due for preventive maintenance, creates work orders, and notifies field service technicians via Teams.

naftiko: "0.5"
info:
  label: "Draft Beer Equipment Maintenance Scheduler"
  description: "Queries SAP PM for draft beer equipment due for preventive maintenance, creates work orders, and notifies field service technicians via Teams."
  tags:
    - field-service
    - sap
    - microsoft-teams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: field-service
      port: 8080
      tools:
        - name: schedule-draft-maintenance
          description: "Given a region code, find draft equipment due for maintenance in SAP, create work orders, and notify field technicians via Teams."
          inputParameters:
            - name: region_code
              in: body
              type: string
              description: "The field service region code."
          steps:
            - name: get-due-equipment
              type: call
              call: "sap-fs.get-maintenance-due"
              with:
                region: "{{region_code}}"
            - name: create-work-orders
              type: call
              call: "sap-fs.create-work-order"
              with:
                equipment_list: "{{get-due-equipment.equipment_ids}}"
                order_type: "PM01"
            - name: notify-technicians
              type: call
              call: "msteams-fs.post-message"
              with:
                channel_id: "$secrets.teams_field_service_channel_id"
                message: "Maintenance scheduled for {{get-due-equipment.count}} draft units in {{region_code}} | Work orders: {{create-work-orders.order_numbers}}"
  consumes:
    - type: http
      namespace: sap-fs
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance
          path: "/MaintenanceNotification"
          operations:
            - name: get-maintenance-due
              method: GET
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams-fs
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Syncs e-commerce orders from Shopify to SAP for fulfillment, updates Salesforce order tracking, and notifies the e-commerce team via Teams.

naftiko: "0.5"
info:
  label: "E-Commerce Order Fulfillment Sync"
  description: "Syncs e-commerce orders from Shopify to SAP for fulfillment, updates Salesforce order tracking, and notifies the e-commerce team via Teams."
  tags:
    - ecommerce
    - shopify
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ecom-ops
      port: 8080
      tools:
        - name: sync-ecommerce-order
          description: "Given a Shopify order ID, sync order to SAP for fulfillment, update Salesforce tracking, and notify the e-commerce team via Teams."
          inputParameters:
            - name: shopify_order_id
              in: body
              type: string
              description: "The Shopify order ID."
          steps:
            - name: get-order
              type: call
              call: "shopify-ecom.get-order"
              with:
                order_id: "{{shopify_order_id}}"
            - name: create-sap-order
              type: call
              call: "sap-ecom.create-sales-order"
              with:
                customer: "{{get-order.customer.email}}"
                items: "{{get-order.line_items}}"
                total: "{{get-order.total_price}}"
            - name: update-sf
              type: call
              call: "salesforce-ecom.create-order-record"
              with:
                shopify_id: "{{shopify_order_id}}"
                sap_order: "{{create-sap-order.order_number}}"
                status: "Processing"
            - name: notify-team
              type: call
              call: "msteams-ecom.post-message"
              with:
                channel_id: "$secrets.teams_ecom_channel_id"
                message: "New order synced: Shopify {{shopify_order_id}} → SAP {{create-sap-order.order_number}} | Total: ${{get-order.total_price}}"
  consumes:
    - type: http
      namespace: shopify-ecom
      baseUri: "https://anheuser-busch.myshopify.com/admin/api/2024-01"
      authentication:
        type: bearer
        token: "$secrets.shopify_access_token"
      resources:
        - name: orders
          path: "/orders/{{order_id}}.json"
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: sap-ecom
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: salesforce-ecom
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order__c"
          operations:
            - name: create-order-record
              method: POST
    - type: http
      namespace: msteams-ecom
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

When a termination is recorded in Workday, revokes Microsoft 365 access, closes open ServiceNow tickets, and notifies the HR team in Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When a termination is recorded in Workday, revokes Microsoft 365 access, closes open ServiceNow tickets, and notifies the HR team in Teams."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a Workday employee ID and termination date, disable the M365 account, close open ServiceNow tasks, and notify HR in Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The termination effective date in ISO 8601 format."
          steps:
            - name: get-worker
              type: call
              call: "workday-off.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: disable-m365
              type: call
              call: "msgraph-off.disable-user"
              with:
                user_principal_name: "{{get-worker.work_email}}"
            - name: notify-hr
              type: call
              call: "msteams-off.send-message"
              with:
                recipient_upn: "hr-ops@anheuser-busch.com"
                message: "Offboarding complete for {{get-worker.full_name}} (effective: {{termination_date}}). M365 access disabled."
  consumes:
    - type: http
      namespace: workday-off
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/anheuser-busch/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph-off
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_principal_name}}"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: msteams-off
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: create a ServiceNow ticket, provision M365 access, and send a Teams welcome message."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in ISO 8601 format."
            - name: department
              in: body
              type: string
              description: "The department the new hire is joining."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-onboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: provision-m365
              type: call
              call: "msgraph.assign-license"
              with:
                user_principal_name: "{{get-worker.work_email}}"
                sku_id: "enterprisepack"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                message: "Welcome to Anheuser-Busch, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-onboarding-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/anheuser-busch/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user-licenses
          path: "/users/{{user_principal_name}}/assignLicense"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: assign-license
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Workday for employees with overdue safety training, creates a ServiceNow task for HR, and notifies the compliance Teams channel.

naftiko: "0.5"
info:
  label: "Employee Training Compliance Check"
  description: "Queries Workday for employees with overdue safety training, creates a ServiceNow task for HR, and notifies the compliance Teams channel."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: training-ops
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Given a department, find employees with overdue training in Workday, create a ServiceNow task, and notify compliance via Teams."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department name to check training compliance."
          steps:
            - name: get-overdue
              type: call
              call: "workday-training.get-overdue-training"
              with:
                department: "{{department}}"
            - name: create-task
              type: call
              call: "servicenow-training.create-task"
              with:
                short_description: "Overdue training: {{get-overdue.count}} employees in {{department}}"
                description: "Employees: {{get-overdue.employee_names}}"
            - name: notify-compliance
              type: call
              call: "msteams-training.post-message"
              with:
                channel_id: "$secrets.teams_compliance_channel_id"
                message: "Training Compliance Alert: {{get-overdue.count}} employees in {{department}} have overdue safety training | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: workday-training
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/workers"
          operations:
            - name: get-overdue-training
              method: GET
    - type: http
      namespace: servicenow-training
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-training
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls event sponsorship costs from SAP, social media reach from Snowflake, and posts an ROI summary to the marketing Teams channel.

naftiko: "0.5"
info:
  label: "Event Sponsorship ROI Tracker"
  description: "Pulls event sponsorship costs from SAP, social media reach from Snowflake, and posts an ROI summary to the marketing Teams channel."
  tags:
    - marketing
    - sap
    - snowflake
    - microsoft-teams
    - sponsorship
capability:
  exposes:
    - type: mcp
      namespace: sponsorship-ops
      port: 8080
      tools:
        - name: track-sponsorship-roi
          description: "Given an event ID, pull SAP sponsorship costs, Snowflake social reach metrics, and post ROI summary to the marketing Teams channel."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The event sponsorship identifier."
          steps:
            - name: get-costs
              type: call
              call: "sap-sponsor.get-event-costs"
              with:
                event: "{{event_id}}"
            - name: get-reach
              type: call
              call: "snowflake-sponsor.query-social-reach"
              with:
                event: "{{event_id}}"
            - name: post-roi
              type: call
              call: "msteams-sponsor.post-message"
              with:
                channel_id: "$secrets.teams_marketing_channel_id"
                message: "Sponsorship ROI: Event {{event_id}} | Cost: ${{get-costs.total_cost}} | Impressions: {{get-reach.total_impressions}} | Engagements: {{get-reach.total_engagements}} | CPE: ${{get-reach.cost_per_engagement}}"
  consumes:
    - type: http
      namespace: sap-sponsor
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/A_CostCenter"
          operations:
            - name: get-event-costs
              method: GET
    - type: http
      namespace: snowflake-sponsor
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-social-reach
              method: POST
    - type: http
      namespace: msteams-sponsor
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls production volumes from SAP, calculates excise tax obligations in Snowflake, and creates a Jira task for the tax team to review and file.

naftiko: "0.5"
info:
  label: "Excise Tax Calculation and Filing"
  description: "Pulls production volumes from SAP, calculates excise tax obligations in Snowflake, and creates a Jira task for the tax team to review and file."
  tags:
    - finance
    - sap
    - snowflake
    - jira
    - tax
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: tax-ops
      port: 8080
      tools:
        - name: calculate-excise-tax
          description: "Given a plant code and tax period, pull SAP production volumes, calculate excise obligations in Snowflake, and create a Jira review task."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
            - name: tax_period
              in: body
              type: string
              description: "The tax period in YYYY-MM format."
          steps:
            - name: get-volumes
              type: call
              call: "sap-tax.get-production-volumes"
              with:
                plant: "{{plant_code}}"
                period: "{{tax_period}}"
            - name: calculate-tax
              type: call
              call: "snowflake-tax.run-tax-calculation"
              with:
                plant: "{{plant_code}}"
                period: "{{tax_period}}"
                volume: "{{get-volumes.total_barrels}}"
            - name: create-review
              type: call
              call: "jira-tax.create-issue"
              with:
                project: "TAX"
                summary: "Excise tax review: {{plant_code}} for {{tax_period}}"
                description: "Volume: {{get-volumes.total_barrels}} bbl | Estimated tax: ${{calculate-tax.estimated_tax}} | Rate: ${{calculate-tax.rate_per_barrel}}/bbl"
  consumes:
    - type: http
      namespace: sap-tax
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production
          path: "/A_ProductionOrder"
          operations:
            - name: get-production-volumes
              method: GET
    - type: http
      namespace: snowflake-tax
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-tax-calculation
              method: POST
    - type: http
      namespace: jira-tax
      baseUri: "https://anheuser-busch.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

Queries the fleet management system for vehicles due for service, creates SAP PM work orders, and notifies the fleet operations Teams channel.

naftiko: "0.5"
info:
  label: "Fleet Vehicle Maintenance Tracker"
  description: "Queries the fleet management system for vehicles due for service, creates SAP PM work orders, and notifies the fleet operations Teams channel."
  tags:
    - logistics
    - sap
    - microsoft-teams
    - fleet-management
capability:
  exposes:
    - type: mcp
      namespace: fleet-ops
      port: 8080
      tools:
        - name: track-fleet-maintenance
          description: "Given a fleet region, find vehicles due for maintenance, create SAP work orders, and notify fleet ops via Teams."
          inputParameters:
            - name: fleet_region
              in: body
              type: string
              description: "The fleet operations region."
          steps:
            - name: get-due-vehicles
              type: call
              call: "sap-fleet.get-maintenance-due"
              with:
                region: "{{fleet_region}}"
            - name: create-orders
              type: call
              call: "sap-fleet.create-work-order"
              with:
                vehicles: "{{get-due-vehicles.vehicle_ids}}"
                order_type: "PM02"
            - name: notify-fleet
              type: call
              call: "msteams-fleet.post-message"
              with:
                channel_id: "$secrets.teams_fleet_channel_id"
                message: "Fleet Maintenance: {{get-due-vehicles.count}} vehicles due in {{fleet_region}} | Orders: {{create-orders.order_numbers}}"
  consumes:
    - type: http
      namespace: sap-fleet
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance
          path: "/MaintenanceNotification"
          operations:
            - name: get-maintenance-due
              method: GET
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams-fleet
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

On a GitHub Actions pipeline failure, creates a Jira bug, annotates Datadog, and alerts the engineering team in Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure, creates a Jira bug, annotates Datadog, and alerts the engineering team in Teams."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow failure, create a Datadog event marker, open a Jira bug, and alert the engineering Teams channel."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository in org/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The GitHub Actions workflow name that failed."
            - name: branch_name
              in: body
              type: string
              description: "The branch where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the workflow."
            - name: run_url
              in: body
              type: string
              description: "URL to the failed GitHub Actions run."
          steps:
            - name: create-dd-event
              type: call
              call: "datadog-cicd.create-event"
              with:
                title: "Pipeline failure: {{repo_name}}"
                text: "Workflow {{workflow_name}} failed on {{branch_name}} at {{commit_sha}}"
                alert_type: "error"
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch_name}} — {{workflow_name}}"
                description: "Pipeline failure on {{branch_name}}. Commit: {{commit_sha}}. Run: {{run_url}}."
            - name: notify-engineering
              type: call
              call: "msteams-cicd.post-channel-message"
              with:
                channel_id: "engineering-alerts"
                message: "Pipeline Failure: {{repo_name}} | Branch: {{branch_name}} | Jira: {{create-jira-bug.key}} | Run: {{run_url}}"
  consumes:
    - 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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://anheuser-busch.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-cicd
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Dependabot flags a critical vulnerability, creates a Jira security ticket and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependency Vulnerability Remediation"
  description: "When Dependabot flags a critical vulnerability, creates a Jira security ticket and notifies the security team via Teams."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: vuln-ops
      port: 8080
      tools:
        - name: remediate-dependency-vulnerability
          description: "Given a GitHub advisory ID and repository, create a Jira security ticket and notify the security team via Teams."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in org/repo format."
            - name: advisory_id
              in: body
              type: string
              description: "The GitHub security advisory ID."
          steps:
            - name: get-advisory
              type: call
              call: "github-vuln.get-advisory"
              with:
                repo: "{{repo}}"
                advisory_id: "{{advisory_id}}"
            - name: create-ticket
              type: call
              call: "jira-vuln.create-issue"
              with:
                project: "SEC"
                summary: "Vulnerability: {{get-advisory.summary}} in {{repo}}"
                description: "Severity: {{get-advisory.severity}} | Package: {{get-advisory.package}} | Fixed in: {{get-advisory.patched_version}}"
                priority: "High"
            - name: notify-security
              type: call
              call: "msteams-vuln.post-message"
              with:
                channel_id: "$secrets.teams_security_channel_id"
                message: "VULNERABILITY: {{get-advisory.severity}} in {{repo}} | Package: {{get-advisory.package}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: github-vuln
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: advisories
          path: "/repos/{{repo}}/security-advisories/{{advisory_id}}"
          operations:
            - name: get-advisory
              method: GET
    - type: http
      namespace: jira-vuln
      baseUri: "https://anheuser-busch.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-vuln
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Checks the latest commit status and open pull request count for a GitHub repository.

naftiko: "0.5"
info:
  label: "GitHub Repository Status Check"
  description: "Checks the latest commit status and open pull request count for a GitHub repository."
  tags:
    - devops
    - github
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: get-repo-status
          description: "Query a GitHub repository for latest commit status and open PR count."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name in org/repo format."
          call: "github.get-repo"
          with:
            repo: "{{repo_name}}"
          outputParameters:
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: open_issues
              type: number
              mapping: "$.open_issues_count"
            - name: language
              type: string
              mapping: "$.language"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

Queries Snowflake for brand sentiment and market share data, updates Salesforce brand health records, and triggers a Power BI dashboard refresh.

naftiko: "0.5"
info:
  label: "Global Brand Health Dashboard Refresh"
  description: "Queries Snowflake for brand sentiment and market share data, updates Salesforce brand health records, and triggers a Power BI dashboard refresh."
  tags:
    - marketing
    - snowflake
    - salesforce
    - power-bi
    - brand-management
capability:
  exposes:
    - type: mcp
      namespace: brand-health
      port: 8080
      tools:
        - name: refresh-brand-health
          description: "Given a brand code, pull Snowflake sentiment data, update Salesforce brand health record, and refresh the Power BI dashboard."
          inputParameters:
            - name: brand_code
              in: body
              type: string
              description: "The brand code (e.g. BUD, STEL, BECK)."
          steps:
            - name: get-brand-data
              type: call
              call: "snowflake-brand.query-brand-health"
              with:
                brand: "{{brand_code}}"
            - name: update-sf
              type: call
              call: "salesforce-brand.update-brand-health"
              with:
                brand_code: "{{brand_code}}"
                sentiment_score: "{{get-brand-data.sentiment}}"
                market_share: "{{get-brand-data.market_share}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi-brand.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_brand_dataset_id"
  consumes:
    - type: http
      namespace: snowflake-brand
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-brand-health
              method: POST
    - type: http
      namespace: salesforce-brand
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: brands
          path: "/sobjects/Brand_Health__c"
          operations:
            - name: update-brand-health
              method: PATCH
    - type: http
      namespace: powerbi-brand
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          operations:
            - name: trigger-refresh
              method: POST

Pulls supplier delivery and quality metrics from SAP and Snowflake, generates a scorecard, and distributes via Salesforce and Teams.

naftiko: "0.5"
info:
  label: "Ingredient Supplier Scorecard Generator"
  description: "Pulls supplier delivery and quality metrics from SAP and Snowflake, generates a scorecard, and distributes via Salesforce and Teams."
  tags:
    - procurement
    - sap
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-scorecard
      port: 8080
      tools:
        - name: generate-supplier-scorecard
          description: "Given a vendor number, pull SAP delivery metrics and Snowflake quality data, update Salesforce scorecard, and post to procurement Teams channel."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
            - name: period
              in: body
              type: string
              description: "The evaluation period in YYYY-QN format."
          steps:
            - name: get-delivery-metrics
              type: call
              call: "sap-scorecard.get-vendor-performance"
              with:
                vendor: "{{vendor_number}}"
                period: "{{period}}"
            - name: get-quality-metrics
              type: call
              call: "snowflake-scorecard.query-quality-metrics"
              with:
                vendor: "{{vendor_number}}"
                period: "{{period}}"
            - name: update-sf-scorecard
              type: call
              call: "salesforce-scorecard.update-scorecard"
              with:
                vendor_id: "{{vendor_number}}"
                delivery_score: "{{get-delivery-metrics.on_time_rate}}"
                quality_score: "{{get-quality-metrics.pass_rate}}"
            - name: notify-procurement
              type: call
              call: "msteams-scorecard.post-message"
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                message: "Supplier Scorecard: {{vendor_number}} ({{period}}) | Delivery: {{get-delivery-metrics.on_time_rate}}% | Quality: {{get-quality-metrics.pass_rate}}% | Overall: {{get-quality-metrics.overall_score}}"
  consumes:
    - type: http
      namespace: sap-scorecard
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor}}')"
          operations:
            - name: get-vendor-performance
              method: GET
    - type: http
      namespace: snowflake-scorecard
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-quality-metrics
              method: POST
    - type: http
      namespace: salesforce-scorecard
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: scorecards
          path: "/sobjects/Supplier_Scorecard__c"
          operations:
            - name: update-scorecard
              method: PATCH
    - type: http
      namespace: msteams-scorecard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

When a complex ServiceNow incident is created, submits the description to OpenAI for AI-assisted triage and resolution recommendations, then updates the ticket.

naftiko: "0.5"
info:
  label: "Intelligent Incident Triage with OpenAI"
  description: "When a complex ServiceNow incident is created, submits the description to OpenAI for AI-assisted triage and resolution recommendations, then updates the ticket."
  tags:
    - ai
    - itsm
    - servicenow
    - openai
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ai-triage
      port: 8080
      tools:
        - name: triage-incident-with-ai
          description: "Given a ServiceNow incident number, retrieve the incident details, submit to OpenAI for triage analysis, and update the record with AI-generated resolution recommendations."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0054321."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-ai.get-incident"
              with:
                number: "{{incident_number}}"
            - name: analyze-incident
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Analyze this IT incident: 1) Probable root cause, 2) Recommended resolution steps, 3) Priority. Incident: {{get-incident.short_description}} — {{get-incident.description}}"
            - name: update-incident
              type: call
              call: "servicenow-ai.update-incident"
              with:
                number: "{{incident_number}}"
                work_notes: "AI Analysis: {{analyze-incident.text}}"
  consumes:
    - type: http
      namespace: servicenow-ai
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET
              inputParameters:
                - name: number
                  in: query
            - name: update-incident
              method: PATCH
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST

When a vendor invoice arrives in SAP Ariba, validates it against the SAP purchase order and routes it for approval via ServiceNow, notifying the finance team in Teams.

naftiko: "0.5"
info:
  label: "Invoice Processing and Approval"
  description: "When a vendor invoice arrives in SAP Ariba, validates it against the SAP purchase order and routes it for approval via ServiceNow, notifying the finance team in Teams."
  tags:
    - finance
    - procurement
    - sap-ariba
    - servicenow
    - invoice-processing
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given an Ariba invoice ID and SAP PO number, fetch the invoice details, create a ServiceNow approval task, and notify the AP team in Teams."
          inputParameters:
            - name: ariba_invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice identifier."
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to validate against."
            - name: vendor_name
              in: body
              type: string
              description: "The vendor name for notification context."
          steps:
            - name: get-invoice
              type: call
              call: "sap-ariba.get-invoice"
              with:
                invoice_id: "{{ariba_invoice_id}}"
            - name: create-approval-task
              type: call
              call: "servicenow-ap.create-task"
              with:
                short_description: "Invoice approval: {{vendor_name}} — {{ariba_invoice_id}}"
                description: "Invoice {{ariba_invoice_id}} from {{vendor_name}} against PO {{po_number}}. Amount: {{get-invoice.total_amount}} {{get-invoice.currency}}."
                assignment_group: "Finance_AP"
            - name: notify-ap-team
              type: call
              call: "msteams-ap.send-message"
              with:
                recipient_upn: "finance-ap@anheuser-busch.com"
                message: "Invoice {{ariba_invoice_id}} from {{vendor_name}} pending approval. PO: {{po_number}}. Task: {{create-approval-task.number}}."
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: servicenow-ap
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a critical Datadog alert fires in the Anheuser-Busch environment, creates a ServiceNow incident and posts an alert to the IT operations Teams channel.

naftiko: "0.5"
info:
  label: "IT Incident Response Chain"
  description: "When a critical Datadog alert fires in the Anheuser-Busch environment, creates a ServiceNow incident and posts an alert to the IT operations Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog alert ID, affected service, and severity, create a ServiceNow incident and notify the IT ops Teams channel."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert or monitor ID."
            - name: service_name
              in: body
              type: string
              description: "The name of the affected service or application."
            - name: severity
              in: body
              type: string
              description: "Alert severity: critical, high, medium, or low."
            - name: alert_message
              in: body
              type: string
              description: "The alert message body from Datadog."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-ops.create-incident"
              with:
                short_description: "{{severity}} alert: {{service_name}} — {{alert_id}}"
                description: "{{alert_message}}"
                urgency: "1"
                impact: "1"
                assignment_group: "IT_Operations"
            - name: post-alert
              type: call
              call: "msteams-ops.post-channel-message"
              with:
                channel_id: "it-ops-alerts"
                message: "INCIDENT: {{severity}} on {{service_name}} | Datadog: {{alert_id}} | SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow-ops
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-ops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a Jira issue by key, returning summary, status, assignee, and priority.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: get-issue
          description: "Look up a Jira issue by key. Returns summary, current status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g. BREW-1234)."
          call: "jira.get-issue"
          with:
            key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://anheuser-busch.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-issue
              method: GET

Generates a daily sprint status digest from Jira and posts it to the engineering Teams channel for stand-up preparation.

naftiko: "0.5"
info:
  label: "Jira Sprint Digest Report"
  description: "Generates a daily sprint status digest from Jira and posts it to the engineering Teams channel for stand-up preparation."
  tags:
    - devops
    - jira
    - reporting
    - sprint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: digest-sprint-status
          description: "Given a Jira project key and sprint name, fetch all sprint issues and post a summary digest to the engineering Teams channel."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. TECH."
            - name: sprint_name
              in: body
              type: string
              description: "The Jira sprint name to summarize."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel ID to post the digest to."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira-sprint.search-issues"
              with:
                jql: "project = {{project_key}} AND sprint = '{{sprint_name}}'"
            - name: post-digest
              type: call
              call: "msteams-sprint.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "Sprint Digest — {{project_key}} / {{sprint_name}}: Total: {{get-sprint-issues.total}} | Done: {{get-sprint-issues.done_count}} | In Progress: {{get-sprint-issues.inprogress_count}} | Blocked: {{get-sprint-issues.blocked_count}}"
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://anheuser-busch.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/search"
          operations:
            - name: search-issues
              method: GET
              inputParameters:
                - name: jql
                  in: query
    - type: http
      namespace: msteams-sprint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks keg inventory from SAP, updates deposit records in Salesforce, and alerts the logistics team via Teams when return rates drop below threshold.

naftiko: "0.5"
info:
  label: "Keg Tracking and Deposit Management"
  description: "Tracks keg inventory from SAP, updates deposit records in Salesforce, and alerts the logistics team via Teams when return rates drop below threshold."
  tags:
    - logistics
    - sap
    - salesforce
    - microsoft-teams
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: keg-ops
      port: 8080
      tools:
        - name: track-keg-deposits
          description: "Given a region code, pull keg inventory from SAP, update Salesforce deposit records, and alert logistics if return rates are low."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The distribution region code."
          steps:
            - name: get-keg-inventory
              type: call
              call: "sap-keg.get-returnable-stock"
              with:
                region: "{{region}}"
            - name: update-deposits
              type: call
              call: "salesforce-keg.update-deposit-summary"
              with:
                region: "{{region}}"
                outstanding: "{{get-keg-inventory.outstanding_kegs}}"
                return_rate: "{{get-keg-inventory.return_rate}}"
            - name: alert-logistics
              type: call
              call: "msteams-keg.post-message"
              with:
                channel_id: "$secrets.teams_logistics_channel_id"
                message: "Keg Tracking — {{region}}: Outstanding {{get-keg-inventory.outstanding_kegs}} | Return Rate {{get-keg-inventory.return_rate}}% | Deposit Value ${{get-keg-inventory.deposit_value}}"
  consumes:
    - type: http
      namespace: sap-keg
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: returnable-stock
          path: "/A_MatlStkInAcctMod"
          operations:
            - name: get-returnable-stock
              method: GET
    - type: http
      namespace: salesforce-keg
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: deposits
          path: "/sobjects/Keg_Deposit__c"
          operations:
            - name: update-deposit-summary
              method: PATCH
    - type: http
      namespace: msteams-keg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls LinkedIn company page analytics, compares against hiring targets in Workday, and posts a weekly employer brand digest to the talent acquisition Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Performance Digest"
  description: "Pulls LinkedIn company page analytics, compares against hiring targets in Workday, and posts a weekly employer brand digest to the talent acquisition Teams channel."
  tags:
    - hr
    - linkedin
    - workday
    - microsoft-teams
    - employer-brand
capability:
  exposes:
    - type: mcp
      namespace: employer-brand
      port: 8080
      tools:
        - name: generate-employer-brand-digest
          description: "Pull LinkedIn page analytics, compare with Workday hiring metrics, and post a digest to the talent acquisition Teams channel."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g. last_7_days)."
          steps:
            - name: get-linkedin-stats
              type: call
              call: "linkedin-eb.get-page-analytics"
              with:
                period: "{{period}}"
            - name: get-hiring-metrics
              type: call
              call: "workday-eb.get-open-requisitions"
              with:
                status: "open"
            - name: post-digest
              type: call
              call: "msteams-eb.post-message"
              with:
                channel_id: "$secrets.teams_ta_channel_id"
                message: "Employer Brand Digest: Followers {{get-linkedin-stats.follower_count}} (+{{get-linkedin-stats.new_followers}}) | Impressions {{get-linkedin-stats.impressions}} | Open Reqs: {{get-hiring-metrics.open_count}} | Applicants: {{get-hiring-metrics.total_applicants}}"
  consumes:
    - type: http
      namespace: linkedin-eb
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/organizationalEntityShareStatistics"
          operations:
            - name: get-page-analytics
              method: GET
    - type: http
      namespace: workday-eb
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/jobRequisitions"
          operations:
            - name: get-open-requisitions
              method: GET
    - type: http
      namespace: msteams-eb
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager in Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Acquisition Signal"
  description: "When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager in Teams."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: enrich-candidate-profile
          description: "Given a LinkedIn member URN and Workday job requisition ID, fetch the LinkedIn profile, create the candidate record in Workday, and notify the hiring manager via Teams."
          inputParameters:
            - name: linkedin_member_urn
              in: body
              type: string
              description: "The LinkedIn member URN for the candidate."
            - name: job_req_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: hiring_manager_upn
              in: body
              type: string
              description: "The UPN of the hiring manager to notify."
          steps:
            - name: get-linkedin-profile
              type: call
              call: "linkedin.get-profile"
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: create-candidate
              type: call
              call: "workday-recruit.create-candidate"
              with:
                job_req_id: "{{job_req_id}}"
                first_name: "{{get-linkedin-profile.firstName}}"
                last_name: "{{get-linkedin-profile.lastName}}"
                headline: "{{get-linkedin-profile.headline}}"
            - name: notify-hiring-manager
              type: call
              call: "msteams-recruit.send-message"
              with:
                recipient_upn: "{{hiring_manager_upn}}"
                message: "New candidate: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} applied for req {{job_req_id}}. Workday ID: {{create-candidate.candidate_id}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: workday-recruit
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: candidates
          path: "/anheuser-busch/jobRequisitions/{{job_req_id}}/candidates"
          inputParameters:
            - name: job_req_id
              in: path
          operations:
            - name: create-candidate
              method: POST
    - type: http
      namespace: msteams-recruit
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Validates new product readiness by checking SAP material master, Salesforce product listing, and Snowflake demand forecast, then summarizes in Teams.

naftiko: "0.5"
info:
  label: "New Product Launch Readiness Check"
  description: "Validates new product readiness by checking SAP material master, Salesforce product listing, and Snowflake demand forecast, then summarizes in Teams."
  tags:
    - product-management
    - sap
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-launch
      port: 8080
      tools:
        - name: check-launch-readiness
          description: "Given a material number, validate SAP setup, Salesforce product listing, and demand forecast, then post readiness summary to Teams."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the new product."
          steps:
            - name: check-sap
              type: call
              call: "sap-launch.get-material"
              with:
                material: "{{material_number}}"
            - name: check-sf
              type: call
              call: "salesforce-launch.get-product"
              with:
                material: "{{material_number}}"
            - name: check-forecast
              type: call
              call: "snowflake-launch.query-forecast"
              with:
                material: "{{material_number}}"
            - name: post-readiness
              type: call
              call: "msteams-launch.post-message"
              with:
                channel_id: "$secrets.teams_product_channel_id"
                message: "Launch Readiness: {{material_number}} | SAP: {{check-sap.status}} | SF Listing: {{check-sf.active}} | Forecast: {{check-forecast.projected_units}} units"
  consumes:
    - type: http
      namespace: sap-launch
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material}}')"
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: salesforce-launch
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: products
          path: "/sobjects/Product2"
          operations:
            - name: get-product
              method: GET
    - type: http
      namespace: snowflake-launch
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-forecast
              method: POST
    - type: http
      namespace: msteams-launch
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves users with privileged Okta group memberships, cross-references with Workday active employee status, and creates a Jira task for access review.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Review"
  description: "Retrieves users with privileged Okta group memberships, cross-references with Workday active employee status, and creates a Jira task for access review."
  tags:
    - security
    - okta
    - workday
    - jira
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: review-privileged-access
          description: "Given an Okta group name, list members, verify employment in Workday, and create a Jira review task for terminated employees with active access."
          inputParameters:
            - name: group_name
              in: body
              type: string
              description: "The Okta group name for privileged access."
          steps:
            - name: get-members
              type: call
              call: "okta-review.get-group-members"
              with:
                group: "{{group_name}}"
            - name: check-employment
              type: call
              call: "workday-review.get-active-status"
              with:
                employee_ids: "{{get-members.employee_ids}}"
            - name: create-review
              type: call
              call: "jira-review.create-issue"
              with:
                project: "SEC"
                summary: "Privileged access review: {{group_name}}"
                description: "Total members: {{get-members.count}} | Flagged for review: {{check-employment.flagged_count}} | Details: {{check-employment.flagged_users}}"
  consumes:
    - type: http
      namespace: okta-review
      baseUri: "https://anheuser-busch.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: groups
          path: "/groups/{{group}}/users"
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: workday-review
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: get-active-status
              method: GET
    - type: http
      namespace: jira-review
      baseUri: "https://anheuser-busch.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

Checks an Okta user account status by login email, returning account state, last login, and MFA enrollment.

naftiko: "0.5"
info:
  label: "Okta User Status Check"
  description: "Checks an Okta user account status by login email, returning account state, last login, and MFA enrollment."
  tags:
    - identity
    - okta
    - security
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: get-user-status
          description: "Look up an Okta user by login. Returns account status, last login timestamp, and MFA status."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login (email address)."
          call: "okta.get-user"
          with:
            login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
            - name: name
              type: string
              mapping: "$.profile.displayName"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://anheuser-busch.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves on-premise account data from Salesforce, identifies accounts overdue for visits based on Snowflake activity, and creates Jira tasks for sales reps.

naftiko: "0.5"
info:
  label: "On-Premise Account Visit Planner"
  description: "Retrieves on-premise account data from Salesforce, identifies accounts overdue for visits based on Snowflake activity, and creates Jira tasks for sales reps."
  tags:
    - sales
    - salesforce
    - snowflake
    - jira
    - field-sales
capability:
  exposes:
    - type: mcp
      namespace: visit-planner
      port: 8080
      tools:
        - name: plan-account-visits
          description: "Given a territory, identify on-premise accounts overdue for visits and create Jira tasks for field reps."
          inputParameters:
            - name: territory
              in: body
              type: string
              description: "The sales territory code."
          steps:
            - name: get-accounts
              type: call
              call: "salesforce-visit.get-overdue-accounts"
              with:
                territory: "{{territory}}"
            - name: get-activity
              type: call
              call: "snowflake-visit.query-recent-activity"
              with:
                territory: "{{territory}}"
            - name: create-tasks
              type: call
              call: "jira-visit.create-issue"
              with:
                project: "SALES"
                summary: "Account visit plan: {{territory}} — {{get-accounts.overdue_count}} accounts overdue"
                description: "Priority accounts: {{get-accounts.priority_names}} | Days since last visit: {{get-activity.avg_days_since_visit}}"
  consumes:
    - type: http
      namespace: salesforce-visit
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/query"
          operations:
            - name: get-overdue-accounts
              method: GET
    - type: http
      namespace: snowflake-visit
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-recent-activity
              method: POST
    - type: http
      namespace: jira-visit
      baseUri: "https://anheuser-busch.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

Retrieves product attributes from SAP, generates marketing copy using OpenAI, and updates the Salesforce product record with the new description.

naftiko: "0.5"
info:
  label: "OpenAI Product Description Generator"
  description: "Retrieves product attributes from SAP, generates marketing copy using OpenAI, and updates the Salesforce product record with the new description."
  tags:
    - marketing
    - ai
    - openai
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: content-gen
      port: 8080
      tools:
        - name: generate-product-description
          description: "Given a material number, pull SAP product attributes, generate marketing copy via OpenAI, and update the Salesforce product listing."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: tone
              in: body
              type: string
              description: "The desired tone (e.g. casual, premium, festive)."
          steps:
            - name: get-product
              type: call
              call: "sap-content.get-material"
              with:
                material: "{{material_number}}"
            - name: generate-copy
              type: call
              call: "openai-content.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Write a compelling {{tone}} product description for: {{get-product.description}} | ABV: {{get-product.abv}} | Style: {{get-product.style}} | Package: {{get-product.package_type}}"
            - name: update-sf
              type: call
              call: "salesforce-content.update-product"
              with:
                material: "{{material_number}}"
                description: "{{generate-copy.text}}"
  consumes:
    - type: http
      namespace: sap-content
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material}}')"
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: openai-content
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST
    - type: http
      namespace: salesforce-content
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: products
          path: "/sobjects/Product2"
          operations:
            - name: update-product
              method: PATCH

When PagerDuty triggers a critical alert, creates a ServiceNow major incident and notifies the IT leadership Teams channel with runbook links.

naftiko: "0.5"
info:
  label: "PagerDuty Critical Alert to Incident"
  description: "When PagerDuty triggers a critical alert, creates a ServiceNow major incident and notifies the IT leadership Teams channel with runbook links."
  tags:
    - incident-response
    - pagerduty
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pagerduty-ops
      port: 8080
      tools:
        - name: escalate-critical-alert
          description: "Given a PagerDuty incident ID, create a ServiceNow major incident and alert IT leadership via Teams."
          inputParameters:
            - name: pd_incident_id
              in: body
              type: string
              description: "The PagerDuty incident ID."
          steps:
            - name: get-pd-incident
              type: call
              call: "pagerduty.get-incident"
              with:
                incident_id: "{{pd_incident_id}}"
            - name: create-snow-incident
              type: call
              call: "servicenow-pd.create-incident"
              with:
                short_description: "{{get-pd-incident.title}}"
                description: "PagerDuty: {{pd_incident_id}} | Service: {{get-pd-incident.service.summary}} | Urgency: {{get-pd-incident.urgency}}"
                impact: "1"
                urgency: "1"
            - name: notify-leadership
              type: call
              call: "msteams-pd.post-message"
              with:
                channel_id: "$secrets.teams_it_leadership_channel_id"
                message: "CRITICAL: {{get-pd-incident.title}} | Service: {{get-pd-incident.service.summary}} | INC: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_api_key"
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: servicenow-pd
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-pd
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Returns current headcount by department and cost center from Workday for finance planning and headcount reporting.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Returns current headcount by department and cost center from Workday for finance planning and headcount reporting."
  tags:
    - hr
    - finance
    - reporting
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns a list of active Anheuser-Busch employees grouped by department and cost center from Workday. Use for headcount planning and budget reviews."
          call: "workday-hc.headcount-report"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: workday-hc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/anheuser-busch/reports/headcount"
          operations:
            - name: headcount-report
              method: GET

Checks the last refresh status and timestamp for a Power BI dataset.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status and timestamp for a Power BI dataset."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: powerbi
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Check the latest refresh status for a Power BI dataset. Returns status, start time, and end time."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
            - 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: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Triggers a Power BI dataset refresh for the distributor sales report and notifies the sales analytics team in Teams when complete.

naftiko: "0.5"
info:
  label: "Power BI Sales Report Refresh"
  description: "Triggers a Power BI dataset refresh for the distributor sales report and notifies the sales analytics team in Teams when complete."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-sales-report
          description: "Given a Power BI workspace ID and dataset ID, trigger a refresh for the distributor sales dataset and notify the sales analytics Teams channel."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-analytics-team
              type: call
              call: "msteams-bi.post-channel-message"
              with:
                channel_id: "sales-analytics"
                message: "Power BI sales dataset {{dataset_id}} refresh triggered. Refresh ID: {{trigger-refresh.refresh_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-bi
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a brewery production line reports downtime, creates a maintenance work order in SAP PM, a ServiceNow incident, and alerts the plant operations Teams channel.

naftiko: "0.5"
info:
  label: "Production Line Downtime Response"
  description: "When a brewery production line reports downtime, creates a maintenance work order in SAP PM, a ServiceNow incident, and alerts the plant operations Teams channel."
  tags:
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant-ops
      port: 8080
      tools:
        - name: handle-line-downtime
          description: "Given a plant code and production line ID, create a SAP maintenance notification, a ServiceNow incident, and notify plant operations via Teams."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
            - name: line_id
              in: body
              type: string
              description: "The production line identifier."
            - name: reason
              in: body
              type: string
              description: "The downtime reason description."
          steps:
            - name: create-sap-notification
              type: call
              call: "sap-pm.create-notification"
              with:
                plant: "{{plant_code}}"
                equipment: "{{line_id}}"
                description: "{{reason}}"
            - name: create-snow-incident
              type: call
              call: "servicenow-plant.create-incident"
              with:
                short_description: "Line downtime: {{line_id}} at plant {{plant_code}}"
                description: "Reason: {{reason}} | SAP Notification: {{create-sap-notification.notification_id}}"
                urgency: "1"
            - name: notify-ops
              type: call
              call: "msteams-plant.post-message"
              with:
                channel_id: "$secrets.teams_plant_ops_channel_id"
                message: "Production Line Down: {{line_id}} at {{plant_code}} | Reason: {{reason}} | SAP: {{create-sap-notification.notification_id}} | INC: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/MaintenanceNotification"
          operations:
            - name: create-notification
              method: POST
    - type: http
      namespace: servicenow-plant
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-plant
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

When a promotional pricing request is submitted in Salesforce, validates against SAP pricing conditions and routes for approval via ServiceNow.

naftiko: "0.5"
info:
  label: "Promotional Pricing Approval Workflow"
  description: "When a promotional pricing request is submitted in Salesforce, validates against SAP pricing conditions and routes for approval via ServiceNow."
  tags:
    - pricing
    - salesforce
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: pricing-ops
      port: 8080
      tools:
        - name: process-promo-pricing
          description: "Given a Salesforce promo request ID, validate against SAP pricing, and create a ServiceNow approval request."
          inputParameters:
            - name: promo_request_id
              in: body
              type: string
              description: "The Salesforce promotional pricing request ID."
          steps:
            - name: get-promo
              type: call
              call: "salesforce-pricing.get-promo-request"
              with:
                request_id: "{{promo_request_id}}"
            - name: validate-pricing
              type: call
              call: "sap-pricing.get-condition"
              with:
                material: "{{get-promo.Material__c}}"
                sales_org: "{{get-promo.Sales_Org__c}}"
            - name: create-approval
              type: call
              call: "servicenow-pricing.create-request"
              with:
                short_description: "Promo pricing approval: {{get-promo.Name}}"
                description: "Current price: {{validate-pricing.net_price}} | Requested: {{get-promo.Requested_Price__c}} | Discount: {{get-promo.Discount_Percent__c}}%"
  consumes:
    - type: http
      namespace: salesforce-pricing
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: promo-requests
          path: "/sobjects/Promo_Request__c/{{request_id}}"
          operations:
            - name: get-promo-request
              method: GET
    - type: http
      namespace: sap-pricing
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: conditions
          path: "/A_SlsPrcgCndnRecdValidity"
          operations:
            - name: get-condition
              method: GET
    - type: http
      namespace: servicenow-pricing
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Compares SAP purchase order prices against Snowflake market benchmarks and alerts procurement via Teams when variances exceed threshold.

naftiko: "0.5"
info:
  label: "Raw Material Price Variance Alert"
  description: "Compares SAP purchase order prices against Snowflake market benchmarks and alerts procurement via Teams when variances exceed threshold."
  tags:
    - procurement
    - sap
    - snowflake
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: price-variance
      port: 8080
      tools:
        - name: check-price-variance
          description: "Given a material group, compare SAP PO prices against Snowflake benchmarks and alert procurement if variance exceeds threshold."
          inputParameters:
            - name: material_group
              in: body
              type: string
              description: "The SAP material group code."
          steps:
            - name: get-po-prices
              type: call
              call: "sap-pv.get-recent-prices"
              with:
                material_group: "{{material_group}}"
            - name: get-benchmarks
              type: call
              call: "snowflake-pv.query-market-prices"
              with:
                material_group: "{{material_group}}"
            - name: alert-procurement
              type: call
              call: "msteams-pv.post-message"
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                message: "Price Variance Alert: {{material_group}} | Avg PO Price: ${{get-po-prices.avg_price}} | Market: ${{get-benchmarks.market_price}} | Variance: {{get-benchmarks.variance_percent}}%"
  consumes:
    - type: http
      namespace: sap-pv
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_PurchaseOrder"
          operations:
            - name: get-recent-prices
              method: GET
    - type: http
      namespace: snowflake-pv
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-market-prices
              method: POST
    - type: http
      namespace: msteams-pv
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Validates product label compliance data from SAP against regulatory requirements stored in Snowflake, and creates a Jira task if issues are found.

naftiko: "0.5"
info:
  label: "Regulatory Label Compliance Check"
  description: "Validates product label compliance data from SAP against regulatory requirements stored in Snowflake, and creates a Jira task if issues are found."
  tags:
    - compliance
    - sap
    - snowflake
    - jira
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: label-compliance
      port: 8080
      tools:
        - name: check-label-compliance
          description: "Given a material number, validate SAP label data against Snowflake regulatory rules and create a Jira issue if non-compliant."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number to validate."
            - name: market
              in: body
              type: string
              description: "The target market (e.g. US, EU, BR)."
          steps:
            - name: get-label-data
              type: call
              call: "sap-label.get-material-label"
              with:
                material: "{{material_number}}"
            - name: get-requirements
              type: call
              call: "snowflake-label.query-regulations"
              with:
                market: "{{market}}"
                category: "{{get-label-data.product_category}}"
            - name: create-issue
              type: call
              call: "jira-label.create-issue"
              with:
                project: "REG"
                summary: "Label compliance review: {{material_number}} for {{market}}"
                description: "Product: {{get-label-data.description}} | ABV: {{get-label-data.abv}} | Required disclosures: {{get-requirements.required_fields}}"
  consumes:
    - type: http
      namespace: sap-label
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: labels
          path: "/A_Product('{{material}}')"
          operations:
            - name: get-material-label
              method: GET
    - type: http
      namespace: snowflake-label
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-regulations
              method: POST
    - type: http
      namespace: jira-label
      baseUri: "https://anheuser-busch.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

Creates a new retailer account in Salesforce, sets up the customer master in SAP, and sends a welcome notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Retailer Onboarding Workflow"
  description: "Creates a new retailer account in Salesforce, sets up the customer master in SAP, and sends a welcome notification via Microsoft Teams."
  tags:
    - sales
    - salesforce
    - sap
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: retailer-ops
      port: 8080
      tools:
        - name: onboard-new-retailer
          description: "Given retailer details, create a Salesforce account, SAP customer master, and send a Teams welcome message to the regional sales team."
          inputParameters:
            - name: retailer_name
              in: body
              type: string
              description: "The name of the new retailer."
            - name: region
              in: body
              type: string
              description: "The sales region for the retailer."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact email for the retailer."
          steps:
            - name: create-sf-account
              type: call
              call: "salesforce-retail.create-account"
              with:
                name: "{{retailer_name}}"
                region: "{{region}}"
                email: "{{contact_email}}"
            - name: create-sap-customer
              type: call
              call: "sap-retail.create-customer"
              with:
                name: "{{retailer_name}}"
                sales_org: "{{region}}"
                sf_id: "{{create-sf-account.id}}"
            - name: notify-sales
              type: call
              call: "msteams-retail.post-message"
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                message: "New retailer onboarded: {{retailer_name}} in {{region}} | SF ID: {{create-sf-account.id}} | SAP: {{create-sap-customer.customer_number}}"
  consumes:
    - type: http
      namespace: salesforce-retail
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
    - type: http
      namespace: sap-retail
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/A_Customer"
          operations:
            - name: create-customer
              method: POST
    - type: http
      namespace: msteams-retail
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

When a qualifying LinkedIn signal occurs for a key account contact, enriches the Salesforce record and notifies the account manager in Teams.

naftiko: "0.5"
info:
  label: "Sales Intelligence Enrichment from LinkedIn"
  description: "When a qualifying LinkedIn signal occurs for a key account contact, enriches the Salesforce record and notifies the account manager in Teams."
  tags:
    - sales
    - crm
    - salesforce
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-contact-from-linkedin
          description: "Given a LinkedIn member URN and Salesforce contact ID, fetch the LinkedIn profile, enrich the Salesforce contact, and notify the account manager in Teams."
          inputParameters:
            - name: linkedin_member_urn
              in: body
              type: string
              description: "The LinkedIn member URN for the contact."
            - name: salesforce_contact_id
              in: body
              type: string
              description: "The Salesforce contact record ID."
            - name: account_manager_upn
              in: body
              type: string
              description: "The UPN of the account manager to notify."
          steps:
            - name: get-linkedin-profile
              type: call
              call: "linkedin.get-profile"
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: enrich-salesforce
              type: call
              call: "salesforce-si.update-contact"
              with:
                contact_id: "{{salesforce_contact_id}}"
                title: "{{get-linkedin-profile.headline}}"
                linkedin_profile: "https://www.linkedin.com/in/{{get-linkedin-profile.vanityName}}"
            - name: notify-account-manager
              type: call
              call: "msteams-si.send-message"
              with:
                recipient_upn: "{{account_manager_upn}}"
                message: "Lead Signal: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} | Title: {{get-linkedin-profile.headline}} | Salesforce enriched."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: salesforce-si
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: update-contact
              method: PATCH
    - type: http
      namespace: msteams-si
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a territory realignment is approved in Salesforce, updates SAP sales org assignments and notifies affected account managers via Teams.

naftiko: "0.5"
info:
  label: "Sales Territory Realignment Sync"
  description: "When a territory realignment is approved in Salesforce, updates SAP sales org assignments and notifies affected account managers via Teams."
  tags:
    - sales
    - salesforce
    - sap
    - microsoft-teams
    - territory-management
capability:
  exposes:
    - type: mcp
      namespace: territory-ops
      port: 8080
      tools:
        - name: sync-territory-realignment
          description: "Given a territory change request ID, apply Salesforce territory updates to SAP and notify affected managers via Teams."
          inputParameters:
            - name: change_request_id
              in: body
              type: string
              description: "The Salesforce territory change request ID."
          steps:
            - name: get-changes
              type: call
              call: "salesforce-territory.get-change-request"
              with:
                request_id: "{{change_request_id}}"
            - name: update-sap
              type: call
              call: "sap-territory.update-sales-org"
              with:
                accounts: "{{get-changes.affected_accounts}}"
                new_territory: "{{get-changes.new_territory}}"
            - name: notify-managers
              type: call
              call: "msteams-territory.post-message"
              with:
                channel_id: "$secrets.teams_sales_ops_channel_id"
                message: "Territory Realignment: {{get-changes.affected_accounts_count}} accounts moved to {{get-changes.new_territory}} | Effective: {{get-changes.effective_date}}"
  consumes:
    - type: http
      namespace: salesforce-territory
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: territories
          path: "/sobjects/Territory_Change__c/{{request_id}}"
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: sap-territory
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/A_Customer"
          operations:
            - name: update-sales-org
              method: PATCH
    - type: http
      namespace: msteams-territory
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves a Salesforce support case by case number, returning subject, status, priority, and assigned owner.

naftiko: "0.5"
info:
  label: "Salesforce Case Lookup"
  description: "Retrieves a Salesforce support case by case number, returning subject, status, priority, and assigned owner."
  tags:
    - support
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce-cases
      port: 8080
      tools:
        - name: get-case
          description: "Look up a Salesforce case by case number. Returns subject, status, priority, and owner."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The Salesforce case number."
          call: "salesforce-cases.get-case"
          with:
            case_number: "{{case_number}}"
          outputParameters:
            - name: subject
              type: string
              mapping: "$.Subject"
            - name: status
              type: string
              mapping: "$.Status"
            - name: priority
              type: string
              mapping: "$.Priority"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce-cases
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_number}}"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: get-case
              method: GET

Retrieves the current status, active contracts, and recent orders for an Anheuser-Busch Salesforce distributor account.

naftiko: "0.5"
info:
  label: "Salesforce Distributor Account Lookup"
  description: "Retrieves the current status, active contracts, and recent orders for an Anheuser-Busch Salesforce distributor account."
  tags:
    - sales
    - crm
    - salesforce
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: crm-distribution
      port: 8080
      tools:
        - name: get-distributor-account
          description: "Look up a Salesforce distributor account by ID. Returns account status, contract count, and recent order volume. Use for distributor relationship management."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the distributor."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: status
              type: string
              mapping: "$.Status__c"
            - name: region
              type: string
              mapping: "$.Region__c"
            - name: annual_volume
              type: number
              mapping: "$.Annual_Volume__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Retrieves a Salesforce lead record by ID, returning lead status, company, and conversion readiness score.

naftiko: "0.5"
info:
  label: "Salesforce Lead Lookup"
  description: "Retrieves a Salesforce lead record by ID, returning lead status, company, and conversion readiness score."
  tags:
    - sales
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce-leads
      port: 8080
      tools:
        - name: get-lead
          description: "Look up a Salesforce lead by ID. Returns lead status, company name, and lead score."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead record ID."
          call: "salesforce-leads.get-lead"
          with:
            lead_id: "{{lead_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: status
              type: string
              mapping: "$.Status"
            - name: company
              type: string
              mapping: "$.Company"
            - name: score
              type: number
              mapping: "$.Lead_Score__c"
  consumes:
    - type: http
      namespace: salesforce-leads
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET

Retrieves a Salesforce opportunity by ID, returning stage, close date, amount, and probability.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, close date, amount, and probability."
  tags:
    - sales
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce-opps
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID. Returns stage name, close date, amount, and win probability."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: "salesforce-opps.get-opportunity"
          with:
            opp_id: "{{opportunity_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
            - name: amount
              type: number
              mapping: "$.Amount"
            - name: probability
              type: number
              mapping: "$.Probability"
  consumes:
    - type: http
      namespace: salesforce-opps
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET

Extracts AR aging data from SAP, loads into Snowflake for trend analysis, and sends a summary report to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Accounts Receivable Aging Report"
  description: "Extracts AR aging data from SAP, loads into Snowflake for trend analysis, and sends a summary report to the finance Teams channel."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
    - accounts-receivable
capability:
  exposes:
    - type: mcp
      namespace: ar-ops
      port: 8080
      tools:
        - name: generate-ar-aging-report
          description: "Given a company code, extract SAP AR aging data, load into Snowflake, and post a summary to the finance Teams channel."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: as_of_date
              in: body
              type: string
              description: "The aging report date in YYYY-MM-DD format."
          steps:
            - name: get-aging
              type: call
              call: "sap-ar.get-ar-aging"
              with:
                company_code: "{{company_code}}"
                key_date: "{{as_of_date}}"
            - name: load-snapshot
              type: call
              call: "snowflake-ar.insert-snapshot"
              with:
                table: "FINANCE.AR_AGING_SNAPSHOTS"
                company_code: "{{company_code}}"
                date: "{{as_of_date}}"
                data: "{{get-aging.records}}"
            - name: post-summary
              type: call
              call: "msteams-ar.post-message"
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                message: "AR Aging Report — {{company_code}} ({{as_of_date}}): Current ${{get-aging.current}} | 30d ${{get-aging.past_30}} | 60d ${{get-aging.past_60}} | 90d+ ${{get-aging.past_90}}"
  consumes:
    - type: http
      namespace: sap-ar
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: aging
          path: "/A_CustomerLineItem"
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: snowflake-ar
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-snapshot
              method: POST
    - type: http
      namespace: msteams-ar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Traces a production batch through the SAP supply chain, retrieves related quality data from Snowflake, and logs the trace in ServiceNow for audit.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Traces a production batch through the SAP supply chain, retrieves related quality data from Snowflake, and logs the trace in ServiceNow for audit."
  tags:
    - quality
    - sap
    - snowflake
    - servicenow
    - traceability
capability:
  exposes:
    - type: mcp
      namespace: trace-ops
      port: 8080
      tools:
        - name: trace-batch
          description: "Given a batch number, trace it through SAP, pull quality data from Snowflake, and log in ServiceNow for audit compliance."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number."
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          steps:
            - name: get-batch-history
              type: call
              call: "sap-trace.get-batch-where-used"
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: get-quality-data
              type: call
              call: "snowflake-trace.query-batch-quality"
              with:
                batch: "{{batch_number}}"
            - name: log-audit
              type: call
              call: "servicenow-trace.create-record"
              with:
                short_description: "Batch trace: {{batch_number}} ({{material_number}})"
                description: "Locations: {{get-batch-history.locations}} | Quality Score: {{get-quality-data.overall_score}} | Shipped To: {{get-batch-history.customers}}"
  consumes:
    - type: http
      namespace: sap-trace
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch"
          operations:
            - name: get-batch-where-used
              method: GET
    - type: http
      namespace: snowflake-trace
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-batch-quality
              method: POST
    - type: http
      namespace: servicenow-trace
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_audit_log"
          operations:
            - name: create-record
              method: POST

Retrieves a billing document from SAP S/4HANA by document number, returning billed amount, payer, and billing date.

naftiko: "0.5"
info:
  label: "SAP Billing Document Lookup"
  description: "Retrieves a billing document from SAP S/4HANA by document number, returning billed amount, payer, and billing date."
  tags:
    - finance
    - sap
    - billing
capability:
  exposes:
    - type: mcp
      namespace: sap-billing
      port: 8080
      tools:
        - name: get-billing-document
          description: "Look up a SAP billing document. Returns net amount, payer name, billing date, and currency."
          inputParameters:
            - name: billing_doc_number
              in: body
              type: string
              description: "The SAP billing document number."
          call: "sap-billing.get-doc"
          with:
            doc_id: "{{billing_doc_number}}"
          outputParameters:
            - name: net_amount
              type: string
              mapping: "$.d.TotalNetAmount"
            - name: payer
              type: string
              mapping: "$.d.PayerParty"
            - name: billing_date
              type: string
              mapping: "$.d.BillingDocumentDate"
  consumes:
    - type: http
      namespace: sap-billing
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: billing-documents
          path: "/A_BillingDocument('{{doc_id}}')"
          inputParameters:
            - name: doc_id
              in: path
          operations:
            - name: get-doc
              method: GET

Retrieves a pending expense report from SAP Concur and routes it for manager approval via ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "Retrieves a pending expense report from SAP Concur and routes it for manager approval via ServiceNow."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: expense-mgmt
      port: 8080
      tools:
        - name: process-expense-report
          description: "Given a SAP Concur expense report ID and employee ID, retrieve the report and create a ServiceNow approval task for the manager."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report identifier."
            - name: employee_id
              in: body
              type: string
              description: "The employee ID submitting the expense report."
          steps:
            - name: get-expense-report
              type: call
              call: "sap-concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: create-approval-task
              type: call
              call: "servicenow-exp.create-task"
              with:
                short_description: "Expense approval: {{employee_id}} — {{expense_report_id}}"
                description: "Amount: {{get-expense-report.total_amount}} {{get-expense-report.currency}}."
                assignment_group: "Finance_Expense"
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow-exp
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Scans SAP Concur for travel bookings that exceed policy limits, flags them in ServiceNow, and notifies the travel management Teams channel.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Policy Compliance Check"
  description: "Scans SAP Concur for travel bookings that exceed policy limits, flags them in ServiceNow, and notifies the travel management Teams channel."
  tags:
    - travel
    - sap-concur
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: travel-ops
      port: 8080
      tools:
        - name: check-travel-compliance
          description: "Given a booking date range, scan SAP Concur for policy violations, create ServiceNow tasks, and notify travel management via Teams."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-violations
              type: call
              call: "concur-travel.get-policy-violations"
              with:
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: create-task
              type: call
              call: "servicenow-travel.create-task"
              with:
                short_description: "Travel policy violations: {{start_date}} to {{end_date}}"
                description: "Violation count: {{get-violations.count}} | Total overage: ${{get-violations.total_overage}}"
            - name: notify-travel
              type: call
              call: "msteams-travel.post-message"
              with:
                channel_id: "$secrets.teams_travel_channel_id"
                message: "Travel Policy Alert: {{get-violations.count}} violations from {{start_date}} to {{end_date}} | Total overage: ${{get-violations.total_overage}} | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: concur-travel
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports"
          operations:
            - name: get-policy-violations
              method: GET
    - type: http
      namespace: servicenow-travel
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-travel
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Checks budget vs. actuals for a given cost center and fiscal period in SAP S/4HANA.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Check"
  description: "Checks budget vs. actuals for a given cost center and fiscal period in SAP S/4HANA."
  tags:
    - finance
    - sap
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: sap-controlling
      port: 8080
      tools:
        - name: get-cost-center-budget
          description: "Query budget and actual spend for a cost center in a fiscal year. Returns planned, actual, and variance amounts."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center ID."
          call: "sap-controlling.get-budget"
          with:
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: planned_amount
              type: number
              mapping: "$.d.PlanAmount"
            - name: actual_amount
              type: number
              mapping: "$.d.ActualAmount"
            - name: variance
              type: number
              mapping: "$.d.Variance"
  consumes:
    - type: http
      namespace: sap-controlling
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-budget
              method: GET

Retrieves an outbound delivery document from SAP S/4HANA, returning delivery status, ship-to party, and planned goods issue date.

naftiko: "0.5"
info:
  label: "SAP Delivery Document Lookup"
  description: "Retrieves an outbound delivery document from SAP S/4HANA, returning delivery status, ship-to party, and planned goods issue date."
  tags:
    - logistics
    - sap
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: sap-delivery
      port: 8080
      tools:
        - name: get-delivery
          description: "Look up a SAP outbound delivery by document number. Returns status, ship-to party, and goods issue date."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: "sap-delivery.get-delivery"
          with:
            delivery_id: "{{delivery_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallSDProcessStatus"
            - name: ship_to
              type: string
              mapping: "$.d.ShipToParty"
            - name: goods_issue_date
              type: string
              mapping: "$.d.PlannedGoodsIssueDate"
  consumes:
    - type: http
      namespace: sap-delivery
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_id}}')"
          inputParameters:
            - name: delivery_id
              in: path
          operations:
            - name: get-delivery
              method: GET

When a goods receipt is posted in SAP, runs a quality check and creates a ServiceNow quality notification if the batch fails inspection criteria.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt and Quality Notification"
  description: "When a goods receipt is posted in SAP, runs a quality check and creates a ServiceNow quality notification if the batch fails inspection criteria."
  tags:
    - quality
    - sap
    - servicenow
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: process-goods-receipt-quality
          description: "Given a goods receipt document number, verify the quality inspection result in SAP and create a ServiceNow notification if the batch fails."
          inputParameters:
            - name: goods_receipt_id
              in: body
              type: string
              description: "The SAP goods receipt document number."
          steps:
            - name: get-receipt
              type: call
              call: "sap-gr.get-goods-receipt"
              with:
                doc_id: "{{goods_receipt_id}}"
            - name: check-quality
              type: call
              call: "sap-gr.get-inspection-lot"
              with:
                batch: "{{get-receipt.batch}}"
            - name: create-notification
              type: call
              call: "servicenow-qual.create-incident"
              with:
                short_description: "Quality hold: batch {{get-receipt.batch}} failed inspection"
                description: "Material: {{get-receipt.material}} | Plant: {{get-receipt.plant}} | Result: {{check-quality.result}}"
                urgency: "2"
  consumes:
    - type: http
      namespace: sap-gr
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader"
          operations:
            - name: get-goods-receipt
              method: GET
            - name: get-inspection-lot
              method: GET
    - type: http
      namespace: servicenow-qual
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Reconciles intercompany billing documents between SAP company codes, logs discrepancies in Snowflake, and creates a Jira task for the accounting team.

naftiko: "0.5"
info:
  label: "SAP Intercompany Billing Reconciliation"
  description: "Reconciles intercompany billing documents between SAP company codes, logs discrepancies in Snowflake, and creates a Jira task for the accounting team."
  tags:
    - finance
    - sap
    - snowflake
    - jira
    - intercompany
capability:
  exposes:
    - type: mcp
      namespace: ic-billing
      port: 8080
      tools:
        - name: reconcile-intercompany-billing
          description: "Given two company codes and a billing period, reconcile SAP intercompany documents, log discrepancies in Snowflake, and create a Jira task."
          inputParameters:
            - name: company_code_1
              in: body
              type: string
              description: "The first SAP company code."
            - name: company_code_2
              in: body
              type: string
              description: "The second SAP company code."
            - name: period
              in: body
              type: string
              description: "The billing period in YYYY-MM format."
          steps:
            - name: get-documents
              type: call
              call: "sap-ic.get-ic-documents"
              with:
                cc1: "{{company_code_1}}"
                cc2: "{{company_code_2}}"
                period: "{{period}}"
            - name: log-discrepancies
              type: call
              call: "snowflake-ic.insert-discrepancies"
              with:
                table: "FINANCE.IC_RECONCILIATION"
                data: "{{get-documents.discrepancies}}"
            - name: create-task
              type: call
              call: "jira-ic.create-issue"
              with:
                project: "FIN"
                summary: "IC billing recon: {{company_code_1}} vs {{company_code_2}} ({{period}})"
                description: "Matched: {{get-documents.matched_count}} | Discrepancies: {{get-documents.discrepancy_count}} | Total variance: {{get-documents.total_variance}}"
  consumes:
    - type: http
      namespace: sap-ic
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: billing
          path: "/A_BillingDocument"
          operations:
            - name: get-ic-documents
              method: GET
    - type: http
      namespace: snowflake-ic
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-discrepancies
              method: POST
    - type: http
      namespace: jira-ic
      baseUri: "https://anheuser-busch.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

Checks current stock levels for a material at a specified plant in SAP S/4HANA.

naftiko: "0.5"
info:
  label: "SAP Inventory Stock Check"
  description: "Checks current stock levels for a material at a specified plant in SAP S/4HANA."
  tags:
    - inventory
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: sap-stock
      port: 8080
      tools:
        - name: get-stock-level
          description: "Query current unrestricted stock for a material at a given plant. Returns available quantity and unit."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number to check stock for."
          call: "sap-stock.get-stock"
          with:
            material: "{{material_number}}"
          outputParameters:
            - name: available_stock
              type: number
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
            - name: unit
              type: string
              mapping: "$.d.MaterialBaseUnit"
            - name: plant
              type: string
              mapping: "$.d.Plant"
  consumes:
    - type: http
      namespace: sap-stock
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod"
          inputParameters:
            - name: material
              in: query
          operations:
            - name: get-stock
              method: GET

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

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group."
  tags:
    - materials
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: sap-mat
      port: 8080
      tools:
        - name: get-material
          description: "Look up a SAP material master record by material number. Returns description, base unit, and material group."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap-mat.get-material"
          with:
            material_id: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialName"
            - name: base_unit
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap-mat
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_id}}')"
          inputParameters:
            - name: material_id
              in: path
          operations:
            - name: get-material
              method: GET

Retrieves overdue safety inspections from SAP EHS, creates ServiceNow tasks, and alerts the safety compliance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Plant Safety Inspection Tracker"
  description: "Retrieves overdue safety inspections from SAP EHS, creates ServiceNow tasks, and alerts the safety compliance Teams channel."
  tags:
    - safety
    - sap
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: safety-ops
      port: 8080
      tools:
        - name: track-safety-inspections
          description: "Given a plant code, find overdue safety inspections in SAP EHS, create ServiceNow tasks, and alert safety compliance via Teams."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
          steps:
            - name: get-overdue
              type: call
              call: "sap-safety.get-overdue-inspections"
              with:
                plant: "{{plant_code}}"
            - name: create-tasks
              type: call
              call: "servicenow-safety.create-task"
              with:
                short_description: "Overdue safety inspections at plant {{plant_code}}"
                description: "Overdue count: {{get-overdue.count}} | Types: {{get-overdue.inspection_types}}"
                urgency: "2"
            - name: alert-safety
              type: call
              call: "msteams-safety.post-message"
              with:
                channel_id: "$secrets.teams_safety_channel_id"
                message: "Safety Alert: {{get-overdue.count}} overdue inspections at plant {{plant_code}} | Types: {{get-overdue.inspection_types}} | Task: {{create-tasks.number}}"
  consumes:
    - type: http
      namespace: sap-safety
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspections
          path: "/A_SafetyInspection"
          operations:
            - name: get-overdue-inspections
              method: GET
    - type: http
      namespace: servicenow-safety
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-safety
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Looks up an Anheuser-Busch SAP S/4HANA purchase order by number and returns header status, vendor details, and total value.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up an Anheuser-Busch SAP S/4HANA purchase order by number and returns header status, vendor details, and total value."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number. Returns status, vendor name, total value, and currency. Use for procurement status checks and invoice matching."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500067890."
          call: "sap-erp.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Retrieves a sales order from SAP S/4HANA by order number, returning customer, net value, and delivery status.

naftiko: "0.5"
info:
  label: "SAP Sales Order Lookup"
  description: "Retrieves a sales order from SAP S/4HANA by order number, returning customer, net value, and delivery status."
  tags:
    - sales
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: sap-sales
      port: 8080
      tools:
        - name: get-sales-order
          description: "Look up a SAP sales order by number. Returns sold-to party, net value, currency, and overall status."
          inputParameters:
            - name: sales_order_number
              in: body
              type: string
              description: "The SAP sales order number."
          call: "sap-sales.get-order"
          with:
            order_id: "{{sales_order_number}}"
          outputParameters:
            - name: sold_to_party
              type: string
              mapping: "$.d.SoldToParty"
            - name: net_value
              type: string
              mapping: "$.d.TotalNetAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: status
              type: string
              mapping: "$.d.OverallSDDocumentRejectionSts"
  consumes:
    - type: http
      namespace: sap-sales
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_id}}')"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET

Retrieves a shipment from SAP TM, checks carrier status, and updates the Salesforce delivery record with tracking information.

naftiko: "0.5"
info:
  label: "SAP Transport Shipment Tracking"
  description: "Retrieves a shipment from SAP TM, checks carrier status, and updates the Salesforce delivery record with tracking information."
  tags:
    - logistics
    - sap
    - salesforce
    - transportation
capability:
  exposes:
    - type: mcp
      namespace: transport-ops
      port: 8080
      tools:
        - name: track-shipment
          description: "Given a shipment ID, pull SAP TM shipment details and update the Salesforce delivery record with current tracking status."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The SAP shipment document number."
          steps:
            - name: get-shipment
              type: call
              call: "sap-tm.get-shipment"
              with:
                shipment: "{{shipment_id}}"
            - name: update-sf-delivery
              type: call
              call: "salesforce-tm.update-delivery"
              with:
                shipment_id: "{{shipment_id}}"
                status: "{{get-shipment.status}}"
                eta: "{{get-shipment.estimated_arrival}}"
  consumes:
    - type: http
      namespace: sap-tm
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: shipments
          path: "/A_Shipment('{{shipment}}')"
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: salesforce-tm
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: deliveries
          path: "/sobjects/Delivery__c"
          operations:
            - name: update-delivery
              method: PATCH

Retrieves freight invoices from SAP, allocates costs to distribution routes in Snowflake, and posts a cost summary to the logistics Teams channel.

naftiko: "0.5"
info:
  label: "SAP Transportation Cost Allocation"
  description: "Retrieves freight invoices from SAP, allocates costs to distribution routes in Snowflake, and posts a cost summary to the logistics Teams channel."
  tags:
    - logistics
    - sap
    - snowflake
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: freight-ops
      port: 8080
      tools:
        - name: allocate-transportation-costs
          description: "Given a billing period, retrieve SAP freight invoices, allocate costs by route in Snowflake, and notify logistics via Teams."
          inputParameters:
            - name: billing_period
              in: body
              type: string
              description: "The billing period in YYYY-MM format."
          steps:
            - name: get-invoices
              type: call
              call: "sap-freight.get-freight-invoices"
              with:
                period: "{{billing_period}}"
            - name: allocate-costs
              type: call
              call: "snowflake-freight.run-allocation"
              with:
                period: "{{billing_period}}"
                invoice_data: "{{get-invoices.records}}"
            - name: notify-logistics
              type: call
              call: "msteams-freight.post-message"
              with:
                channel_id: "$secrets.teams_logistics_channel_id"
                message: "Freight Cost Allocation ({{billing_period}}): Total ${{get-invoices.total_cost}} | Routes: {{allocate-costs.route_count}} | Top Route: {{allocate-costs.top_route}} (${{allocate-costs.top_route_cost}})"
  consumes:
    - type: http
      namespace: sap-freight
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: get-freight-invoices
              method: GET
    - type: http
      namespace: snowflake-freight
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-allocation
              method: POST
    - type: http
      namespace: msteams-freight
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves vendor master data from SAP including company name, payment terms, and purchasing organization.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP including company name, payment terms, and purchasing organization."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: sap-vendor
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up a SAP vendor record by vendor number. Returns company name, payment terms, and purchasing org."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: "sap-vendor.get-vendor"
          with:
            vendor_id: "{{vendor_number}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: purchasing_org
              type: string
              mapping: "$.d.PurchasingOrganization"
  consumes:
    - type: http
      namespace: sap-vendor
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Queries SAP warehouse management for current utilization, forecasts capacity needs from Snowflake, and alerts the logistics planning team via Teams.

naftiko: "0.5"
info:
  label: "SAP Warehouse Capacity Planner"
  description: "Queries SAP warehouse management for current utilization, forecasts capacity needs from Snowflake, and alerts the logistics planning team via Teams."
  tags:
    - logistics
    - sap
    - snowflake
    - microsoft-teams
    - warehouse
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: plan-warehouse-capacity
          description: "Given a warehouse number, check SAP utilization, pull Snowflake capacity forecast, and alert logistics planning via Teams."
          inputParameters:
            - name: warehouse_number
              in: body
              type: string
              description: "The SAP warehouse number."
          steps:
            - name: get-utilization
              type: call
              call: "sap-wm.get-warehouse-util"
              with:
                warehouse: "{{warehouse_number}}"
            - name: get-forecast
              type: call
              call: "snowflake-wm.query-capacity-forecast"
              with:
                warehouse: "{{warehouse_number}}"
            - name: alert-planning
              type: call
              call: "msteams-wm.post-message"
              with:
                channel_id: "$secrets.teams_logistics_planning_channel_id"
                message: "Warehouse Capacity: {{warehouse_number}} | Current: {{get-utilization.utilization_percent}}% | 30d Forecast: {{get-forecast.forecast_utilization}}% | Available Pallets: {{get-utilization.available_positions}}"
  consumes:
    - type: http
      namespace: sap-wm
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_MGMT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: warehouses
          path: "/A_Warehouse('{{warehouse}}')"
          operations:
            - name: get-warehouse-util
              method: GET
    - type: http
      namespace: snowflake-wm
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-capacity-forecast
              method: POST
    - type: http
      namespace: msteams-wm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls seasonal demand forecasts from Snowflake, updates SAP demand planning, and notifies the supply chain planning team via Teams.

naftiko: "0.5"
info:
  label: "Seasonal Demand Forecast Sync"
  description: "Pulls seasonal demand forecasts from Snowflake, updates SAP demand planning, and notifies the supply chain planning team via Teams."
  tags:
    - supply-chain
    - snowflake
    - sap
    - microsoft-teams
    - demand-planning
capability:
  exposes:
    - type: mcp
      namespace: demand-ops
      port: 8080
      tools:
        - name: sync-seasonal-forecast
          description: "Given a product family and season, pull Snowflake forecasts, update SAP demand plan, and notify supply chain planning via Teams."
          inputParameters:
            - name: product_family
              in: body
              type: string
              description: "The product family code."
            - name: season
              in: body
              type: string
              description: "The forecast season (e.g. SUMMER-2025)."
          steps:
            - name: get-forecast
              type: call
              call: "snowflake-demand.query-forecast"
              with:
                family: "{{product_family}}"
                season: "{{season}}"
            - name: update-sap-plan
              type: call
              call: "sap-demand.update-demand-plan"
              with:
                family: "{{product_family}}"
                forecast_qty: "{{get-forecast.total_forecast_units}}"
            - name: notify-planning
              type: call
              call: "msteams-demand.post-message"
              with:
                channel_id: "$secrets.teams_supply_chain_channel_id"
                message: "Seasonal Forecast Sync: {{product_family}} ({{season}}) | Forecast: {{get-forecast.total_forecast_units}} units | YoY Change: {{get-forecast.yoy_change_percent}}%"
  consumes:
    - type: http
      namespace: snowflake-demand
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-forecast
              method: POST
    - type: http
      namespace: sap-demand
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: demand-plans
          path: "/A_MRPMaterial"
          operations:
            - name: update-demand-plan
              method: PATCH
    - type: http
      namespace: msteams-demand
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves a ServiceNow change request by number, returning approval status, risk level, and implementation window.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Lookup"
  description: "Retrieves a ServiceNow change request by number, returning approval status, risk level, and implementation window."
  tags:
    - itsm
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: servicenow-chg
      port: 8080
      tools:
        - name: get-change-request
          description: "Look up a ServiceNow change request by number. Returns approval status, risk, and scheduled dates."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number (e.g. CHG0009876)."
          call: "servicenow-chg.get-change"
          with:
            number: "{{change_number}}"
          outputParameters:
            - name: approval_status
              type: string
              mapping: "$.result.approval"
            - name: risk
              type: string
              mapping: "$.result.risk"
            - name: start_date
              type: string
              mapping: "$.result.start_date"
            - name: end_date
              type: string
              mapping: "$.result.end_date"
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-change
              method: GET

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

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and short description."
  tags:
    - itsm
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: servicenow-inc
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns state, priority, assignment group, and description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g. INC0012345)."
          call: "servicenow-inc.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"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow-inc
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Queries Snowflake for distributor sales performance metrics by region and period.

naftiko: "0.5"
info:
  label: "Snowflake Distributor Performance Query"
  description: "Queries Snowflake for distributor sales performance metrics by region and period."
  tags:
    - analytics
    - snowflake
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: snowflake-analytics
      port: 8080
      tools:
        - name: query-distributor-performance
          description: "Query distributor sales performance from Snowflake by region. Returns total revenue, order count, and average order value."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The distribution region code (e.g. US-NORTHEAST)."
          call: "snowflake-analytics.run-query"
          with:
            region: "{{region}}"
          outputParameters:
            - name: total_revenue
              type: number
              mapping: "$.data[0].TOTAL_REVENUE"
            - name: order_count
              type: number
              mapping: "$.data[0].ORDER_COUNT"
            - name: avg_order_value
              type: number
              mapping: "$.data[0].AVG_ORDER_VALUE"
  consumes:
    - type: http
      namespace: snowflake-analytics
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          inputParameters:
            - name: region
              in: query
          operations:
            - name: run-query
              method: POST

When a Snowflake ETL pipeline fails, creates a PagerDuty alert, logs the failure in ServiceNow, and notifies the data engineering Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake ETL Failure Remediation"
  description: "When a Snowflake ETL pipeline fails, creates a PagerDuty alert, logs the failure in ServiceNow, and notifies the data engineering Teams channel."
  tags:
    - data-engineering
    - snowflake
    - pagerduty
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: etl-ops
      port: 8080
      tools:
        - name: handle-etl-failure
          description: "Given a Snowflake task name and error message, create a PagerDuty alert, log in ServiceNow, and notify data engineering via Teams."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "The Snowflake task name that failed."
            - name: error_message
              in: body
              type: string
              description: "The error message from the failed task."
          steps:
            - name: create-pd-alert
              type: call
              call: "pagerduty-etl.create-incident"
              with:
                title: "ETL Failure: {{task_name}}"
                service_id: "$secrets.pd_data_eng_service_id"
                urgency: "high"
            - name: create-snow-incident
              type: call
              call: "servicenow-etl.create-incident"
              with:
                short_description: "Snowflake ETL failure: {{task_name}}"
                description: "Error: {{error_message}} | PagerDuty: {{create-pd-alert.incident_id}}"
            - name: notify-team
              type: call
              call: "msteams-etl.post-message"
              with:
                channel_id: "$secrets.teams_data_eng_channel_id"
                message: "ETL FAILURE: {{task_name}} | Error: {{error_message}} | INC: {{create-snow-incident.number}} | PD: {{create-pd-alert.incident_id}}"
  consumes:
    - type: http
      namespace: pagerduty-etl
      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: servicenow-etl
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-etl
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Queries Snowflake for failed or stalled retail sales data pipeline tasks and posts an alert to the data engineering Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Retail Sales Data Pipeline Health"
  description: "Queries Snowflake for failed or stalled retail sales data pipeline tasks and posts an alert to the data engineering Teams channel."
  tags:
    - data
    - analytics
    - snowflake
    - pipeline-monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: get-pipeline-task-failures
          description: "Query Snowflake task history for failed tasks in a given database and schema. Use to triage retail sales data pipeline issues."
          inputParameters:
            - name: database_name
              in: body
              type: string
              description: "The Snowflake database, e.g. AB_RETAIL_ANALYTICS."
            - name: schema_name
              in: body
              type: string
              description: "The Snowflake schema, e.g. SALES_ETL."
            - name: lookback_hours
              in: body
              type: integer
              description: "Number of hours to look back in task history."
          call: "snowflake.query-task-history"
          with:
            database: "{{database_name}}"
            schema: "{{schema_name}}"
            hours: "{{lookback_hours}}"
          outputParameters:
            - name: failed_tasks
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/{{schema}}/tasks/history"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
            - name: hours
              in: query
          operations:
            - name: query-task-history
              method: GET

When Splunk detects an anomalous login pattern, creates a ServiceNow security incident and disables the Okta account pending review.

naftiko: "0.5"
info:
  label: "Splunk Security Log Anomaly Response"
  description: "When Splunk detects an anomalous login pattern, creates a ServiceNow security incident and disables the Okta account pending review."
  tags:
    - security
    - splunk
    - servicenow
    - okta
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: respond-to-login-anomaly
          description: "Given a Splunk alert ID, retrieve anomaly details, create a ServiceNow security incident, and suspend the Okta user account."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Splunk alert ID."
            - name: user_login
              in: body
              type: string
              description: "The user login associated with the anomaly."
          steps:
            - name: get-alert
              type: call
              call: "splunk.get-alert-details"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow-sec.create-incident"
              with:
                short_description: "Login anomaly detected for {{user_login}}"
                description: "Alert: {{alert_id}} | Risk Score: {{get-alert.risk_score}} | Source IPs: {{get-alert.source_ips}}"
                urgency: "1"
            - name: suspend-user
              type: call
              call: "okta-sec.suspend-user"
              with:
                login: "{{user_login}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://anheuser-busch-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: alerts
          path: "/alerts/fired_alerts/{{alert_id}}"
          operations:
            - name: get-alert-details
              method: GET
    - type: http
      namespace: servicenow-sec
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: okta-sec
      baseUri: "https://anheuser-busch.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/suspend"
          operations:
            - name: suspend-user
              method: POST

When a supply chain risk is identified for a critical ingredient or packaging material, creates a ServiceNow task, updates the Salesforce supply record, and alerts the procurement team in Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Disruption Alert"
  description: "When a supply chain risk is identified for a critical ingredient or packaging material, creates a ServiceNow task, updates the Salesforce supply record, and alerts the procurement team in Teams."
  tags:
    - supply-chain
    - procurement
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: handle-supply-disruption
          description: "Given a material ID, supplier name, and disruption type, create a ServiceNow procurement task, update the Salesforce supply record, and alert the procurement Teams channel."
          inputParameters:
            - name: material_id
              in: body
              type: string
              description: "The SAP material ID for the at-risk ingredient or packaging."
            - name: supplier_name
              in: body
              type: string
              description: "The supplier experiencing the disruption."
            - name: disruption_type
              in: body
              type: string
              description: "Type of disruption: shortage, delay, quality_issue, or force_majeure."
            - name: severity
              in: body
              type: string
              description: "Disruption severity: critical, high, medium, or low."
          steps:
            - name: create-procurement-task
              type: call
              call: "servicenow-sc.create-task"
              with:
                short_description: "Supply disruption: {{material_id}} from {{supplier_name}}"
                description: "Disruption type: {{disruption_type}}. Severity: {{severity}}."
                assignment_group: "Procurement"
            - name: update-supply-record
              type: call
              call: "salesforce-sc.update-record"
              with:
                object_type: "Supply_Record__c"
                material_id: "{{material_id}}"
                status: "Disrupted"
            - name: alert-procurement
              type: call
              call: "msteams-sc.post-channel-message"
              with:
                channel_id: "procurement-alerts"
                message: "Supply Disruption: {{material_id}} from {{supplier_name}} | Type: {{disruption_type}} | Severity: {{severity}} | Task: {{create-procurement-task.number}}"
  consumes:
    - type: http
      namespace: servicenow-sc
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: salesforce-sc
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: supply-records
          path: "/sobjects/Supply_Record__c"
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: msteams-sc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls brewery water usage data from Snowflake, compares against SAP targets, and posts a sustainability digest to the ESG Teams channel.

naftiko: "0.5"
info:
  label: "Sustainability Water Usage Report"
  description: "Pulls brewery water usage data from Snowflake, compares against SAP targets, and posts a sustainability digest to the ESG Teams channel."
  tags:
    - sustainability
    - snowflake
    - sap
    - microsoft-teams
    - esg
capability:
  exposes:
    - type: mcp
      namespace: sustainability-ops
      port: 8080
      tools:
        - name: generate-water-report
          description: "Given a plant code and reporting period, pull water usage from Snowflake, compare against SAP targets, and post to ESG Teams channel."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The brewery plant code."
            - name: period
              in: body
              type: string
              description: "Reporting period in YYYY-MM format."
          steps:
            - name: get-usage
              type: call
              call: "snowflake-esg.query-water-usage"
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: get-target
              type: call
              call: "sap-esg.get-sustainability-target"
              with:
                plant: "{{plant_code}}"
                kpi: "WATER_USAGE"
            - name: post-report
              type: call
              call: "msteams-esg.post-message"
              with:
                channel_id: "$secrets.teams_esg_channel_id"
                message: "Water Usage Report — {{plant_code}} ({{period}}): Usage {{get-usage.total_liters}}L | Target {{get-target.target_liters}}L | Variance {{get-usage.variance_percent}}%"
  consumes:
    - type: http
      namespace: snowflake-esg
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-water-usage
              method: POST
    - type: http
      namespace: sap-esg
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: targets
          path: "/A_SustainabilityTarget"
          operations:
            - name: get-sustainability-target
              method: GET
    - type: http
      namespace: msteams-esg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls daily point-of-sale totals from the POS system, reconciles against SAP sales postings, and reports discrepancies to the finance Teams channel.

naftiko: "0.5"
info:
  label: "Taproom POS Daily Reconciliation"
  description: "Pulls daily point-of-sale totals from the POS system, reconciles against SAP sales postings, and reports discrepancies to the finance Teams channel."
  tags:
    - finance
    - pos
    - sap
    - microsoft-teams
    - retail
capability:
  exposes:
    - type: mcp
      namespace: pos-ops
      port: 8080
      tools:
        - name: reconcile-taproom-pos
          description: "Given a taproom location code and date, reconcile POS totals against SAP postings and report discrepancies via Teams."
          inputParameters:
            - name: location_code
              in: body
              type: string
              description: "The taproom location code."
            - name: business_date
              in: body
              type: string
              description: "The business date in YYYY-MM-DD format."
          steps:
            - name: get-pos-totals
              type: call
              call: "snowflake-pos.query-daily-totals"
              with:
                location: "{{location_code}}"
                date: "{{business_date}}"
            - name: get-sap-postings
              type: call
              call: "sap-pos.get-daily-sales"
              with:
                plant: "{{location_code}}"
                date: "{{business_date}}"
            - name: report-discrepancy
              type: call
              call: "msteams-pos.post-message"
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                message: "Taproom Recon — {{location_code}} ({{business_date}}): POS Total {{get-pos-totals.total}} | SAP Total {{get-sap-postings.total}} | Variance: {{get-pos-totals.variance}}"
  consumes:
    - type: http
      namespace: snowflake-pos
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-daily-totals
              method: POST
    - type: http
      namespace: sap-pos
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: billing
          path: "/A_BillingDocument"
          operations:
            - name: get-daily-sales
              method: GET
    - type: http
      namespace: msteams-pos
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Creates a new Terraform Cloud workspace for brewery or logistics infrastructure and notifies the infrastructure team in Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Brewery Infrastructure Provisioning"
  description: "Creates a new Terraform Cloud workspace for brewery or logistics infrastructure and notifies the infrastructure team in Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-terraform-workspace
          description: "Given a project name and environment, create a Terraform Cloud workspace for Anheuser-Busch infrastructure and notify the infrastructure Teams channel."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The project name, e.g. brewery-monitoring or logistics-tracker."
            - name: environment
              in: body
              type: string
              description: "The deployment environment: dev, staging, or prod."
          steps:
            - name: create-workspace
              type: call
              call: "terraform.create-workspace"
              with:
                org: "anheuser-busch"
                name: "{{project_name}}-{{environment}}"
            - name: notify-infra
              type: call
              call: "msteams-tf.post-channel-message"
              with:
                channel_id: "infrastructure-team"
                message: "Terraform workspace created: {{project_name}}-{{environment}}. ID: {{create-workspace.workspace_id}}."
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/{{org}}/workspaces"
          inputParameters:
            - name: org
              in: path
          operations:
            - name: create-workspace
              method: POST
    - type: http
      namespace: msteams-tf
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Runs a Terraform plan via Terraform Cloud, detects configuration drift, creates a Jira ticket, and alerts the infrastructure team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Drift Detector"
  description: "Runs a Terraform plan via Terraform Cloud, detects configuration drift, creates a Jira ticket, and alerts the infrastructure team via Teams."
  tags:
    - devops
    - terraform
    - jira
    - microsoft-teams
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infra-drift
      port: 8080
      tools:
        - name: detect-infrastructure-drift
          description: "Given a Terraform workspace ID, run a plan to detect drift, create a Jira ticket if drift is found, and notify the infra team via Teams."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID."
          steps:
            - name: run-plan
              type: call
              call: "terraform-drift.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                plan_only: "true"
            - name: create-ticket
              type: call
              call: "jira-drift.create-issue"
              with:
                project: "INFRA"
                summary: "Infrastructure drift detected: workspace {{workspace_id}}"
                description: "Run ID: {{run-plan.id}} | Resources changed: {{run-plan.resource_changes}} | Status: {{run-plan.status}}"
            - name: notify-infra
              type: call
              call: "msteams-drift.post-message"
              with:
                channel_id: "$secrets.teams_infra_channel_id"
                message: "Drift Detected: Workspace {{workspace_id}} | Changes: {{run-plan.resource_changes}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: terraform-drift
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: jira-drift
      baseUri: "https://anheuser-busch.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-drift
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls trade promotion data from Salesforce, actual sales lift from Snowflake, and posts an effectiveness report to the revenue management Teams channel.

naftiko: "0.5"
info:
  label: "Trade Promotion Effectiveness Report"
  description: "Pulls trade promotion data from Salesforce, actual sales lift from Snowflake, and posts an effectiveness report to the revenue management Teams channel."
  tags:
    - sales
    - salesforce
    - snowflake
    - microsoft-teams
    - trade-promotion
capability:
  exposes:
    - type: mcp
      namespace: trade-promo
      port: 8080
      tools:
        - name: report-promotion-effectiveness
          description: "Given a promotion ID, pull Salesforce promo details, Snowflake sales lift data, and post effectiveness report to Teams."
          inputParameters:
            - name: promotion_id
              in: body
              type: string
              description: "The Salesforce trade promotion record ID."
          steps:
            - name: get-promo
              type: call
              call: "salesforce-promo.get-promotion"
              with:
                promo_id: "{{promotion_id}}"
            - name: get-lift
              type: call
              call: "snowflake-promo.query-sales-lift"
              with:
                promo_id: "{{promotion_id}}"
                start_date: "{{get-promo.Start_Date__c}}"
                end_date: "{{get-promo.End_Date__c}}"
            - name: post-report
              type: call
              call: "msteams-promo.post-message"
              with:
                channel_id: "$secrets.teams_revenue_channel_id"
                message: "Trade Promo Report: {{get-promo.Name}} | Spend: ${{get-promo.Budget__c}} | Lift: {{get-lift.volume_lift_percent}}% | ROI: {{get-lift.roi_percent}}%"
  consumes:
    - type: http
      namespace: salesforce-promo
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: promotions
          path: "/sobjects/Trade_Promotion__c/{{promo_id}}"
          operations:
            - name: get-promotion
              method: GET
    - type: http
      namespace: snowflake-promo
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-sales-lift
              method: POST
    - type: http
      namespace: msteams-promo
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Checks the delivery status of an outbound SMS message sent via Twilio.

naftiko: "0.5"
info:
  label: "Twilio SMS Delivery Status"
  description: "Checks the delivery status of an outbound SMS message sent via Twilio."
  tags:
    - communications
    - twilio
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: twilio
      port: 8080
      tools:
        - name: get-message-status
          description: "Look up a Twilio SMS message by SID. Returns delivery status, direction, and date sent."
          inputParameters:
            - name: message_sid
              in: body
              type: string
              description: "The Twilio message SID."
          call: "twilio.get-message"
          with:
            sid: "{{message_sid}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: direction
              type: string
              mapping: "$.direction"
            - name: date_sent
              type: string
              mapping: "$.date_sent"
  consumes:
    - type: http
      namespace: twilio
      baseUri: "https://api.twilio.com/2010-04-01"
      authentication:
        type: basic
        username: "$secrets.twilio_account_sid"
        password: "$secrets.twilio_auth_token"
      resources:
        - name: messages
          path: "/Accounts/$secrets.twilio_account_sid/Messages/{{sid}}.json"
          inputParameters:
            - name: sid
              in: path
          operations:
            - name: get-message
              method: GET

Checks SAP for overdue vendor payments, updates the Salesforce vendor record, and sends a payment reminder via Teams to accounts payable.

naftiko: "0.5"
info:
  label: "Vendor Payment Status Notifier"
  description: "Checks SAP for overdue vendor payments, updates the Salesforce vendor record, and sends a payment reminder via Teams to accounts payable."
  tags:
    - finance
    - sap
    - salesforce
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: notify-overdue-payments
          description: "Given a vendor number, check SAP for overdue invoices, update Salesforce vendor record status, and alert AP via Teams."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          steps:
            - name: get-overdue
              type: call
              call: "sap-ap.get-overdue-invoices"
              with:
                vendor: "{{vendor_number}}"
            - name: update-sf
              type: call
              call: "salesforce-ap.update-vendor"
              with:
                vendor_id: "{{vendor_number}}"
                payment_status: "Overdue"
                overdue_amount: "{{get-overdue.total_overdue}}"
            - name: alert-ap
              type: call
              call: "msteams-ap.post-message"
              with:
                channel_id: "$secrets.teams_ap_channel_id"
                message: "Overdue Vendor Payments: {{vendor_number}} | Count: {{get-overdue.invoice_count}} | Total: {{get-overdue.total_overdue}} {{get-overdue.currency}}"
  consumes:
    - type: http
      namespace: sap-ap
      baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: get-overdue-invoices
              method: GET
    - type: http
      namespace: salesforce-ap
      baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: vendors
          path: "/sobjects/Vendor__c/{{vendor_id}}"
          operations:
            - name: update-vendor
              method: PATCH
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

When an IoT temperature sensor detects an excursion in a cold-chain warehouse, creates a ServiceNow incident and notifies logistics via Teams.

naftiko: "0.5"
info:
  label: "Warehouse Temperature Excursion Alert"
  description: "When an IoT temperature sensor detects an excursion in a cold-chain warehouse, creates a ServiceNow incident and notifies logistics via Teams."
  tags:
    - logistics
    - iot
    - servicenow
    - microsoft-teams
    - cold-chain
capability:
  exposes:
    - type: mcp
      namespace: cold-chain-ops
      port: 8080
      tools:
        - name: handle-temperature-excursion
          description: "Given a warehouse ID and current temperature, create a ServiceNow incident for cold-chain violation and alert logistics via Teams."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "The warehouse facility identifier."
            - name: current_temp
              in: body
              type: string
              description: "The current recorded temperature in Fahrenheit."
            - name: threshold
              in: body
              type: string
              description: "The maximum allowed temperature."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-cc.create-incident"
              with:
                short_description: "Cold-chain excursion: warehouse {{warehouse_id}} at {{current_temp}}F (max {{threshold}}F)"
                urgency: "1"
                impact: "1"
            - name: alert-logistics
              type: call
              call: "msteams-cc.post-message"
              with:
                channel_id: "$secrets.teams_logistics_channel_id"
                message: "COLD CHAIN ALERT: Warehouse {{warehouse_id}} temp {{current_temp}}F exceeds {{threshold}}F threshold | INC: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow-cc
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-cc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Pulls compensation data from Workday, runs a benchmark analysis in Snowflake, and creates a Jira task for HR leadership with recommendations.

naftiko: "0.5"
info:
  label: "Workday Compensation Benchmark Analysis"
  description: "Pulls compensation data from Workday, runs a benchmark analysis in Snowflake, and creates a Jira task for HR leadership with recommendations."
  tags:
    - hr
    - workday
    - snowflake
    - jira
    - compensation
capability:
  exposes:
    - type: mcp
      namespace: comp-ops
      port: 8080
      tools:
        - name: run-compensation-benchmark
          description: "Given a job family and region, pull Workday comp data, benchmark in Snowflake, and create a Jira task with recommendations."
          inputParameters:
            - name: job_family
              in: body
              type: string
              description: "The job family code."
            - name: region
              in: body
              type: string
              description: "The geographic region."
          steps:
            - name: get-comp-data
              type: call
              call: "workday-comp.get-compensation"
              with:
                job_family: "{{job_family}}"
                region: "{{region}}"
            - name: run-benchmark
              type: call
              call: "snowflake-comp.query-benchmarks"
              with:
                job_family: "{{job_family}}"
                region: "{{region}}"
                median_salary: "{{get-comp-data.median_salary}}"
            - name: create-task
              type: call
              call: "jira-comp.create-issue"
              with:
                project: "HR"
                summary: "Compensation benchmark: {{job_family}} in {{region}}"
                description: "Median: ${{get-comp-data.median_salary}} | Market 50th: ${{run-benchmark.market_50th}} | Gap: {{run-benchmark.gap_percent}}% | Headcount: {{get-comp-data.employee_count}}"
  consumes:
    - type: http
      namespace: workday-comp
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers"
          operations:
            - name: get-compensation
              method: GET
    - type: http
      namespace: snowflake-comp
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-benchmarks
              method: POST
    - type: http
      namespace: jira-comp
      baseUri: "https://anheuser-busch.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

Extracts diversity and inclusion metrics from Workday, loads into Snowflake for trend analysis, and posts quarterly highlights to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Report"
  description: "Extracts diversity and inclusion metrics from Workday, loads into Snowflake for trend analysis, and posts quarterly highlights to the HR leadership Teams channel."
  tags:
    - hr
    - workday
    - snowflake
    - microsoft-teams
    - diversity
capability:
  exposes:
    - type: mcp
      namespace: diversity-ops
      port: 8080
      tools:
        - name: generate-diversity-report
          description: "Given a fiscal quarter, extract Workday diversity metrics, load into Snowflake, and post highlights to HR leadership via Teams."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "The fiscal quarter in YYYY-QN format."
          steps:
            - name: get-metrics
              type: call
              call: "workday-diversity.get-dei-metrics"
              with:
                quarter: "{{fiscal_quarter}}"
            - name: load-snowflake
              type: call
              call: "snowflake-diversity.insert-metrics"
              with:
                table: "HR.DIVERSITY_METRICS"
                quarter: "{{fiscal_quarter}}"
                data: "{{get-metrics.records}}"
            - name: post-highlights
              type: call
              call: "msteams-diversity.post-message"
              with:
                channel_id: "$secrets.teams_hr_leadership_channel_id"
                message: "D&I Report ({{fiscal_quarter}}): Representation {{get-metrics.underrepresented_percent}}% | Hiring {{get-metrics.diverse_hire_percent}}% | Promotion {{get-metrics.diverse_promotion_percent}}% | Retention {{get-metrics.retention_rate}}%"
  consumes:
    - type: http
      namespace: workday-diversity
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: dei
          path: "/workers"
          operations:
            - name: get-dei-metrics
              method: GET
    - type: http
      namespace: snowflake-diversity
      baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-metrics
              method: POST
    - type: http
      namespace: msteams-diversity
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves an employee profile from Workday by employee ID, returning name, title, department, and hire date.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by employee ID, returning name, title, department, and hire date."
  tags:
    - hr
    - workday
    - employee-management
capability:
  exposes:
    - type: mcp
      namespace: workday-hr
      port: 8080
      tools:
        - name: get-employee
          description: "Look up a Workday employee by ID. Returns full name, job title, department, and hire date."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday-hr.get-worker"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Name"
            - name: title
              type: string
              mapping: "$.Worker.JobTitle"
            - name: department
              type: string
              mapping: "$.Worker.Department"
            - name: hire_date
              type: string
              mapping: "$.Worker.HireDate"
  consumes:
    - type: http
      namespace: workday-hr
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Checks the status of a job requisition in Workday including approval state and number of applicants.

naftiko: "0.5"
info:
  label: "Workday Position Requisition Status"
  description: "Checks the status of a job requisition in Workday including approval state and number of applicants."
  tags:
    - hr
    - workday
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: workday-recruiting
      port: 8080
      tools:
        - name: get-requisition
          description: "Look up a Workday job requisition by ID. Returns status, hiring manager, and applicant count."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          call: "workday-recruiting.get-requisition"
          with:
            req_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.JobRequisition.Status"
            - name: hiring_manager
              type: string
              mapping: "$.JobRequisition.HiringManager"
            - name: applicant_count
              type: number
              mapping: "$.JobRequisition.ApplicantCount"
  consumes:
    - type: http
      namespace: workday-recruiting
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/jobRequisitions/{{req_id}}"
          inputParameters:
            - name: req_id
              in: path
          operations:
            - name: get-requisition
              method: GET

When an employee changes roles in Workday, notifies the new manager in Teams and creates a ServiceNow task to update system access.

naftiko: "0.5"
info:
  label: "Workday Role Change Provisioning"
  description: "When an employee changes roles in Workday, notifies the new manager in Teams and creates a ServiceNow task to update system access."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID and new role, create a ServiceNow access update task and notify the new manager via Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the employee changing roles."
            - name: new_role
              in: body
              type: string
              description: "The new job role or title."
            - name: new_manager_upn
              in: body
              type: string
              description: "The UPN of the new manager."
          steps:
            - name: get-worker
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-access-task
              type: call
              call: "servicenow-role.create-task"
              with:
                short_description: "Access update for role change: {{get-worker.full_name}} to {{new_role}}"
                assignment_group: "IT_Security"
            - name: notify-manager
              type: call
              call: "msteams-role.send-message"
              with:
                recipient_upn: "{{new_manager_upn}}"
                message: "{{get-worker.full_name}} has joined your team in role: {{new_role}}. IT access update task: {{create-access-task.number}}."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/anheuser-busch/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow-role
      baseUri: "https://anheuser-busch.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST