PepsiCo Capabilities

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

Sort
Expand

Monitors accounts receivable aging by pulling AR data from SAP, matching with Salesforce accounts, and alerting the collections team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Accounts Receivable Aging Alert"
  description: "Monitors accounts receivable aging by pulling AR data from SAP, matching with Salesforce accounts, and alerting the collections team via Microsoft Teams."
  tags:
    - finance
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ar-management
      port: 8080
      tools:
        - name: check-ar-aging
          description: "Check AR aging: pull SAP receivables, match Salesforce accounts, alert collections."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: aging_bucket
              in: body
              type: string
              description: "The aging bucket: 30, 60, 90, 120."
          steps:
            - name: get-ar-aging
              type: call
              call: sap.get-ar-aging-report
              with:
                company_code: "{{company_code}}"
                aging_days: "{{aging_bucket}}"
            - name: get-customer-accounts
              type: call
              call: salesforce.get-customer-list
              with:
                overdue_threshold: "{{aging_bucket}}"
            - name: alert-collections
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance-collections"
                text: "AR Aging Alert ({{aging_bucket}}+ days): Total overdue: ${{get-ar-aging.total_overdue}}. Customers: {{get-ar-aging.customer_count}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_AR_AGING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: aging
          path: "/ARAgingReport(CompanyCode='{{company_code}}',AgingDays={{aging_days}})"
          inputParameters:
            - name: company_code
              in: path
            - name: aging_days
              in: path
          operations:
            - name: get-ar-aging-report
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: customers
          path: "/query?q=SELECT+Id,Name+FROM+Account+WHERE+Days_Overdue__c>=+{{overdue_threshold}}"
          inputParameters:
            - name: overdue_threshold
              in: query
          operations:
            - name: get-customer-list
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Given a vendor contract document, uses Anthropic Claude to extract key terms, payment conditions, and renewal clauses, then posts the summary to the legal team's Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Contract Intelligence"
  description: "Given a vendor contract document, uses Anthropic Claude to extract key terms, payment conditions, and renewal clauses, then posts the summary to the legal team's Teams channel."
  tags:
    - ai
    - legal
    - anthropic
    - microsoft-teams
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: legal-ai
      port: 8080
      tools:
        - name: extract-contract-terms
          description: "Given contract text content, invoke Anthropic Claude to identify and extract payment terms, renewal clauses, liability caps, and key obligations, then post the extraction to the legal Teams channel."
          inputParameters:
            - name: contract_text
              in: body
              type: string
              description: "The full text content of the vendor contract to analyze."
            - name: vendor_name
              in: body
              type: string
              description: "The name of the vendor associated with the contract."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the legal team digest."
          steps:
            - name: extract-terms
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Extract the following from this vendor contract for {{vendor_name}}: 1) Payment terms, 2) Contract duration and renewal clauses, 3) Liability caps, 4) Key obligations for each party. Contract text: {{contract_text}}"
            - name: post-extraction
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Contract Intelligence — {{vendor_name}}:\n{{extract-terms.content}}"
  consumes:
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP demand forecast for a product category and uses Anthropic Claude to generate a plain-language executive summary for the supply chain leadership team.

naftiko: "0.5"
info:
  label: "AI-Assisted Demand Forecast Summary"
  description: "Retrieves a SAP demand forecast for a product category and uses Anthropic Claude to generate a plain-language executive summary for the supply chain leadership team."
  tags:
    - ai
    - supply-chain
    - sap
    - anthropic
    - microsoft-teams
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: forecast-ai
      port: 8080
      tools:
        - name: summarize-demand-forecast
          description: "Given a SAP material number and planning horizon, retrieve the demand forecast from SAP, generate a plain-language executive summary using Anthropic Claude, and post it to the supply chain Teams channel."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number to retrieve demand forecast for."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code for the forecast."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the supply chain forecast summary."
          steps:
            - name: get-forecast
              type: call
              call: sap.get-demand-forecast
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: generate-summary
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Summarize the following demand forecast data for material {{material_number}} at plant {{plant_code}} in 3 bullet points for a supply chain executive: {{get-forecast.forecast_data}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Demand Forecast Summary — {{material_number}} (Plant {{plant_code}}):\n{{generate-summary.content}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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-forecasts
          path: "/A_MrpMaterial(Material='{{material}}',MRPArea='{{plant}}')"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-demand-forecast
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Azure Cost Management detects a spend anomaly, creates a ServiceNow financial incident and posts a FinOps alert to the Microsoft Teams cost management channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Responder"
  description: "When Azure Cost Management detects a spend anomaly, creates a ServiceNow financial incident and posts a FinOps alert to the Microsoft Teams cost management channel."
  tags:
    - finops
    - cloud
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-azure-cost-anomaly
          description: "Given an Azure subscription ID, resource group, and estimated overage in USD, create a ServiceNow financial incident and post a FinOps alert to Teams."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the cost anomaly was detected."
            - name: resource_group
              in: body
              type: string
              description: "The Azure resource group driving the anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "The estimated spend overage in US dollars."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure Cost Anomaly — {{resource_group}} — ${{estimated_overage_usd}} overage"
                category: "cloud_cost"
                urgency: "2"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "finops-alerts"
                text: "Azure Cost Anomaly: {{resource_group}} (sub: {{subscription_id}}) | Overage: ${{estimated_overage_usd}} | SNOW: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates Azure cloud cost optimization reports by pulling cost data, identifying anomalies in Datadog, and posting recommendations to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Optimization Report"
  description: "Generates Azure cloud cost optimization reports by pulling cost data, identifying anomalies in Datadog, and posting recommendations to Microsoft Teams."
  tags:
    - it-operations
    - finance
    - azure-devops
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: generate-cost-report
          description: "Generate Azure cost report: pull cost data, check Datadog anomalies, post recommendations."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID."
            - name: period
              in: body
              type: string
              description: "The billing period."
          steps:
            - name: get-azure-costs
              type: call
              call: azure.get-cost-summary
              with:
                subscription_id: "{{subscription_id}}"
                period: "{{period}}"
            - name: check-anomalies
              type: call
              call: datadog.get-cost-anomalies
              with:
                subscription: "{{subscription_id}}"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "cloud-finops"
                text: "Azure Cost Report ({{period}}): Total: ${{get-azure-costs.total_cost}}. vs. Budget: ${{get-azure-costs.budget}}. Anomalies: {{check-anomalies.anomaly_count}}."
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: costs
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query?api-version=2023-11-01"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-cost-summary
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
      resources:
        - name: anomalies
          path: "/cost/anomalies?subscription={{subscription}}"
          inputParameters:
            - name: subscription
              in: query
          operations:
            - name: get-cost-anomalies
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the latest build status for an Azure DevOps pipeline, returning build result, duration, and source branch.

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

Processes fountain equipment service requests by looking up the Salesforce customer, creating a ServiceNow ticket, and notifying the technician via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Beverage Fountain Equipment Service"
  description: "Processes fountain equipment service requests by looking up the Salesforce customer, creating a ServiceNow ticket, and notifying the technician via Microsoft Teams."
  tags:
    - distribution
    - customer-service
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-service
      port: 8080
      tools:
        - name: create-fountain-service
          description: "Process fountain service: look up Salesforce customer, create ServiceNow ticket, notify tech."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: equipment_serial
              in: body
              type: string
              description: "The fountain serial number."
            - name: issue_description
              in: body
              type: string
              description: "The service issue."
          steps:
            - name: get-customer
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Fountain service: {{equipment_serial}} at {{get-customer.name}}"
                description: "{{issue_description}}"
                category: "fountain_equipment"
                assignment_group: "Fountain_Service"
            - name: notify-tech
              type: call
              call: msteams.send-message
              with:
                channel_id: "fountain-service"
                text: "Fountain service: {{get-customer.name}}. Equipment: {{equipment_serial}}. Issue: {{issue_description}}. Ticket: {{create-ticket.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.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
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages packaging changes by updating SAP material master, creating a ServiceNow change request, and notifying brand and manufacturing teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Brand Packaging Change Management"
  description: "Manages packaging changes by updating SAP material master, creating a ServiceNow change request, and notifying brand and manufacturing teams via Microsoft Teams."
  tags:
    - brand-management
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: packaging-change
      port: 8080
      tools:
        - name: manage-packaging-change
          description: "Manage packaging change: update SAP, create ServiceNow CR, notify teams."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: change_description
              in: body
              type: string
              description: "Description of the packaging change."
            - name: effective_date
              in: body
              type: string
              description: "Effective date."
          steps:
            - name: get-current-material
              type: call
              call: sap.get-material-master
              with:
                material_number: "{{material_number}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "Packaging change: {{material_number}}"
                description: "{{change_description}}. Effective: {{effective_date}}."
                category: "packaging_change"
            - name: notify-stakeholders
              type: call
              call: msteams.send-message
              with:
                channel_id: "brand-packaging"
                text: "Packaging Change: {{material_number}} ({{get-current-material.description}}). Change: {{change_description}}. CR: {{create-change-request.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-master
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors co-packer production by pulling SAP reports, validating against Salesforce contracted volumes, and posting variance to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Co-Packer Production Monitoring"
  description: "Monitors co-packer production by pulling SAP reports, validating against Salesforce contracted volumes, and posting variance to Microsoft Teams."
  tags:
    - manufacturing
    - supply-chain
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: co-packer
      port: 8080
      tools:
        - name: monitor-copacker-production
          description: "Monitor co-packer: pull SAP reports, validate Salesforce contracts, post variance."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP co-packer vendor ID."
            - name: sf_contract_id
              in: body
              type: string
              description: "The Salesforce contract ID."
            - name: period
              in: body
              type: string
              description: "The production period."
          steps:
            - name: get-production-report
              type: call
              call: sap.get-copacker-production
              with:
                vendor_id: "{{vendor_id}}"
                period: "{{period}}"
            - name: get-contracted-volumes
              type: call
              call: salesforce.get-contract
              with:
                contract_id: "{{sf_contract_id}}"
            - name: post-variance
              type: call
              call: msteams.send-message
              with:
                channel_id: "co-packer-ops"
                text: "Co-Packer Report ({{period}}): Produced: {{get-production-report.actual_volume}}. Contracted: {{get-contracted-volumes.contracted_volume}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: copacker
          path: "/CopackerProduction(VendorId='{{vendor_id}}',Period='{{period}}')"
          inputParameters:
            - name: vendor_id
              in: path
            - name: period
              in: path
          operations:
            - name: get-copacker-production
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/sobjects/Contract/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a cold chain breach is detected, retrieves shipment details from SAP, creates a quality incident in ServiceNow, and alerts the distribution team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cold Chain Temperature Breach Response"
  description: "When a cold chain breach is detected, retrieves shipment details from SAP, creates a quality incident in ServiceNow, and alerts the distribution team via Microsoft Teams."
  tags:
    - supply-chain
    - distribution
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cold-chain
      port: 8080
      tools:
        - name: handle-temperature-breach
          description: "Orchestrate cold chain breach: pull SAP shipment, create quality incident, alert distribution."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The SAP shipment document number."
            - name: temperature_reading
              in: body
              type: string
              description: "The recorded temperature in Celsius."
          steps:
            - name: get-shipment
              type: call
              call: sap.get-shipment
              with:
                shipment_id: "{{shipment_id}}"
            - name: create-quality-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Cold chain breach: Shipment {{shipment_id}} at {{temperature_reading}}C"
                category: "quality_cold_chain"
                urgency: "1"
                assignment_group: "Quality_Distribution"
            - name: alert-distribution
              type: call
              call: msteams.send-message
              with:
                channel_id: "distribution-alerts"
                text: "COLD CHAIN ALERT: Shipment {{shipment_id}} at {{temperature_reading}}C. Destination: {{get-shipment.destination}}. Case: {{create-quality-incident.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_id}}')"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors contract renewal dates by checking SAP vendor contracts, creating renewal tasks in ServiceNow, and sending reminders via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Contract Renewal Reminder Workflow"
  description: "Monitors contract renewal dates by checking SAP vendor contracts, creating renewal tasks in ServiceNow, and sending reminders via Microsoft Outlook."
  tags:
    - procurement
    - sap
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: contract-management
      port: 8080
      tools:
        - name: trigger-renewal-reminder
          description: "Orchestrate contract renewal: check SAP contract, create ServiceNow task, send Outlook reminder."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "The SAP contract number."
          steps:
            - name: get-contract
              type: call
              call: sap.get-contract
              with:
                contract_number: "{{contract_number}}"
            - name: create-renewal-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Contract renewal: {{contract_number}} - {{get-contract.vendor_name}}"
                due_date: "{{get-contract.expiry_date}}"
                assignment_group: "Procurement_Management"
            - name: send-reminder-email
              type: call
              call: outlook.send-email
              with:
                to: "{{get-contract.procurement_manager_email}}"
                subject: "Contract Renewal: {{get-contract.vendor_name}}"
                body: "Contract {{contract_number}} expires on {{get-contract.expiry_date}}. Value: ${{get-contract.total_value}}. Task: {{create-renewal-task.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PURCHASECONTRACT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: contracts
          path: "/A_PurchaseContract('{{contract_number}}')"
          inputParameters:
            - name: contract_number
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Validates cross-border trade compliance by checking SAP export documentation, verifying customs classification, and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Cross-Border Trade Compliance Check"
  description: "Validates cross-border trade compliance by checking SAP export documentation, verifying customs classification, and logging in ServiceNow."
  tags:
    - distribution
    - supply-chain
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: trade-compliance
      port: 8080
      tools:
        - name: check-trade-compliance
          description: "Validate cross-border compliance: check SAP export docs, verify customs, log in ServiceNow."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
            - name: destination_country
              in: body
              type: string
              description: "The destination country code."
          steps:
            - name: get-export-docs
              type: call
              call: sap.get-export-documentation
              with:
                delivery_number: "{{delivery_number}}"
            - name: verify-customs
              type: call
              call: sap.get-customs-classification
              with:
                material: "{{get-export-docs.material_number}}"
                country: "{{destination_country}}"
            - name: log-compliance
              type: call
              call: servicenow.create-task
              with:
                short_description: "Trade compliance: {{delivery_number}} to {{destination_country}}"
                description: "Export status: {{get-export-docs.status}}. HS code: {{verify-customs.hs_code}}."
                category: "trade_compliance"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: export-docs
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')/to_ExportDocuments"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-export-documentation
              method: GET
        - name: customs
          path: "/CustomsClassification(Material='{{material}}',Country='{{country}}')"
          inputParameters:
            - name: material
              in: path
            - name: country
              in: path
          operations:
            - name: get-customs-classification
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Converts a customer complaint into a quality case by creating a SAP quality notification, linking to Salesforce, and notifying the quality team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Complaint to Quality Case"
  description: "Converts a customer complaint into a quality case by creating a SAP quality notification, linking to Salesforce, and notifying the quality team via Microsoft Teams."
  tags:
    - customer-service
    - quality
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-feedback
      port: 8080
      tools:
        - name: convert-complaint-to-quality-case
          description: "Convert complaint to SAP quality case, link Salesforce, notify quality team."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID."
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          steps:
            - name: get-case
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-quality-notification
              type: call
              call: sap.create-quality-notification
              with:
                notification_type: "customer_complaint"
                description: "{{get-case.subject}}: {{get-case.description}}"
            - name: update-sf-case
              type: call
              call: salesforce.update-case
              with:
                case_id: "{{case_id}}"
                sap_notification: "{{create-quality-notification.notification_number}}"
            - name: notify-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-cases"
                text: "Quality case from complaint. Case: {{case_id}}. SAP: {{create-quality-notification.notification_number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
            - name: update-case
              method: PATCH
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a Datadog alert and, when resolved, updates the linked ServiceNow incident to resolved status and posts a closure notification in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Alert Resolution Tracker"
  description: "Looks up a Datadog alert and, when resolved, updates the linked ServiceNow incident to resolved status and posts a closure notification in Microsoft Teams."
  tags:
    - observability
    - datadog
    - servicenow
    - incident-response
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: alert-resolution
      port: 8080
      tools:
        - name: resolve-alert-and-incident
          description: "Given a Datadog alert ID and linked ServiceNow incident number, check if the alert is resolved, then update the SNOW incident to Resolved and post a closure notice in Teams."
          inputParameters:
            - name: datadog_alert_id
              in: body
              type: string
              description: "The Datadog monitor alert ID that has been resolved."
            - name: snow_incident_number
              in: body
              type: string
              description: "The ServiceNow incident number linked to this alert."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID to post the closure notification."
          steps:
            - name: get-alert-status
              type: call
              call: datadog.get-alert
              with:
                alert_id: "{{datadog_alert_id}}"
            - name: resolve-incident
              type: call
              call: servicenow.resolve-incident
              with:
                number: "{{snow_incident_number}}"
                close_code: "Solved (Permanently)"
                close_notes: "Datadog alert {{datadog_alert_id}} resolved. Auto-closed."
            - name: post-closure
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Incident Resolved: SNOW {{snow_incident_number}} closed. Datadog alert {{datadog_alert_id}} status: {{get-alert-status.status}}."
  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: alerts
          path: "/monitor/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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: resolve-incident
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches the current status of all monitored Datadog hosts in a given tag group and posts a health digest to the infrastructure Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Dashboard Digest"
  description: "Fetches the current status of all monitored Datadog hosts in a given tag group and posts a health digest to the infrastructure Teams channel."
  tags:
    - observability
    - datadog
    - reporting
    - microsoft-teams
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infra-reporting
      port: 8080
      tools:
        - name: digest-host-health
          description: "Given a Datadog host tag filter, list all matching hosts and their statuses, then post a health digest to the infrastructure Teams channel."
          inputParameters:
            - name: host_tag
              in: body
              type: string
              description: "The Datadog tag filter to scope the host list (e.g., 'env:production')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the infrastructure digest."
          steps:
            - name: list-hosts
              type: call
              call: datadog.list-hosts
              with:
                filter: "{{host_tag}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Infrastructure Health ({{host_tag}}): {{list-hosts.total}} hosts | Up: {{list-hosts.up_count}} | Down: {{list-hosts.down_count}} | Muted: {{list-hosts.muted_count}}"
  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: hosts
          path: "/hosts"
          inputParameters:
            - name: filter
              in: query
          operations:
            - name: list-hosts
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a specified service, returning uptime, error rate, and latency metrics."
  tags:
    - it-operations
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-service-health
          description: "Check the health of a service in Datadog. Returns uptime percentage, error rate, and p99 latency."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
          call: datadog.get-service-metrics
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: uptime
              type: string
              mapping: "$.data.attributes.uptime"
            - name: error_rate
              type: string
              mapping: "$.data.attributes.error_rate"
            - name: p99_latency
              type: string
              mapping: "$.data.attributes.p99_latency"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
      resources:
        - name: service-metrics
          path: "/metrics/query?query=service:{{service_name}}"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-service-metrics
              method: GET

Converts demand forecasts into production plans by pulling Salesforce forecast data, creating planned orders in SAP, and refreshing the Power BI demand dashboard.

naftiko: "0.5"
info:
  label: "Demand Forecast to Production Plan"
  description: "Converts demand forecasts into production plans by pulling Salesforce forecast data, creating planned orders in SAP, and refreshing the Power BI demand dashboard."
  tags:
    - supply-chain
    - manufacturing
    - salesforce
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: demand-planning
      port: 8080
      tools:
        - name: convert-forecast-to-plan
          description: "Convert forecast to production plan: pull Salesforce forecast, create SAP planned orders, refresh dashboard."
          inputParameters:
            - name: forecast_id
              in: body
              type: string
              description: "The Salesforce forecast record ID."
            - name: plant_code
              in: body
              type: string
              description: "The target manufacturing plant code."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI demand dataset ID."
          steps:
            - name: get-forecast
              type: call
              call: salesforce.get-forecast
              with:
                forecast_id: "{{forecast_id}}"
            - name: create-planned-orders
              type: call
              call: sap.create-planned-order
              with:
                material_number: "{{get-forecast.material}}"
                plant: "{{plant_code}}"
                planned_quantity: "{{get-forecast.quantity}}"
                planned_date: "{{get-forecast.delivery_date}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: forecasts
          path: "/sobjects/Demand_Forecast__c/{{forecast_id}}"
          inputParameters:
            - name: forecast_id
              in: path
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PLANNED_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: planned-orders
          path: "/A_PlannedOrder"
          operations:
            - name: create-planned-order
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Reconciles digital marketing spend by pulling campaign costs from Google Analytics, comparing with SAP cost center actuals, and posting a variance report to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Digital Marketing Spend Reconciliation"
  description: "Reconciles digital marketing spend by pulling campaign costs from Google Analytics, comparing with SAP cost center actuals, and posting a variance report to Microsoft Teams."
  tags:
    - marketing
    - finance
    - google-analytics
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing-finance
      port: 8080
      tools:
        - name: reconcile-marketing-spend
          description: "Reconcile digital marketing spend across GA and SAP, then post variance report."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP marketing cost center."
            - name: campaign_id
              in: body
              type: string
              description: "The Google Analytics campaign ID."
            - name: period
              in: body
              type: string
              description: "The fiscal period."
          steps:
            - name: get-ga-spend
              type: call
              call: ga.get-campaign-cost
              with:
                campaign_id: "{{campaign_id}}"
                period: "{{period}}"
            - name: get-sap-actuals
              type: call
              call: sap.get-cost-center-actuals
              with:
                cost_center: "{{cost_center}}"
                period: "{{period}}"
            - name: post-variance-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "marketing-finance"
                text: "Marketing Spend Reconciliation {{period}}: GA Spend: ${{get-ga-spend.total_cost}}. SAP Actuals: ${{get-sap-actuals.total_actual}}."
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsreporting.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: campaign-cost
          path: "/reports:batchGet"
          operations:
            - name: get-campaign-cost
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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}}')/to_Actuals?$filter=Period eq '{{period}}'"
          inputParameters:
            - name: cost_center
              in: path
            - name: period
              in: query
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Performs distributor credit checks by validating SAP credit limits, checking Salesforce payment history, and releasing or blocking the sales order.

naftiko: "0.5"
info:
  label: "Distributor Credit Check and Order Release"
  description: "Performs distributor credit checks by validating SAP credit limits, checking Salesforce payment history, and releasing or blocking the sales order."
  tags:
    - distribution
    - finance
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: credit-management
      port: 8080
      tools:
        - name: check-credit-and-release
          description: "Check distributor credit in SAP, verify Salesforce history, release or block order."
          inputParameters:
            - name: sales_order_number
              in: body
              type: string
              description: "The SAP sales order number."
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          steps:
            - name: get-credit-status
              type: call
              call: sap.get-credit-status
              with:
                sales_order: "{{sales_order_number}}"
            - name: get-payment-history
              type: call
              call: salesforce.get-payment-history
              with:
                account_id: "{{account_id}}"
            - name: release-order
              type: call
              call: sap.release-credit-block
              with:
                sales_order: "{{sales_order_number}}"
                payment_score: "{{get-payment-history.payment_score}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: credit-status
          path: "/A_SalesOrder('{{sales_order}}')/to_CreditStatus"
          inputParameters:
            - name: sales_order
              in: path
          operations:
            - name: get-credit-status
              method: GET
        - name: credit-release
          path: "/A_SalesOrder('{{sales_order}}')/to_CreditRelease"
          inputParameters:
            - name: sales_order
              in: path
          operations:
            - name: release-credit-block
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: payment-history
          path: "/sobjects/Account/{{account_id}}/Payment_History__r"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-payment-history
              method: GET

Tracks distributor order fulfillment by pulling the sales order from SAP, checking delivery status, and updating the Salesforce account.

naftiko: "0.5"
info:
  label: "Distributor Order Fulfillment Tracker"
  description: "Tracks distributor order fulfillment by pulling the sales order from SAP, checking delivery status, and updating the Salesforce account."
  tags:
    - distribution
    - sap
    - salesforce
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: distribution
      port: 8080
      tools:
        - name: track-distributor-order
          description: "Track distributor order: pull SAP sales order, check delivery, update Salesforce account."
          inputParameters:
            - name: sales_order_number
              in: body
              type: string
              description: "The SAP sales order number."
            - name: account_id
              in: body
              type: string
              description: "The Salesforce distributor account ID."
          steps:
            - name: get-sales-order
              type: call
              call: sap.get-sales-order
              with:
                sales_order_number: "{{sales_order_number}}"
            - name: get-delivery-status
              type: call
              call: sap.get-delivery-by-order
              with:
                sales_order: "{{sales_order_number}}"
            - name: update-sf-account
              type: call
              call: salesforce.update-account
              with:
                account_id: "{{account_id}}"
                last_order_status: "{{get-sales-order.status}}"
                last_delivery_date: "{{get-delivery-status.actual_goods_issue_date}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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('{{sales_order_number}}')"
          inputParameters:
            - name: sales_order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET
        - name: deliveries
          path: "/A_SalesOrder('{{sales_order}}')/to_Delivery"
          inputParameters:
            - name: sales_order
              in: path
          operations:
            - name: get-delivery-by-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.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: update-account
              method: PATCH

Optimizes Direct Store Delivery routes by analyzing Salesforce retail accounts, checking SAP regional inventory, and posting optimized routes to Microsoft Teams.

naftiko: "0.5"
info:
  label: "DSD Route Delivery Optimization"
  description: "Optimizes Direct Store Delivery routes by analyzing Salesforce retail accounts, checking SAP regional inventory, and posting optimized routes to Microsoft Teams."
  tags:
    - distribution
    - supply-chain
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dsd-optimization
      port: 8080
      tools:
        - name: optimize-dsd-routes
          description: "Optimize DSD routes: analyze Salesforce accounts, check SAP inventory, post routes."
          inputParameters:
            - name: region_code
              in: body
              type: string
              description: "The distribution region code."
            - name: delivery_date
              in: body
              type: string
              description: "Target delivery date."
          steps:
            - name: get-retail-accounts
              type: call
              call: salesforce.get-region-accounts
              with:
                region: "{{region_code}}"
            - name: check-warehouse-stock
              type: call
              call: sap.get-regional-stock
              with:
                region: "{{region_code}}"
            - name: post-optimized-routes
              type: call
              call: msteams.send-message
              with:
                channel_id: "dsd-{{region_code}}"
                text: "DSD Route Optimization for {{region_code}} on {{delivery_date}}: Accounts: {{get-retail-accounts.count}}. Stock: {{check-warehouse-stock.total_cases}} cases."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/query?q=SELECT+Id,Name+FROM+Account+WHERE+Region__c='{{region}}'"
          inputParameters:
            - name: region
              in: query
          operations:
            - name: get-region-accounts
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: regional-stock
          path: "/RegionalInventory('{{region}}')"
          inputParameters:
            - name: region
              in: path
          operations:
            - name: get-regional-stock
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Dynatrace detects performance degradation, retrieves problem details, creates a ServiceNow incident, and notifies the SRE team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Dynatrace Performance Degradation Alert"
  description: "When Dynatrace detects performance degradation, retrieves problem details, creates a ServiceNow incident, and notifies the SRE team via Microsoft Teams."
  tags:
    - it-operations
    - dynatrace
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: performance-ops
      port: 8080
      tools:
        - name: handle-performance-degradation
          description: "Handle Dynatrace alert: get problem, create ServiceNow incident, notify SRE."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "The Dynatrace problem ID."
          steps:
            - name: get-problem-details
              type: call
              call: dynatrace.get-problem
              with:
                problem_id: "{{problem_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Performance: {{get-problem-details.title}}"
                description: "Impact: {{get-problem-details.impact_level}}. Root cause: {{get-problem-details.root_cause}}."
                urgency: "2"
                assignment_group: "SRE_Team"
            - name: notify-sre
              type: call
              call: msteams.send-message
              with:
                channel_id: "sre-alerts"
                text: "Performance Alert: {{get-problem-details.title}}. Impact: {{get-problem-details.impact_level}}. Ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://pepsico.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is processed in Workday, creates a ServiceNow offboarding ticket and notifies the IT security team in Microsoft Teams for access revocation.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is processed in Workday, creates a ServiceNow offboarding ticket and notifies the IT security team in Microsoft Teams for access revocation."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday worker ID and termination date, create a ServiceNow offboarding ticket and alert IT security via Teams to begin access revocation."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-offboard-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Offboarding: {{get-employee.full_name}} — last day {{termination_date}}"
                category: "hr_offboarding"
                assigned_group: "IT_Security"
            - name: notify-it-security
              type: call
              call: msteams.send-message
              with:
                channel_id: "it-security-channel"
                text: "Offboarding initiated for {{get-employee.full_name}} (last day: {{termination_date}}). SNOW: {{create-offboard-ticket.number}}. Please begin access revocation."
  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: "/pepsico/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee changes roles in Workday, updates ServiceNow access groups, modifies SharePoint permissions, and notifies the employee via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Role Change Provisioning"
  description: "When an employee changes roles in Workday, updates ServiceNow access groups, modifies SharePoint permissions, and notifies the employee via Microsoft Teams."
  tags:
    - hr
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-provisioning
      port: 8080
      tools:
        - name: process-role-change
          description: "Orchestrate role change: update ServiceNow access, modify SharePoint permissions, notify via Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: new_role
              in: body
              type: string
              description: "The new role title."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: update-access-groups
              type: call
              call: servicenow.update-user-groups
              with:
                user_email: "{{get-worker.work_email}}"
                new_role: "{{new_role}}"
            - name: update-sharepoint-access
              type: call
              call: sharepoint.update-permissions
              with:
                user_email: "{{get-worker.work_email}}"
                site_group: "{{new_role}}-team"
            - name: notify-employee
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Hi {{get-worker.first_name}}, your role has been updated to {{new_role}}. Your system access has been adjusted accordingly."
  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: "/pepsico/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: user-groups
          path: "/table/sys_user_grmember"
          operations:
            - name: update-user-groups
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: permissions
          path: "/sites/root/permissions"
          operations:
            - name: update-permissions
              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

Generates energy cost reports by pulling SAP plant energy data, comparing utility costs, and publishing to SharePoint.

naftiko: "0.5"
info:
  label: "Energy Cost Optimization Report"
  description: "Generates energy cost reports by pulling SAP plant energy data, comparing utility costs, and publishing to SharePoint."
  tags:
    - manufacturing
    - finance
    - sap
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: energy-optimization
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Generate energy cost report: pull SAP plant data, compare rates, publish to SharePoint."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
            - name: period
              in: body
              type: string
              description: "The reporting period."
          steps:
            - name: get-energy-consumption
              type: call
              call: sap.get-plant-energy-consumption
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: get-energy-costs
              type: call
              call: sap.get-cost-center-actuals
              with:
                cost_center: "energy-{{plant_code}}"
                period: "{{period}}"
            - name: publish-report
              type: call
              call: sharepoint.upload-file
              with:
                site_id: "operations"
                folder_path: "Energy/Reports/{{period}}"
                file_name: "energy-{{plant_code}}.json"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PLANT_METRICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: energy
          path: "/PlantEnergyConsumption(Plant='{{plant}}',Period='{{period}}')"
          inputParameters:
            - name: plant
              in: path
            - name: period
              in: path
          operations:
            - name: get-plant-energy-consumption
              method: GET
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')/to_Actuals"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Schedules fleet vehicle maintenance by checking SAP equipment records, creating a ServiceNow work order, and notifying the fleet team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Fleet Vehicle Maintenance Scheduler"
  description: "Schedules fleet vehicle maintenance by checking SAP equipment records, creating a ServiceNow work order, and notifying the fleet team via Microsoft Teams."
  tags:
    - distribution
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fleet-ops
      port: 8080
      tools:
        - name: schedule-vehicle-maintenance
          description: "Schedule fleet maintenance: check SAP equipment, create ServiceNow work order, notify fleet team."
          inputParameters:
            - name: vehicle_id
              in: body
              type: string
              description: "The SAP equipment ID for the fleet vehicle."
            - name: maintenance_type
              in: body
              type: string
              description: "Type: preventive, corrective, inspection."
          steps:
            - name: get-vehicle-record
              type: call
              call: sap.get-equipment
              with:
                equipment_id: "{{vehicle_id}}"
            - name: create-work-order
              type: call
              call: servicenow.create-work-order
              with:
                short_description: "Fleet maintenance: {{vehicle_id}} - {{maintenance_type}}"
                assignment_group: "Fleet_Maintenance"
            - name: notify-fleet-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "fleet-management"
                text: "Maintenance scheduled for vehicle {{vehicle_id}}. Type: {{maintenance_type}}. Last service: {{get-vehicle-record.last_maintenance_date}}. Work order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment('{{equipment_id}}')"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-equipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Frito-Lay production line goes down, retrieves equipment status from SAP, creates a ServiceNow maintenance ticket, and notifies the plant operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Frito-Lay Production Line Downtime Response"
  description: "When a Frito-Lay production line goes down, retrieves equipment status from SAP, creates a ServiceNow maintenance ticket, and notifies the plant operations team via Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: handle-line-downtime
          description: "Orchestrate Frito-Lay line downtime response: check SAP equipment, create ServiceNow ticket, notify plant ops."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment ID for the production line."
            - name: plant_code
              in: body
              type: string
              description: "The Frito-Lay plant code."
          steps:
            - name: get-equipment-status
              type: call
              call: sap.get-equipment
              with:
                equipment_id: "{{equipment_id}}"
            - name: create-maintenance-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Production line downtime: {{equipment_id}} at plant {{plant_code}}"
                category: "plant_maintenance"
                urgency: "1"
                assignment_group: "FritoLay_Maintenance_{{plant_code}}"
            - name: notify-plant-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "fritolay-plant-ops-{{plant_code}}"
                text: "ALERT: Production line {{equipment_id}} down at Frito-Lay plant {{plant_code}}. Status: {{get-equipment-status.system_status}}. Ticket: {{create-maintenance-ticket.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment('{{equipment_id}}')"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-equipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks Gatorade sports sponsorship performance by pulling social engagement from LinkedIn, campaign metrics from Salesforce, and posting a digest to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Gatorade Sports Sponsorship Performance"
  description: "Tracks Gatorade sports sponsorship performance by pulling social engagement from LinkedIn, campaign metrics from Salesforce, and posting a digest to Microsoft Teams."
  tags:
    - marketing
    - brand-management
    - linkedin
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sponsorship
      port: 8080
      tools:
        - name: track-sponsorship-performance
          description: "Track Gatorade sponsorship: pull LinkedIn engagement, Salesforce metrics, post digest."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce sponsorship campaign ID."
            - name: linkedin_campaign_id
              in: body
              type: string
              description: "The LinkedIn campaign ID."
          steps:
            - name: get-linkedin-engagement
              type: call
              call: linkedin.get-campaign-analytics
              with:
                campaign_id: "{{linkedin_campaign_id}}"
            - name: get-sf-campaign
              type: call
              call: salesforce.get-campaign
              with:
                campaign_id: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "gatorade-marketing"
                text: "Gatorade Sponsorship: {{get-sf-campaign.name}}. LinkedIn impressions: {{get-linkedin-engagement.impressions}}. Engagements: {{get-linkedin-engagement.engagements}}. Budget used: ${{get-sf-campaign.actual_cost}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/adAnalyticsV2?campaigns=urn:li:sponsoredCampaign:{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks GitHub release deployments by checking release status, verifying Datadog health metrics, and updating ServiceNow change requests.

naftiko: "0.5"
info:
  label: "GitHub Release Deployment Tracker"
  description: "Tracks GitHub release deployments by checking release status, verifying Datadog health metrics, and updating ServiceNow change requests."
  tags:
    - devops
    - github
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: deployment
      port: 8080
      tools:
        - name: track-release-deployment
          description: "Track release deployment: check GitHub, verify Datadog, update ServiceNow."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository."
            - name: release_tag
              in: body
              type: string
              description: "The release tag."
            - name: change_request_id
              in: body
              type: string
              description: "The ServiceNow change request sys_id."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                repo: "{{repo}}"
                tag: "{{release_tag}}"
            - name: check-health
              type: call
              call: datadog.get-service-metrics
              with:
                service_name: "{{repo}}"
            - name: update-change-request
              type: call
              call: servicenow.update-change-request
              with:
                sys_id: "{{change_request_id}}"
                state: "review"
                work_notes: "Release {{release_tag}} deployed. Error rate: {{check-health.error_rate}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/pepsico/{{repo}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
      resources:
        - name: service-metrics
          path: "/metrics/query?query=service:{{service_name}}"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-change-request
              method: PATCH

Retrieves campaign performance metrics from Google Analytics including sessions, bounce rate, and conversions.

naftiko: "0.5"
info:
  label: "Google Analytics Campaign Metrics"
  description: "Retrieves campaign performance metrics from Google Analytics including sessions, bounce rate, and conversions."
  tags:
    - marketing
    - google-analytics
    - campaign-management
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: get-campaign-metrics
          description: "Fetch Google Analytics campaign performance. Returns sessions, bounce rate, and goal completions."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Google Analytics campaign identifier."
            - name: date_range
              in: body
              type: string
              description: "Date range in YYYY-MM-DD:YYYY-MM-DD format."
          call: ga.get-campaign-report
          with:
            campaign_id: "{{campaign_id}}"
            date_range: "{{date_range}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.reports[0].data.totals[0].values[0]"
            - name: bounce_rate
              type: string
              mapping: "$.reports[0].data.totals[0].values[1]"
            - name: conversions
              type: string
              mapping: "$.reports[0].data.totals[0].values[2]"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsreporting.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/reports:batchGet"
          operations:
            - name: get-campaign-report
              method: POST

Assesses supplier risk by pulling vendor data from SAP, checking compliance in ServiceNow, and posting a risk report to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Ingredient Supplier Risk Assessment"
  description: "Assesses supplier risk by pulling vendor data from SAP, checking compliance in ServiceNow, and posting a risk report to Microsoft Teams."
  tags:
    - procurement
    - supply-chain
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-risk
      port: 8080
      tools:
        - name: assess-supplier-risk
          description: "Assess supplier risk: pull SAP vendor data, check ServiceNow compliance, post risk report."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
          steps:
            - name: get-vendor-data
              type: call
              call: sap.get-vendor
              with:
                vendor_id: "{{vendor_id}}"
            - name: check-compliance
              type: call
              call: servicenow.get-compliance-record
              with:
                vendor_name: "{{get-vendor-data.vendor_name}}"
            - name: post-risk-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "procurement-risk"
                text: "Supplier Risk: {{get-vendor-data.vendor_name}} ({{vendor_id}}). Country: {{get-vendor-data.country}}. Compliance: {{check-compliance.status}}. Last audit: {{check-compliance.last_audit_date}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_BusinessPartner('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance
          path: "/table/vendor_compliance?sysparm_query=vendor_name={{vendor_name}}"
          inputParameters:
            - name: vendor_name
              in: query
          operations:
            - name: get-compliance-record
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages IT asset lifecycle by checking ServiceNow asset status, verifying Workday user assignment, and updating tracking records.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Management"
  description: "Manages IT asset lifecycle by checking ServiceNow asset status, verifying Workday user assignment, and updating tracking records."
  tags:
    - it-operations
    - servicenow
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-asset
      port: 8080
      tools:
        - name: manage-asset-lifecycle
          description: "Manage IT asset: check ServiceNow, verify Workday user, update tracking."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The ServiceNow asset tag."
          steps:
            - name: get-asset
              type: call
              call: servicenow.get-asset
              with:
                asset_tag: "{{asset_tag}}"
            - name: get-assigned-user
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{get-asset.assigned_to_worker_id}}"
            - name: notify-it-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "it-asset-management"
                text: "Asset {{asset_tag}}: Assigned to {{get-assigned-user.full_name}} ({{get-assigned-user.department}}). Status: {{get-asset.status}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: assets
          path: "/table/alm_hardware?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: query
          operations:
            - name: get-asset
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/pepsico/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches PepsiCo LinkedIn company page engagement metrics (impressions, shares, reactions) and posts a weekly digest to the brand marketing Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Brand Engagement Digest"
  description: "Fetches PepsiCo LinkedIn company page engagement metrics (impressions, shares, reactions) and posts a weekly digest to the brand marketing Teams channel."
  tags:
    - marketing
    - linkedin
    - social
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: brand-reporting
      port: 8080
      tools:
        - name: digest-linkedin-engagement
          description: "Retrieve LinkedIn organization page engagement statistics for the past 30 days and post a branded performance digest to the marketing Teams channel."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "The LinkedIn organization ID for PepsiCo's company page."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the brand marketing digest."
          steps:
            - name: get-engagement
              type: call
              call: linkedin.get-share-statistics
              with:
                organization_id: "{{organization_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "LinkedIn Brand Digest (30d): Impressions: {{get-engagement.impressions}} | Reactions: {{get-engagement.likes}} | Shares: {{get-engagement.shares}} | Comments: {{get-engagement.comments}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: share-statistics
          path: "/organizationalEntityShareStatistics"
          inputParameters:
            - name: organization_id
              in: query
          operations:
            - name: get-share-statistics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs LinkedIn employer branding campaign metrics to Workday recruiting analytics and posts a talent acquisition report to Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Campaign Sync"
  description: "Syncs LinkedIn employer branding campaign metrics to Workday recruiting analytics and posts a talent acquisition report to Microsoft Teams."
  tags:
    - hr
    - marketing
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-marketing
      port: 8080
      tools:
        - name: sync-employer-brand
          description: "Sync LinkedIn employer brand data to Workday and post report to Teams."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The LinkedIn campaign ID."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: linkedin.get-campaign-analytics
              with:
                campaign_id: "{{campaign_id}}"
            - name: update-workday-recruiting
              type: call
              call: workday.update-recruiting-metrics
              with:
                source: "linkedin"
                impressions: "{{get-linkedin-metrics.impressions}}"
                applications: "{{get-linkedin-metrics.conversions}}"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "talent-acquisition"
                text: "LinkedIn Employer Brand: Impressions: {{get-linkedin-metrics.impressions}}. Applications: {{get-linkedin-metrics.conversions}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalyticsV2?campaigns=urn:li:sponsoredCampaign:{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: recruiting-metrics
          path: "/pepsico/recruiting/metrics"
          operations:
            - name: update-recruiting-metrics
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs email campaign results from MailChimp to Salesforce and posts a performance summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "MailChimp Consumer Email Campaign Sync"
  description: "Syncs email campaign results from MailChimp to Salesforce and posts a performance summary to Microsoft Teams."
  tags:
    - marketing
    - mailchimp
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: email-marketing
      port: 8080
      tools:
        - name: sync-email-results
          description: "Sync MailChimp results to Salesforce and post summary to Teams."
          inputParameters:
            - name: mailchimp_campaign_id
              in: body
              type: string
              description: "The MailChimp campaign ID."
            - name: sf_campaign_id
              in: body
              type: string
              description: "The Salesforce campaign ID."
          steps:
            - name: get-report
              type: call
              call: mailchimp.get-campaign-report
              with:
                campaign_id: "{{mailchimp_campaign_id}}"
            - name: update-sf
              type: call
              call: salesforce.update-campaign
              with:
                campaign_id: "{{sf_campaign_id}}"
                emails_sent: "{{get-report.emails_sent}}"
                open_rate: "{{get-report.open_rate}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "marketing-campaigns"
                text: "Email Report: {{get-report.campaign_title}}. Sent: {{get-report.emails_sent}}. Open: {{get-report.open_rate}}%. Click: {{get-report.click_rate}}%."
  consumes:
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: reports
          path: "/reports/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-report
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches campaign performance metrics from Salesforce Marketing Cloud and posts a weekly digest to the brand marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Fetches campaign performance metrics from Salesforce Marketing Cloud and posts a weekly digest to the brand marketing Microsoft Teams channel."
  tags:
    - marketing
    - salesforce
    - reporting
    - microsoft-teams
    - campaign
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a Salesforce campaign ID and reporting period, fetch open rate, click rate, and conversion metrics, then post a digest to the marketing Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce campaign ID to report on."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the marketing digest."
          steps:
            - name: get-campaign
              type: call
              call: salesforce.get-campaign
              with:
                campaign_id: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Campaign Digest: {{get-campaign.Name}} | Status: {{get-campaign.Status}} | Sent: {{get-campaign.NumberSent}} | Responses: {{get-campaign.NumberOfResponses}} | Conversion: {{get-campaign.ConversionRate}}%"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates the monthly financial close by checking SAP period-end status, refreshing the Power BI finance dashboard, and notifying the finance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Monthly Financial Close Orchestrator"
  description: "Orchestrates the monthly financial close by checking SAP period-end status, refreshing the Power BI finance dashboard, and notifying the finance team via Microsoft Teams."
  tags:
    - finance
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-monthly-close
          description: "Orchestrate monthly close: check SAP period status, refresh dashboard, notify finance."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period, e.g. 2026-03."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI finance dataset ID."
          steps:
            - name: check-period-status
              type: call
              call: sap.get-period-close-status
              with:
                company_code: "{{company_code}}"
                period: "{{fiscal_period}}"
            - name: refresh-finance-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance-close"
                text: "Monthly close for {{fiscal_period}}: SAP period status: {{check-period-status.status}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIODCLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close
          path: "/A_FinancialPeriodClose(CompanyCode='{{company_code}}',Period='{{period}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: period
              in: path
          operations:
            - name: get-period-close-status
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Aggregates marketing attribution data from Google Analytics and LinkedIn to create a unified campaign view in Salesforce.

naftiko: "0.5"
info:
  label: "Multi-Channel Marketing Attribution"
  description: "Aggregates marketing attribution data from Google Analytics and LinkedIn to create a unified campaign view in Salesforce."
  tags:
    - marketing
    - google-analytics
    - linkedin
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: marketing-attribution
      port: 8080
      tools:
        - name: aggregate-attribution
          description: "Aggregate marketing attribution: pull GA and LinkedIn data, update Salesforce campaign."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce campaign ID."
            - name: ga_campaign_id
              in: body
              type: string
              description: "The GA campaign ID."
            - name: linkedin_campaign_id
              in: body
              type: string
              description: "The LinkedIn campaign ID."
          steps:
            - name: get-ga-attribution
              type: call
              call: ga.get-campaign-report
              with:
                campaign_id: "{{ga_campaign_id}}"
            - name: get-linkedin-attribution
              type: call
              call: linkedin.get-campaign-analytics
              with:
                campaign_id: "{{linkedin_campaign_id}}"
            - name: update-sf-campaign
              type: call
              call: salesforce.update-campaign
              with:
                campaign_id: "{{campaign_id}}"
                web_conversions: "{{get-ga-attribution.conversions}}"
                social_engagements: "{{get-linkedin-attribution.engagements}}"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsreporting.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/reports:batchGet"
          operations:
            - name: get-campaign-report
              method: POST
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/adAnalyticsV2?campaigns=urn:li:sponsoredCampaign:{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign
              method: PATCH

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

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions SharePoint access, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full PepsiCo onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-sharepoint
              type: call
              call: sharepoint.create-folder
              with:
                site_id: "hr-onboarding"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                channel_id: "hr-new-hires"
                text: "Welcome to PepsiCo, {{get-employee.full_name}}! Your IT ticket: {{create-snow-ticket.number}}. Start date: {{start_date}}."
  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: "/pepsico/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: folders
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Validates new product launch readiness by checking SAP material master, Salesforce product catalog, and Google Analytics tracking configuration.

naftiko: "0.5"
info:
  label: "New Product Launch Readiness Check"
  description: "Validates new product launch readiness by checking SAP material master, Salesforce product catalog, and Google Analytics tracking configuration."
  tags:
    - brand-management
    - manufacturing
    - sap
    - salesforce
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: product-launch
      port: 8080
      tools:
        - name: check-launch-readiness
          description: "Validate product launch readiness across SAP, Salesforce, and Google Analytics."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: product_id
              in: body
              type: string
              description: "The Salesforce product record ID."
          steps:
            - name: check-material-master
              type: call
              call: sap.get-material-master
              with:
                material_number: "{{material_number}}"
            - name: check-sf-product
              type: call
              call: salesforce.get-product
              with:
                product_id: "{{product_id}}"
            - name: check-analytics-tracking
              type: call
              call: ga.get-tracking-config
              with:
                product_code: "{{material_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-master
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: products
          path: "/sobjects/Product2/{{product_id}}"
          inputParameters:
            - name: product_id
              in: path
          operations:
            - name: get-product
              method: GET
    - type: http
      namespace: ga
      baseUri: "https://analyticsadmin.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: tracking-config
          path: "/properties/pepsico/tracking/{{product_code}}"
          inputParameters:
            - name: product_code
              in: path
          operations:
            - name: get-tracking-config
              method: GET

Retrieves application health summary from New Relic, including response time, throughput, and error rate.

naftiko: "0.5"
info:
  label: "New Relic Application Health"
  description: "Retrieves application health summary from New Relic, including response time, throughput, and error rate."
  tags:
    - it-operations
    - new-relic
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: apm
      port: 8080
      tools:
        - name: get-app-health
          description: "Get New Relic application health. Returns response time, throughput, and error rate."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: newrelic.get-app-summary
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: response_time
              type: string
              mapping: "$.application_summary.response_time"
            - name: throughput
              type: string
              mapping: "$.application_summary.throughput"
            - name: error_rate
              type: string
              mapping: "$.application_summary.error_rate"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        header: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-summary
              method: GET

When a P1 production incident is raised, creates a ServiceNow incident, annotates Datadog, and alerts the engineering on-call team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "P1 Incident Response Chain"
  description: "When a P1 production incident is raised, creates a ServiceNow incident, annotates Datadog, and alerts the engineering on-call team in Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given an affected service and impact summary, create a ServiceNow P1 incident, create a Datadog event annotation, and alert the engineering team in Teams."
          inputParameters:
            - name: affected_service
              in: body
              type: string
              description: "The name of the affected PepsiCo service or system."
            - name: impact_summary
              in: body
              type: string
              description: "A brief description of the business impact."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the on-call alert."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "P1 Incident: {{affected_service}} — {{impact_summary}}"
                urgency: "1"
                category: "application"
            - name: annotate-datadog
              type: call
              call: datadog.create-event
              with:
                title: "P1 Production Incident: {{affected_service}}"
                text: "SNOW {{create-snow-incident.number}} — {{impact_summary}}"
                alert_type: "error"
            - name: alert-oncall
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "P1 INCIDENT: {{affected_service}} | Impact: {{impact_summary}} | SNOW: {{create-snow-incident.number}} | Datadog: {{annotate-datadog.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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: datadog
      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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Detects packaging material shortages by checking SAP inventory, identifies affected production orders, and escalates to supply chain teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Packaging Material Shortage Alert"
  description: "Detects packaging material shortages by checking SAP inventory, identifies affected production orders, and escalates to supply chain teams via Microsoft Teams."
  tags:
    - manufacturing
    - supply-chain
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-alert
      port: 8080
      tools:
        - name: alert-packaging-shortage
          description: "Orchestrate packaging shortage: check SAP inventory, identify affected orders, notify supply chain."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the packaging material."
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
          steps:
            - name: check-stock
              type: call
              call: sap.get-material-stock
              with:
                material_number: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: get-affected-orders
              type: call
              call: sap.get-dependent-orders
              with:
                material_number: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: notify-supply-chain
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain-alerts"
                text: "PACKAGING SHORTAGE: Material {{material_number}} at plant {{plant_code}}. Stock: {{check-stock.available_stock}} {{check-stock.unit}}. Affected orders: {{get-affected-orders.count}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET
        - name: dependent-orders
          path: "/A_ProductionOrder?$filter=Material eq '{{material_number}}' and Plant eq '{{plant}}'"
          inputParameters:
            - name: material_number
              in: query
            - name: plant
              in: query
          operations:
            - name: get-dependent-orders
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Optimizes vending machine refills by pulling telemetry data, checking regional SAP inventory, and creating route-optimized refill tasks in ServiceNow.

naftiko: "0.5"
info:
  label: "Pepsi Vending Machine Refill Optimization"
  description: "Optimizes vending machine refills by pulling telemetry data, checking regional SAP inventory, and creating route-optimized refill tasks in ServiceNow."
  tags:
    - distribution
    - supply-chain
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: vending-ops
      port: 8080
      tools:
        - name: optimize-refill-routes
          description: "Optimize vending refills: pull telemetry, check SAP inventory, create ServiceNow tasks."
          inputParameters:
            - name: region_code
              in: body
              type: string
              description: "The regional distribution code."
            - name: threshold_percent
              in: body
              type: string
              description: "Stock threshold percentage."
          steps:
            - name: get-machine-telemetry
              type: call
              call: sap.get-vending-telemetry
              with:
                region: "{{region_code}}"
                threshold: "{{threshold_percent}}"
            - name: check-regional-inventory
              type: call
              call: sap.get-regional-stock
              with:
                region: "{{region_code}}"
            - name: create-refill-tasks
              type: call
              call: servicenow.create-task
              with:
                short_description: "Vending refill: Region {{region_code}}"
                description: "Low stock machines: {{get-machine-telemetry.low_stock_count}}. Regional stock: {{check-regional-inventory.available_cases}} cases."
                category: "vending_refill"
                assignment_group: "Distribution_{{region_code}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_VENDING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: telemetry
          path: "/VendingMachineStatus?$filter=Region eq '{{region}}'"
          inputParameters:
            - name: region
              in: query
            - name: threshold
              in: query
          operations:
            - name: get-vending-telemetry
              method: GET
        - name: regional-stock
          path: "/RegionalInventory('{{region}}')"
          inputParameters:
            - name: region
              in: path
          operations:
            - name: get-regional-stock
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Reports a plant safety incident by recording it in ServiceNow, updating the SAP maintenance log, and notifying safety officers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Plant Safety Incident Reporting"
  description: "Reports a plant safety incident by recording it in ServiceNow, updating the SAP maintenance log, and notifying safety officers via Microsoft Teams."
  tags:
    - manufacturing
    - servicenow
    - sap
    - microsoft-teams
    - workday
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Orchestrate safety reporting: create ServiceNow record, update SAP, notify safety team."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: incident_description
              in: body
              type: string
              description: "Description of the safety incident."
            - name: severity
              in: body
              type: string
              description: "Severity: low, medium, high, critical."
          steps:
            - name: create-safety-record
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Plant safety incident at {{plant_code}}"
                description: "{{incident_description}}"
                category: "plant_safety"
                urgency: "{{severity}}"
                assignment_group: "Plant_Safety_{{plant_code}}"
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: notify-safety-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "plant-safety"
                text: "SAFETY INCIDENT at plant {{plant_code}}: {{incident_description}}. Severity: {{severity}}. Employee: {{get-worker.full_name}}. Case: {{create-safety-record.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/pepsico/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Integrates POS data by pulling Circana retail data, updating Salesforce accounts, and refreshing the Power BI sales dashboard.

naftiko: "0.5"
info:
  label: "Point of Sale Data Integration"
  description: "Integrates POS data by pulling Circana retail data, updating Salesforce accounts, and refreshing the Power BI sales dashboard."
  tags:
    - distribution
    - marketing
    - salesforce
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: pos-integration
      port: 8080
      tools:
        - name: integrate-pos-data
          description: "Integrate POS data: pull Circana data, update Salesforce, refresh Power BI."
          inputParameters:
            - name: retailer_id
              in: body
              type: string
              description: "The Circana retailer ID."
            - name: sf_account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          steps:
            - name: get-pos-data
              type: call
              call: circana.get-retailer-pos
              with:
                retailer_id: "{{retailer_id}}"
            - name: update-sf-account
              type: call
              call: salesforce.update-account
              with:
                account_id: "{{sf_account_id}}"
                weekly_volume: "{{get-pos-data.weekly_volume}}"
                market_share: "{{get-pos-data.market_share}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: pos
          path: "/pos/retailer/{{retailer_id}}"
          inputParameters:
            - name: retailer_id
              in: path
          operations:
            - name: get-retailer-pos
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.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: update-account
              method: PATCH
    - 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: trigger-refresh
              method: POST

Monitors frying oil quality at Frito-Lay plants by pulling quality test results from SAP, comparing against thresholds, and alerting quality teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Potato Chip Oil Quality Monitoring"
  description: "Monitors frying oil quality at Frito-Lay plants by pulling quality test results from SAP, comparing against thresholds, and alerting quality teams via Microsoft Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: oil-quality
      port: 8080
      tools:
        - name: monitor-oil-quality
          description: "Monitor frying oil quality: pull SAP test results, compare thresholds, alert quality team."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The Frito-Lay plant code."
            - name: production_line
              in: body
              type: string
              description: "The production line ID."
          steps:
            - name: get-oil-test-results
              type: call
              call: sap.get-quality-test
              with:
                plant: "{{plant_code}}"
                line: "{{production_line}}"
                test_type: "oil_quality"
            - name: create-quality-record
              type: call
              call: servicenow.create-task
              with:
                short_description: "Oil quality check: Plant {{plant_code}} Line {{production_line}}"
                description: "FFA level: {{get-oil-test-results.ffa_level}}. Color index: {{get-oil-test-results.color_index}}."
                category: "quality_monitoring"
                assignment_group: "QA_FritoLay"
            - name: alert-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "fritolay-quality"
                text: "Oil Quality: Plant {{plant_code}}, Line {{production_line}}. FFA: {{get-oil-test-results.ffa_level}}. Color: {{get-oil-test-results.color_index}}. Status: {{get-oil-test-results.pass_fail}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_QUALITYTEST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-tests
          path: "/QualityTest(Plant='{{plant}}',Line='{{line}}',TestType='{{test_type}}')"
          inputParameters:
            - name: plant
              in: path
            - name: line
              in: path
            - name: test_type
              in: path
          operations:
            - name: get-quality-test
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a refresh of the executive KPI Power BI dataset and posts a confirmation to the CFO's Microsoft Teams channel when the refresh is complete.

naftiko: "0.5"
info:
  label: "Power BI Executive KPI Refresh"
  description: "Triggers a refresh of the executive KPI Power BI dataset and posts a confirmation to the CFO's Microsoft Teams channel when the refresh is complete."
  tags:
    - data
    - analytics
    - power-bi
    - finance
    - microsoft-teams
    - executive-reporting
capability:
  exposes:
    - type: mcp
      namespace: executive-bi
      port: 8080
      tools:
        - name: refresh-executive-kpis
          description: "Trigger a Power BI refresh for the executive KPI dashboard and post a refresh confirmation to the CFO's Teams channel."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the executive KPI dashboard."
            - name: notify_upn
              in: body
              type: string
              description: "The Teams UPN of the executive to notify upon refresh initiation."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-executive
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{notify_upn}}"
                text: "Executive KPI dashboard refresh initiated. Dataset {{dataset_id}} is updating. Status: {{trigger-refresh.status}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Power BI dataset refresh for the global sales dashboard and notifies the analytics team in Microsoft Teams upon completion.

naftiko: "0.5"
info:
  label: "Power BI Sales Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the global sales dashboard and notifies the analytics team in Microsoft Teams upon completion."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-ops
      port: 8080
      tools:
        - name: refresh-sales-dashboard
          description: "Trigger a Power BI dataset refresh for the PepsiCo global sales dashboard and post a Teams notification when the refresh is initiated."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the global sales dashboard."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID to notify the analytics team."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-analytics
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Power BI sales dashboard refresh initiated. Dataset: {{dataset_id}}. Status: {{trigger-refresh.status}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls production order data from SAP, refreshes Power BI manufacturing dashboard, and posts a yield summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Production Yield Analysis and Report"
  description: "Pulls production order data from SAP, refreshes Power BI manufacturing dashboard, and posts a yield summary to Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-analytics
      port: 8080
      tools:
        - name: analyze-production-yield
          description: "Analyze production yield: pull SAP data, refresh Power BI dashboard, post summary to Teams."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
            - name: production_date
              in: body
              type: string
              description: "The production date in YYYY-MM-DD format."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI manufacturing dataset ID."
          steps:
            - name: get-production-orders
              type: call
              call: sap.get-production-orders-by-plant
              with:
                plant_code: "{{plant_code}}"
                date: "{{production_date}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
            - name: post-yield-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "manufacturing-ops"
                text: "Yield Report for plant {{plant_code}} on {{production_date}}: Orders: {{get-production-orders.count}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2?$filter=ProductionPlant eq '{{plant_code}}'"
          inputParameters:
            - name: plant_code
              in: query
            - name: date
              in: query
          operations:
            - name: get-production-orders-by-plant
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Traces Quaker Oats ingredients by pulling batch records from SAP, checking supplier certifications in ServiceNow, and posting a traceability report to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Quaker Oats Ingredient Traceability"
  description: "Traces Quaker Oats ingredients by pulling batch records from SAP, checking supplier certifications in ServiceNow, and posting a traceability report to Microsoft Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ingredient-trace
      port: 8080
      tools:
        - name: trace-ingredients
          description: "Trace Quaker ingredients: pull SAP batches, check certifications, post report."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The production batch number."
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          steps:
            - name: get-batch-info
              type: call
              call: sap.get-batch
              with:
                material_number: "{{material_number}}"
                batch_number: "{{batch_number}}"
            - name: check-supplier-certs
              type: call
              call: servicenow.get-supplier-certifications
              with:
                supplier_id: "{{get-batch-info.supplier_id}}"
            - name: post-trace-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "quaker-quality"
                text: "Ingredient Trace: Batch {{batch_number}}. Supplier: {{get-batch-info.supplier_name}}. Production: {{get-batch-info.production_date}}. Certifications: {{check-supplier-certs.cert_status}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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(Material='{{material_number}}',Batch='{{batch_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: certifications
          path: "/table/supplier_certification?sysparm_query=supplier_id={{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: query
          operations:
            - name: get-supplier-certifications
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a quality issue is detected, places a batch on hold in SAP, creates a quality case in ServiceNow, and notifies QA and distribution teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Quality Hold and Recall Orchestrator"
  description: "When a quality issue is detected, places a batch on hold in SAP, creates a quality case in ServiceNow, and notifies QA and distribution teams via Microsoft Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: initiate-quality-hold
          description: "Orchestrate quality hold: place batch on hold in SAP, create ServiceNow case, notify QA and distribution."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: batch_number
              in: body
              type: string
              description: "The batch number to place on hold."
            - name: reason
              in: body
              type: string
              description: "The reason for the quality hold."
          steps:
            - name: get-batch-info
              type: call
              call: sap.get-batch
              with:
                material_number: "{{material_number}}"
                batch_number: "{{batch_number}}"
            - name: place-batch-hold
              type: call
              call: sap.update-batch-status
              with:
                material_number: "{{material_number}}"
                batch_number: "{{batch_number}}"
                status: "RESTRICTED"
            - name: create-quality-case
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Quality hold: Material {{material_number}} Batch {{batch_number}}"
                description: "{{reason}}"
                category: "quality_hold"
                urgency: "1"
                assignment_group: "Quality_Assurance"
            - name: notify-teams
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-alerts"
                text: "QUALITY HOLD: Material {{material_number}}, Batch {{batch_number}}. Reason: {{reason}}. Production date: {{get-batch-info.production_date}}. Case: {{create-quality-case.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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(Material='{{material_number}}',Batch='{{batch_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
            - name: update-batch-status
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes procurement approvals by validating SAP Ariba purchase requisitions, checking budget in SAP, and routing approval via Microsoft Power Automate.

naftiko: "0.5"
info:
  label: "Raw Material Procurement Approval"
  description: "Processes procurement approvals by validating SAP Ariba purchase requisitions, checking budget in SAP, and routing approval via Microsoft Power Automate."
  tags:
    - procurement
    - supply-chain
    - sap-ariba
    - sap
    - microsoft-power-automate
capability:
  exposes:
    - type: mcp
      namespace: procurement-approval
      port: 8080
      tools:
        - name: process-procurement-approval
          description: "Process procurement approval: validate Ariba PR, check SAP budget, route approval."
          inputParameters:
            - name: requisition_number
              in: body
              type: string
              description: "The SAP Ariba purchase requisition number."
          steps:
            - name: get-requisition
              type: call
              call: ariba.get-purchase-requisition
              with:
                requisition_number: "{{requisition_number}}"
            - name: check-budget
              type: call
              call: sap.check-budget-availability
              with:
                cost_center: "{{get-requisition.cost_center}}"
                amount: "{{get-requisition.total_amount}}"
            - name: route-approval
              type: call
              call: power-automate.trigger-flow
              with:
                flow_id: "procurement-approval"
                requisition_number: "{{requisition_number}}"
                amount: "{{get-requisition.total_amount}}"
                budget_status: "{{check-budget.status}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_number}}"
          inputParameters:
            - name: requisition_number
              in: path
          operations:
            - name: get-purchase-requisition
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_BUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/BudgetAvailability(CostCenter='{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: check-budget-availability
              method: GET
    - type: http
      namespace: power-automate
      baseUri: "https://prod-pepsico.logic.azure.com"
      authentication:
        type: apiKey
        header: "x-flow-key"
        value: "$secrets.power_automate_key"
      resources:
        - name: flows
          path: "/workflows/{{flow_id}}/triggers/manual/paths/invoke"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              method: POST

Tracks regulatory compliance documents by checking expiry dates in SharePoint, creating renewal tasks in ServiceNow, and alerting compliance via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Document Tracker"
  description: "Tracks regulatory compliance documents by checking expiry dates in SharePoint, creating renewal tasks in ServiceNow, and alerting compliance via Microsoft Teams."
  tags:
    - manufacturing
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-compliance
      port: 8080
      tools:
        - name: track-compliance-documents
          description: "Track compliance docs: check SharePoint expiry, create ServiceNow tasks, alert team."
          inputParameters:
            - name: document_category
              in: body
              type: string
              description: "The compliance category: FDA, EPA, OSHA."
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: get-documents
              type: call
              call: sharepoint.get-compliance-docs
              with:
                site_id: "regulatory"
                category: "{{document_category}}"
                plant: "{{plant_code}}"
            - name: create-renewal-tasks
              type: call
              call: servicenow.create-task
              with:
                short_description: "Compliance renewal: {{document_category}} for {{plant_code}}"
                description: "Expiring: {{get-documents.expiring_count}}. Next expiry: {{get-documents.next_expiry_date}}."
                category: "regulatory_compliance"
                assignment_group: "Legal_Compliance"
            - name: alert-compliance
              type: call
              call: msteams.send-message
              with:
                channel_id: "regulatory-compliance"
                text: "Compliance Alert: {{document_category}} for plant {{plant_code}}. Expiring: {{get-documents.expiring_count}}. Next: {{get-documents.next_expiry_date}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: compliance-docs
          path: "/sites/{{site_id}}/lists/{{category}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: category
              in: path
          operations:
            - name: get-compliance-docs
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls trade promotion results from Salesforce, enriches with point-of-sale data from Circana, and refreshes the Power BI retail analytics dashboard.

naftiko: "0.5"
info:
  label: "Retail Promotion Performance Sync"
  description: "Pulls trade promotion results from Salesforce, enriches with point-of-sale data from Circana, and refreshes the Power BI retail analytics dashboard."
  tags:
    - marketing
    - salesforce
    - brand-management
    - power-bi
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: trade-marketing
      port: 8080
      tools:
        - name: sync-promotion-performance
          description: "Sync retail promotion performance: pull Salesforce data, enrich with Circana POS, refresh Power BI."
          inputParameters:
            - name: promotion_id
              in: body
              type: string
              description: "The Salesforce promotion record ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI retail dataset ID."
          steps:
            - name: get-promotion
              type: call
              call: salesforce.get-promotion
              with:
                promotion_id: "{{promotion_id}}"
            - name: get-pos-data
              type: call
              call: circana.get-pos-lift
              with:
                brand: "{{get-promotion.brand}}"
                start_date: "{{get-promotion.start_date}}"
                end_date: "{{get-promotion.end_date}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: promotions
          path: "/sobjects/Promotion__c/{{promotion_id}}"
          inputParameters:
            - name: promotion_id
              in: path
          operations:
            - name: get-promotion
              method: GET
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: pos-lift
          path: "/pos/lift?brand={{brand}}&start={{start_date}}&end={{end_date}}"
          inputParameters:
            - name: brand
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-pos-lift
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Audits retail shelf compliance by pulling store audit data from Salesforce, comparing against planogram standards, and posting a report to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Retail Shelf Compliance Audit"
  description: "Audits retail shelf compliance by pulling store audit data from Salesforce, comparing against planogram standards, and posting a report to Microsoft Teams."
  tags:
    - distribution
    - brand-management
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail-compliance
      port: 8080
      tools:
        - name: audit-shelf-compliance
          description: "Audit shelf compliance: pull Salesforce audit data, compare standards, post report."
          inputParameters:
            - name: store_account_id
              in: body
              type: string
              description: "The Salesforce store account ID."
            - name: audit_date
              in: body
              type: string
              description: "The audit date in YYYY-MM-DD format."
          steps:
            - name: get-audit-record
              type: call
              call: salesforce.get-audit-record
              with:
                account_id: "{{store_account_id}}"
                audit_date: "{{audit_date}}"
            - name: get-planogram
              type: call
              call: salesforce.get-planogram
              with:
                store_type: "{{get-audit-record.store_type}}"
            - name: post-compliance-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "retail-operations"
                text: "Shelf Compliance: {{get-audit-record.store_name}} on {{audit_date}}. Score: {{get-audit-record.compliance_score}}%. Planogram: {{get-audit-record.planogram_match}}%."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: audits
          path: "/sobjects/Store_Audit__c"
          operations:
            - name: get-audit-record
              method: GET
        - name: planograms
          path: "/sobjects/Planogram__c"
          operations:
            - name: get-planogram
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce account record by account ID, returning account name, industry, annual revenue, and owner.

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Retrieves a Salesforce account record by account ID, returning account name, industry, annual revenue, and owner."
  tags:
    - sales
    - salesforce
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up a Salesforce account by ID. Returns account name, industry, annual revenue, and account owner."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: annual_revenue
              type: string
              mapping: "$.AnnualRevenue"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.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 key account metrics from Salesforce for a major consumer account and posts an account health digest to the key account manager's Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Consumer Account Health Digest"
  description: "Retrieves key account metrics from Salesforce for a major consumer account and posts an account health digest to the key account manager's Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - key-account
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: kam-ops
      port: 8080
      tools:
        - name: digest-key-account-health
          description: "Given a Salesforce account ID and key account manager's Teams UPN, fetch open opportunities, last activity, and revenue metrics and post an account health digest."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the key consumer account."
            - name: kam_teams_upn
              in: body
              type: string
              description: "The Teams UPN of the key account manager."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{kam_teams_upn}}"
                text: "Key Account Health: {{get-account.Name}} | Annual Revenue: ${{get-account.AnnualRevenue}} | Open Cases: {{get-account.OpenCases}} | Last Activity: {{get-account.LastActivityDate}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a new Salesforce account and contact for an onboarded distributor, then opens a ServiceNow onboarding task for the commercial operations team.

naftiko: "0.5"
info:
  label: "Salesforce Distributor Onboarding"
  description: "Creates a new Salesforce account and contact for an onboarded distributor, then opens a ServiceNow onboarding task for the commercial operations team."
  tags:
    - sales
    - crm
    - salesforce
    - servicenow
    - onboarding
    - distributor
capability:
  exposes:
    - type: mcp
      namespace: distributor-onboarding
      port: 8080
      tools:
        - name: onboard-distributor
          description: "Given distributor company name, primary contact, and region, create a Salesforce account and contact, then open a ServiceNow commercial onboarding task."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "The distributor's legal company name."
            - name: contact_name
              in: body
              type: string
              description: "The primary contact's full name at the distributor."
            - name: contact_email
              in: body
              type: string
              description: "The primary contact's email address."
            - name: region
              in: body
              type: string
              description: "The sales region for the distributor (e.g., 'NA', 'LATAM', 'EMEA')."
          steps:
            - name: create-account
              type: call
              call: salesforce.create-account
              with:
                name: "{{company_name}}"
                type: "Distributor"
                region: "{{region}}"
            - name: create-contact
              type: call
              call: salesforce.create-contact
              with:
                account_id: "{{create-account.id}}"
                name: "{{contact_name}}"
                email: "{{contact_email}}"
            - name: open-onboarding-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Distributor onboarding: {{company_name}} — {{region}}"
                category: "commercial_onboarding"
                description: "Salesforce Account: {{create-account.id}}. Contact: {{contact_name}} ({{contact_email}})."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.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
        - name: contacts
          path: "/sobjects/Contact"
          operations:
            - name: create-contact
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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

Syncs trade promotion opportunity data from Salesforce to the planning team's Power BI dataset for near-real-time revenue reporting.

naftiko: "0.5"
info:
  label: "Salesforce Trade Promotion Opportunity Sync"
  description: "Syncs trade promotion opportunity data from Salesforce to the planning team's Power BI dataset for near-real-time revenue reporting."
  tags:
    - sales
    - crm
    - salesforce
    - power-bi
    - reporting
    - trade-promotion
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: sync-trade-promotion-data
          description: "Query Salesforce for trade promotion opportunities updated in the past 24 hours and push the results to the Power BI dataset for revenue planning."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to push updated opportunity data into."
            - name: table_name
              in: body
              type: string
              description: "The Power BI table name within the dataset (e.g., 'TradeOpportunities')."
          steps:
            - name: query-opportunities
              type: call
              call: salesforce.query-records
              with:
                q: "SELECT Id,Name,StageName,Amount,CloseDate FROM Opportunity WHERE RecordType.Name = 'Trade Promotion' AND LastModifiedDate = LAST_N_DAYS:1"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "{{dataset_id}}"
                table_name: "{{table_name}}"
                rows: "{{query-opportunities.records}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: rows
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

Retrieves a pending SAP Ariba purchase requisition and submits it for approval, then notifies the requester via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Purchase Requisition Approval"
  description: "Retrieves a pending SAP Ariba purchase requisition and submits it for approval, then notifies the requester via Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-approval
      port: 8080
      tools:
        - name: approve-requisition
          description: "Given an SAP Ariba requisition ID, fetch its details and submit the approval action, then notify the requester in Teams."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba purchase requisition ID."
            - name: approver_comment
              in: body
              type: string
              description: "Optional comment to attach to the approval action."
            - name: requester_teams_upn
              in: body
              type: string
              description: "The Teams UPN of the requisition requester."
          steps:
            - name: get-requisition
              type: call
              call: ariba.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: submit-approval
              type: call
              call: ariba.approve-requisition
              with:
                requisition_id: "{{requisition_id}}"
                comment: "{{approver_comment}}"
            - name: notify-requester
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{requester_teams_upn}}"
                text: "Your requisition {{requisition_id}} ({{get-requisition.description}}, ${{get-requisition.total}}) has been approved. Ariba status: {{submit-approval.status}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
            - name: approve-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates new supplier onboarding by creating a vendor in SAP Ariba, setting up a contract workspace in SharePoint, and notifying procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding Orchestrator"
  description: "Orchestrates new supplier onboarding by creating a vendor in SAP Ariba, setting up a contract workspace in SharePoint, and notifying procurement via Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - sharepoint
    - microsoft-teams
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: procurement-onboarding
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Orchestrate supplier onboarding: create SAP Ariba vendor, set up SharePoint workspace, notify procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "The supplier company name."
            - name: vendor_country
              in: body
              type: string
              description: "The supplier country code."
            - name: category
              in: body
              type: string
              description: "The procurement category."
          steps:
            - name: create-ariba-vendor
              type: call
              call: ariba.create-supplier
              with:
                name: "{{vendor_name}}"
                country: "{{vendor_country}}"
                category: "{{category}}"
            - name: create-contract-workspace
              type: call
              call: sharepoint.create-folder
              with:
                site_id: "procurement"
                folder_path: "Vendors/{{vendor_name}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "procurement-ops"
                text: "New supplier onboarded: {{vendor_name}} ({{vendor_country}}). Ariba ID: {{create-ariba-vendor.supplier_id}}. Category: {{category}}. SharePoint workspace created."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves batch details for a material from SAP, returning batch number, production date, shelf life expiry, and batch status for snack and beverage traceability.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Retrieves batch details for a material from SAP, returning batch number, production date, shelf life expiry, and batch status for snack and beverage traceability."
  tags:
    - manufacturing
    - sap
    - quality
    - traceability
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: get-batch-details
          description: "Look up batch traceability information in SAP. Returns production date, expiry date, and batch status."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number."
          call: sap.get-batch
          with:
            material_number: "{{material_number}}"
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: production_date
              type: string
              mapping: "$.d.MfgDate"
            - name: expiry_date
              type: string
              mapping: "$.d.ShelfLifeExpirationDate"
            - name: batch_status
              type: string
              mapping: "$.d.BatchStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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(Material='{{material_number}}',Batch='{{batch_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET

Retrieves a SAP billing document by number, returning billing type, payer, net value, and billing date.

naftiko: "0.5"
info:
  label: "SAP Billing Document Lookup"
  description: "Retrieves a SAP billing document by number, returning billing type, payer, net value, and billing date."
  tags:
    - finance
    - sap
    - billing
capability:
  exposes:
    - type: mcp
      namespace: billing
      port: 8080
      tools:
        - name: get-billing-document
          description: "Look up a SAP billing document. Returns billing type, payer, net value, and billing date."
          inputParameters:
            - name: billing_document
              in: body
              type: string
              description: "The SAP billing document number."
          call: sap.get-billing-doc
          with:
            billing_document: "{{billing_document}}"
          outputParameters:
            - name: billing_type
              type: string
              mapping: "$.d.BillingDocumentType"
            - name: payer
              type: string
              mapping: "$.d.PayerParty"
            - name: net_value
              type: string
              mapping: "$.d.TotalNetAmount"
            - name: billing_date
              type: string
              mapping: "$.d.BillingDocumentDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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('{{billing_document}}')"
          inputParameters:
            - name: billing_document
              in: path
          operations:
            - name: get-billing-doc
              method: GET

Retrieves a pending SAP Concur expense report and approves it, notifying the submitter via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "Retrieves a pending SAP Concur expense report and approves it, notifying the submitter via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: approve-expense-report
          description: "Given a SAP Concur expense report ID and approver comment, fetch the report, approve it, and notify the submitter via Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to approve."
            - name: approver_comment
              in: body
              type: string
              description: "A comment to attach to the approval action."
          steps:
            - name: get-report
              type: call
              call: concur.get-report
              with:
                report_id: "{{report_id}}"
            - name: approve-report
              type: call
              call: concur.approve-report
              with:
                report_id: "{{report_id}}"
                comment: "{{approver_comment}}"
            - name: notify-submitter
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{get-report.submitter_email}}"
                text: "Your expense report '{{get-report.name}}' (${{get-report.total}}) has been approved. SAP Concur status updated."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET
            - name: approve-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP outbound delivery document by delivery number, returning ship-to party, planned goods issue date, and delivery status.

naftiko: "0.5"
info:
  label: "SAP Delivery Document Lookup"
  description: "Retrieves a SAP outbound delivery document by delivery number, returning ship-to party, planned goods issue date, and delivery status."
  tags:
    - distribution
    - sap
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-delivery-document
          description: "Look up a SAP outbound delivery by number. Returns ship-to party, goods issue date, and status."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: ship_to_party
              type: string
              mapping: "$.d.ShipToParty"
            - name: planned_goods_issue_date
              type: string
              mapping: "$.d.PlannedGoodsIssueDate"
            - name: delivery_status
              type: string
              mapping: "$.d.OverallSDProcessStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Reconciles goods movements by pulling SAP data, validating against warehouse records, and creating discrepancy reports in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Goods Movement Reconciliation"
  description: "Reconciles goods movements by pulling SAP data, validating against warehouse records, and creating discrepancy reports in ServiceNow."
  tags:
    - supply-chain
    - sap
    - servicenow
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: goods-movement
      port: 8080
      tools:
        - name: reconcile-goods-movements
          description: "Reconcile SAP goods movements: pull data, validate warehouse, log discrepancies."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
            - name: movement_date
              in: body
              type: string
              description: "The date in YYYY-MM-DD format."
          steps:
            - name: get-goods-movements
              type: call
              call: sap.get-goods-movements
              with:
                plant: "{{plant_code}}"
                date: "{{movement_date}}"
            - name: get-warehouse-records
              type: call
              call: sap.get-warehouse-inventory
              with:
                plant: "{{plant_code}}"
                date: "{{movement_date}}"
            - name: log-discrepancies
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Goods movement discrepancy: {{plant_code}} on {{movement_date}}"
                description: "Movements: {{get-goods-movements.count}}. Warehouse: {{get-warehouse-records.count}}."
                category: "inventory_reconciliation"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-movements
          path: "/A_MaterialDocumentHeader?$filter=Plant eq '{{plant}}'"
          inputParameters:
            - name: plant
              in: query
            - name: date
              in: query
          operations:
            - name: get-goods-movements
              method: GET
        - name: warehouse
          path: "/WarehouseInventory(Plant='{{plant}}')"
          inputParameters:
            - name: plant
              in: path
          operations:
            - name: get-warehouse-inventory
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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

Queries SAP HANA for real-time sales data by product group, returning total revenue, units sold, and top-selling SKU.

naftiko: "0.5"
info:
  label: "SAP HANA Real-Time Sales Query"
  description: "Queries SAP HANA for real-time sales data by product group, returning total revenue, units sold, and top-selling SKU."
  tags:
    - analytics
    - sap-hana
    - sales
capability:
  exposes:
    - type: mcp
      namespace: real-time-analytics
      port: 8080
      tools:
        - name: get-real-time-sales
          description: "Query SAP HANA for real-time sales by product group. Returns total revenue, units sold, and top SKU."
          inputParameters:
            - name: product_group
              in: body
              type: string
              description: "The product group code, e.g. SNACKS, BEVERAGES."
            - name: date
              in: body
              type: string
              description: "The date in YYYY-MM-DD format."
          call: sap-hana.get-sales-summary
          with:
            product_group: "{{product_group}}"
            date: "{{date}}"
          outputParameters:
            - name: total_revenue
              type: string
              mapping: "$.results[0].total_revenue"
            - name: units_sold
              type: string
              mapping: "$.results[0].units_sold"
            - name: top_sku
              type: string
              mapping: "$.results[0].top_sku"
  consumes:
    - type: http
      namespace: sap-hana
      baseUri: "https://pepsico-hana.sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_hana_token"
      resources:
        - name: sales-summary
          path: "/sales/summary?product_group={{product_group}}&date={{date}}"
          inputParameters:
            - name: product_group
              in: query
            - name: date
              in: query
          operations:
            - name: get-sales-summary
              method: GET

Looks up a SAP vendor invoice by document number and returns its posting status, payment due date, and amount for accounts payable tracking.

naftiko: "0.5"
info:
  label: "SAP Invoice Processing Status"
  description: "Looks up a SAP vendor invoice by document number and returns its posting status, payment due date, and amount for accounts payable tracking."
  tags:
    - finance
    - accounts-payable
    - sap
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: ap-lookup
      port: 8080
      tools:
        - name: get-invoice-status
          description: "Given a SAP invoice document number and fiscal year, return the invoice posting status, payment due date, gross amount, and vendor."
          inputParameters:
            - name: document_number
              in: body
              type: string
              description: "The SAP accounts payable document number."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year of the invoice document (e.g., '2025')."
          call: sap.get-invoice
          with:
            document_number: "{{document_number}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: posting_status
              type: string
              mapping: "$.d.PostingStatus"
            - name: payment_due_date
              type: string
              mapping: "$.d.PaymentDueDate"
            - name: gross_amount
              type: string
              mapping: "$.d.GrossAmount"
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice(DocumentNumber='{{document_number}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: document_number
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-invoice
              method: GET

Retrieves the current stock level for a material from SAP S/4HANA, returning plant, storage location, and available quantity.

naftiko: "0.5"
info:
  label: "SAP Material Stock Level Check"
  description: "Retrieves the current stock level for a material from SAP S/4HANA, returning plant, storage location, and available quantity."
  tags:
    - supply-chain
    - sap
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-material-stock
          description: "Look up current stock levels for a material in SAP S/4HANA. Returns plant, storage location, unrestricted stock, and unit of measure."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: sap.get-material-stock
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: plant
              type: string
              mapping: "$.d.Plant"
            - name: storage_location
              type: string
              mapping: "$.d.StorageLocation"
            - name: available_stock
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
            - name: unit
              type: string
              mapping: "$.d.MaterialBaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-stock
              method: GET

Checks the status of SAP financial period-end close activities and posts a completion summary to the finance leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period-End Close Status Monitor"
  description: "Checks the status of SAP financial period-end close activities and posts a completion summary to the finance leadership Microsoft Teams channel."
  tags:
    - finance
    - period-close
    - sap
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: monitor-period-close
          description: "Given a fiscal period and company code, check the SAP period-end close task status and post a completion percentage digest to the finance Teams channel."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The SAP fiscal period to monitor (e.g., '006/2026' for June 2026)."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code (e.g., 'US01' for PepsiCo US)."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the finance close status report."
          steps:
            - name: get-close-status
              type: call
              call: sap.get-close-tasks
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Period Close Status {{fiscal_period}} ({{company_code}}): {{get-close-status.completed}}/{{get-close-status.total}} tasks complete ({{get-close-status.completion_pct}}%). Open blockers: {{get-close-status.blockers}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/FCO_PI_CLOSE_COCKPIT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: close-tasks
          path: "/ClosingTaskSet"
          inputParameters:
            - name: fiscal_period
              in: query
            - name: company_code
              in: query
          operations:
            - name: get-close-tasks
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP plant maintenance order by order number, returning equipment, functional location, priority, and system status.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Order Lookup"
  description: "Retrieves a SAP plant maintenance order by order number, returning equipment, functional location, priority, and system status."
  tags:
    - manufacturing
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: get-maintenance-order
          description: "Look up a SAP plant maintenance order. Returns equipment ID, functional location, priority, and status."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP maintenance order number."
          call: sap.get-maintenance-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
            - name: functional_location
              type: string
              mapping: "$.d.FunctionalLocation"
            - name: priority
              type: string
              mapping: "$.d.MaintenanceOrderPriority"
            - name: status
              type: string
              mapping: "$.d.MaintenanceOrderSystemStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-maintenance-order
              method: GET

Retrieves the status of a SAP production order including planned quantity, confirmed quantity, and system status for Frito-Lay and beverage manufacturing.

naftiko: "0.5"
info:
  label: "SAP Production Order Status"
  description: "Retrieves the status of a SAP production order including planned quantity, confirmed quantity, and system status for Frito-Lay and beverage manufacturing."
  tags:
    - manufacturing
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP production order by order number. Returns order type, status, planned quantity, and confirmed quantity."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: sap.get-production-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: order_type
              type: string
              mapping: "$.d.ManufacturingOrderType"
            - name: status
              type: string
              mapping: "$.d.SystemStatus"
            - name: planned_qty
              type: string
              mapping: "$.d.MfgOrderPlannedTotalQty"
            - name: confirmed_qty
              type: string
              mapping: "$.d.MfgOrderConfirmedYieldQty"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Retrieves a SAP S/4HANA purchase order by PO number and returns header status, vendor, line items, and total value. Use when an agent needs to verify procurement status.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Retrieves a SAP S/4HANA purchase order by PO number and returns header status, vendor, line items, and total value. Use when an agent needs to verify procurement status."
  tags:
    - finance
    - procurement
    - sap
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: erp-lookup
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, supplier name, total amount, currency, and open line item count."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., '4500012345')."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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

Retrieves a SAP quality inspection lot by number, returning material, plant, inspection result, and usage decision.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves a SAP quality inspection lot by number, returning material, plant, inspection result, and usage decision."
  tags:
    - manufacturing
    - sap
    - quality
capability:
  exposes:
    - type: mcp
      namespace: quality-management
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Look up a SAP quality inspection lot. Returns material, plant, inspection result, and usage decision."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: sap.get-inspection-lot
          with:
            inspection_lot: "{{inspection_lot}}"
          outputParameters:
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: plant
              type: string
              mapping: "$.d.Plant"
            - name: inspection_result
              type: string
              mapping: "$.d.InspectionResult"
            - name: usage_decision
              type: string
              mapping: "$.d.UsageDecision"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{inspection_lot}}')"
          inputParameters:
            - name: inspection_lot
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Verifies a goods receipt posting in SAP S/4HANA for a given purchase order and returns the material document number and posting status.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Goods Receipt Verification"
  description: "Verifies a goods receipt posting in SAP S/4HANA for a given purchase order and returns the material document number and posting status."
  tags:
    - supply-chain
    - sap
    - goods-receipt
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: verify-goods-receipt
          description: "Given a SAP purchase order number, query the materials management module for posted goods receipts and return the material document number and posting date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to verify goods receipt against."
          call: sap.get-goods-receipt
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: material_document
              type: string
              mapping: "$.d.results[0].MaterialDocument"
            - name: posting_date
              type: string
              mapping: "$.d.results[0].PostingDate"
            - name: quantity
              type: string
              mapping: "$.d.results[0].QuantityInPurchaseOrderUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_MaterialDocumentItem"
          inputParameters:
            - name: po_number
              in: query
          operations:
            - name: get-goods-receipt
              method: GET

Retrieves vendor master data from SAP by vendor ID, returning company name, country, payment terms, and purchasing group.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Data Lookup"
  description: "Retrieves vendor master data from SAP by vendor ID, returning company name, country, payment terms, and purchasing group."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: vendor-management
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up SAP vendor master data by vendor ID. Returns company name, country, payment terms."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
          call: sap.get-vendor
          with:
            vendor_id: "{{vendor_id}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.BusinessPartnerFullName"
            - name: country
              type: string
              mapping: "$.d.Country"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_BusinessPartner('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Synchronizes seasonal demand plans by pulling historical data from Snowflake, adjusting SAP MRP parameters, and notifying planners via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Seasonal Demand Planning Sync"
  description: "Synchronizes seasonal demand plans by pulling historical data from Snowflake, adjusting SAP MRP parameters, and notifying planners via Microsoft Teams."
  tags:
    - supply-chain
    - manufacturing
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: seasonal-planning
      port: 8080
      tools:
        - name: sync-seasonal-demand
          description: "Sync seasonal demand: pull Snowflake history, adjust SAP MRP, notify planners."
          inputParameters:
            - name: product_group
              in: body
              type: string
              description: "The product group."
            - name: season
              in: body
              type: string
              description: "The season: spring, summer, fall, winter."
          steps:
            - name: get-historical-sales
              type: call
              call: snowflake.get-seasonal-sales
              with:
                product_group: "{{product_group}}"
                season: "{{season}}"
            - name: update-mrp-parameters
              type: call
              call: sap.update-mrp-forecast
              with:
                product_group: "{{product_group}}"
                forecast_quantity: "{{get-historical-sales.projected_demand}}"
            - name: notify-planners
              type: call
              call: msteams.send-message
              with:
                channel_id: "demand-planning"
                text: "Seasonal demand for {{product_group}} ({{season}}): Avg: {{get-historical-sales.avg_volume}}. Projected: {{get-historical-sales.projected_demand}}. MRP updated."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pepsico.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: seasonal-sales
          path: "/statements"
          operations:
            - name: get-seasonal-sales
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MRP_FORECAST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: mrp-forecast
          path: "/MRPForecast"
          operations:
            - name: update-mrp-forecast
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Submits a ServiceNow change request for a planned infrastructure or application change and notifies the change advisory board via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management Request"
  description: "Submits a ServiceNow change request for a planned infrastructure or application change and notifies the change advisory board via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-ops
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, affected system, planned start, and CAB Teams channel, create a ServiceNow change request and notify the change advisory board in Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the change including scope, justification, and rollback plan."
            - name: affected_system
              in: body
              type: string
              description: "The PepsiCo system or service being changed."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start datetime in ISO 8601 format."
            - name: cab_channel_id
              in: body
              type: string
              description: "Teams channel ID for the change advisory board notification."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Change: {{affected_system}} — {{change_description}}"
                planned_start: "{{planned_start}}"
                category: "application"
            - name: notify-cab
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{cab_channel_id}}"
                text: "Change Request Submitted: {{affected_system}} | CHG: {{create-change.number}} | Planned: {{planned_start}} | Scope: {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

Retrieves metadata for a document from a SharePoint document library, returning file name, modified date, modified by, and file size.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves metadata for a document from a SharePoint document library, returning file name, modified date, modified by, and file size."
  tags:
    - collaboration
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: get-document-metadata
          description: "Retrieve document metadata from SharePoint. Returns file name, last modified date, modified by, and file size."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: file_path
              in: body
              type: string
              description: "The path to the file."
          call: sharepoint.get-file
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.name"
            - name: modified_date
              type: string
              mapping: "$.lastModifiedDateTime"
            - name: modified_by
              type: string
              mapping: "$.lastModifiedBy.user.displayName"
            - name: file_size
              type: string
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET

Orchestrates a snack brand campaign launch by creating the campaign in Salesforce, configuring Google Analytics tracking, and posting the announcement to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snack Brand Marketing Campaign Launch"
  description: "Orchestrates a snack brand campaign launch by creating the campaign in Salesforce, configuring Google Analytics tracking, and posting the announcement to Microsoft Teams."
  tags:
    - marketing
    - brand-management
    - salesforce
    - google-analytics
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: launch-snack-campaign
          description: "Orchestrate snack brand campaign launch across Salesforce, Google Analytics, and Teams."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "The campaign name."
            - name: brand
              in: body
              type: string
              description: "The PepsiCo snack brand, e.g. Lay's, Doritos, Cheetos."
            - name: start_date
              in: body
              type: string
              description: "Campaign start date in YYYY-MM-DD format."
            - name: budget
              in: body
              type: string
              description: "Campaign budget in USD."
          steps:
            - name: create-sf-campaign
              type: call
              call: salesforce.create-campaign
              with:
                name: "{{campaign_name}}"
                brand: "{{brand}}"
                start_date: "{{start_date}}"
                budgeted_cost: "{{budget}}"
            - name: setup-ga-tracking
              type: call
              call: ga.create-custom-dimension
              with:
                campaign_id: "{{create-sf-campaign.id}}"
                campaign_name: "{{campaign_name}}"
            - name: announce-launch
              type: call
              call: msteams.send-message
              with:
                channel_id: "snack-marketing"
                text: "New campaign launched: {{campaign_name}} for {{brand}}. Salesforce ID: {{create-sf-campaign.id}}. Budget: ${{budget}}. Start: {{start_date}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign"
          operations:
            - name: create-campaign
              method: POST
    - type: http
      namespace: ga
      baseUri: "https://analyticsadmin.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: custom-dimensions
          path: "/properties/pepsico/customDimensions"
          operations:
            - name: create-custom-dimension
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Schedules snack production by checking raw material availability in SAP, creating production orders, and notifying the Frito-Lay plant via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snack Production Scheduling"
  description: "Schedules snack production by checking raw material availability in SAP, creating production orders, and notifying the Frito-Lay plant via Microsoft Teams."
  tags:
    - manufacturing
    - supply-chain
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: production-scheduling
      port: 8080
      tools:
        - name: schedule-snack-production
          description: "Schedule snack production: check SAP materials, create order, notify plant."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant_code
              in: body
              type: string
              description: "The Frito-Lay plant code."
            - name: quantity
              in: body
              type: string
              description: "Quantity to produce."
            - name: production_date
              in: body
              type: string
              description: "Target date."
          steps:
            - name: check-materials
              type: call
              call: sap.check-material-availability
              with:
                material_number: "{{material_number}}"
                plant: "{{plant_code}}"
                quantity: "{{quantity}}"
            - name: create-order
              type: call
              call: sap.create-production-order
              with:
                material_number: "{{material_number}}"
                plant: "{{plant_code}}"
                quantity: "{{quantity}}"
                start_date: "{{production_date}}"
            - name: notify-plant
              type: call
              call: msteams.send-message
              with:
                channel_id: "fritolay-plant-{{plant_code}}"
                text: "Production scheduled: {{material_number}}. Qty: {{quantity}}. Date: {{production_date}}. Order: {{create-order.order_number}}. Material status: {{check-materials.availability_status}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: availability
          path: "/MaterialAvailability(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: check-material-availability
              method: GET
        - name: production-orders
          path: "/A_ProductionOrder_2"
          operations:
            - name: create-production-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages snack seasoning formulation changes by updating the SAP recipe master, creating a change request in ServiceNow, and notifying R&D and manufacturing via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snack Seasoning Formulation Change"
  description: "Manages snack seasoning formulation changes by updating the SAP recipe master, creating a change request in ServiceNow, and notifying R&D and manufacturing via Microsoft Teams."
  tags:
    - manufacturing
    - brand-management
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: formulation
      port: 8080
      tools:
        - name: manage-formulation-change
          description: "Manage seasoning formulation change: update SAP recipe, create ServiceNow change request, notify teams."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the seasoning."
            - name: change_description
              in: body
              type: string
              description: "Description of the formulation change."
            - name: effective_date
              in: body
              type: string
              description: "Effective date in YYYY-MM-DD format."
          steps:
            - name: get-current-recipe
              type: call
              call: sap.get-recipe-master
              with:
                material_number: "{{material_number}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "Seasoning formulation change: {{material_number}}"
                description: "{{change_description}}. Current: {{get-current-recipe.description}}. Effective: {{effective_date}}."
                category: "formulation_change"
                assignment_group: "RnD_Formulation"
            - name: notify-stakeholders
              type: call
              call: msteams.send-message
              with:
                channel_id: "rd-formulation"
                text: "Formulation Change: Material {{material_number}}. Change: {{change_description}}. Effective: {{effective_date}}. CR: {{create-change-request.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_RECIPE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: recipes
          path: "/RecipeMaster('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-recipe-master
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the status of a Snowflake data pipeline task, returning execution state, rows processed, and error messages.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Status"
  description: "Checks the status of a Snowflake data pipeline task, returning execution state, rows processed, and error messages."
  tags:
    - analytics
    - snowflake
    - data-pipeline
capability:
  exposes:
    - type: mcp
      namespace: data-platform
      port: 8080
      tools:
        - name: get-pipeline-status
          description: "Check Snowflake data pipeline task status. Returns execution state, rows loaded, and any error messages."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "The Snowflake task name."
          call: snowflake.get-task-status
          with:
            task_name: "{{task_name}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.data[0].state"
            - name: rows_loaded
              type: string
              mapping: "$.data[0].rows_loaded"
            - name: error_message
              type: string
              mapping: "$.data[0].error_message"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pepsico.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: tasks
          path: "/statements"
          operations:
            - name: get-task-status
              method: POST

Monitors Snowflake sales analytics pipelines, checks for failures in Datadog, and creates a ServiceNow incident if errors are detected.

naftiko: "0.5"
info:
  label: "Snowflake Sales Analytics Pipeline Monitor"
  description: "Monitors Snowflake sales analytics pipelines, checks for failures in Datadog, and creates a ServiceNow incident if errors are detected."
  tags:
    - analytics
    - snowflake
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-sales-pipeline
          description: "Monitor Snowflake sales pipeline: check status, verify Datadog metrics, create ServiceNow incident on failure."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "The Snowflake task name."
          steps:
            - name: get-task-status
              type: call
              call: snowflake.get-task-status
              with:
                task_name: "{{task_name}}"
            - name: check-datadog-metrics
              type: call
              call: datadog.get-pipeline-metrics
              with:
                pipeline_name: "{{task_name}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Sales pipeline alert: {{task_name}}"
                description: "State: {{get-task-status.state}}. Rows loaded: {{get-task-status.rows_loaded}}. Error: {{get-task-status.error_message}}."
                category: "data_pipeline"
                assignment_group: "Data_Engineering"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pepsico.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: tasks
          path: "/statements"
          operations:
            - name: get-task-status
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
      resources:
        - name: pipeline-metrics
          path: "/metrics/query?query=pipeline:{{pipeline_name}}"
          inputParameters:
            - name: pipeline_name
              in: query
          operations:
            - name: get-pipeline-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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

Monitors brand sentiment by pulling social data from HubSpot, cross-referencing Google Analytics traffic, and alerting brand management via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Social Media Sentiment Alert"
  description: "Monitors brand sentiment by pulling social data from HubSpot, cross-referencing Google Analytics traffic, and alerting brand management via Microsoft Teams."
  tags:
    - marketing
    - brand-management
    - hubspot
    - google-analytics
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: brand-monitoring
      port: 8080
      tools:
        - name: check-brand-sentiment
          description: "Check brand sentiment: pull HubSpot social data, cross-reference GA, alert brand team."
          inputParameters:
            - name: brand_name
              in: body
              type: string
              description: "The brand, e.g. Lay's, Pepsi, Gatorade."
            - name: date_range
              in: body
              type: string
              description: "Date range."
          steps:
            - name: get-social-sentiment
              type: call
              call: hubspot.get-social-mentions
              with:
                brand: "{{brand_name}}"
                date_range: "{{date_range}}"
            - name: get-web-traffic
              type: call
              call: ga.get-brand-traffic
              with:
                brand_segment: "{{brand_name}}"
                date_range: "{{date_range}}"
            - name: alert-brand-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "brand-{{brand_name}}"
                text: "Sentiment for {{brand_name}}: Mentions: {{get-social-sentiment.mention_count}}. Score: {{get-social-sentiment.sentiment_score}}. Traffic: {{get-web-traffic.page_views}}."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: social-mentions
          path: "/objects/social_mentions/search"
          operations:
            - name: get-social-mentions
              method: POST
    - type: http
      namespace: ga
      baseUri: "https://analyticsreporting.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/reports:batchGet"
          operations:
            - name: get-brand-traffic
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries SAP S/4HANA for materials below their reorder point and posts a restocking alert digest to the supply chain operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Supply Chain Inventory Alert"
  description: "Queries SAP S/4HANA for materials below their reorder point and posts a restocking alert digest to the supply chain operations Microsoft Teams channel."
  tags:
    - supply-chain
    - sap
    - inventory
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-reporting
      port: 8080
      tools:
        - name: alert-low-inventory
          description: "Query SAP for materials at or below their safety stock level within a given plant and post a restocking digest to the supply chain Teams channel."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code to check inventory levels for (e.g., '1000')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the supply chain alert."
          steps:
            - name: get-low-stock
              type: call
              call: sap.get-low-stock-materials
              with:
                plant: "{{plant_code}}"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Inventory Alert — Plant {{plant_code}}: {{get-low-stock.count}} materials below safety stock. Critical items: {{get-low-stock.critical_materials}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: get-low-stock-materials
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a shipment delay is detected, retrieves delivery details from SAP, updates the Salesforce opportunity, and escalates to the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Shipment Delay Escalation"
  description: "When a shipment delay is detected, retrieves delivery details from SAP, updates the Salesforce opportunity, and escalates to the logistics team via Microsoft Teams."
  tags:
    - supply-chain
    - sap
    - salesforce
    - microsoft-teams
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: escalate-shipment-delay
          description: "Orchestrate shipment delay escalation: pull SAP delivery, update Salesforce, notify logistics team."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
            - name: opportunity_id
              in: body
              type: string
              description: "The related Salesforce opportunity ID."
          steps:
            - name: get-delivery
              type: call
              call: sap.get-delivery
              with:
                delivery_number: "{{delivery_number}}"
            - name: update-opportunity
              type: call
              call: salesforce.update-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
                delivery_status: "Delayed"
                notes: "Shipment {{delivery_number}} delayed. Original GI date: {{get-delivery.planned_goods_issue_date}}"
            - name: notify-logistics
              type: call
              call: msteams.send-message
              with:
                channel_id: "logistics-alerts"
                text: "Shipment delay: Delivery {{delivery_number}} to {{get-delivery.ship_to_party}} delayed. Salesforce opportunity {{opportunity_id}} updated."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Aggregates sustainability metrics from SAP plant data, publishes a consolidated ESG report to SharePoint, and notifies the sustainability team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sustainability Reporting Aggregator"
  description: "Aggregates sustainability metrics from SAP plant data, publishes a consolidated ESG report to SharePoint, and notifies the sustainability team via Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: aggregate-sustainability-report
          description: "Aggregate sustainability data from SAP, publish to SharePoint, and notify team."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
            - name: reporting_period
              in: body
              type: string
              description: "The reporting period, e.g. 2026-Q1."
          steps:
            - name: get-energy-data
              type: call
              call: sap.get-plant-energy-consumption
              with:
                plant: "{{plant_code}}"
                period: "{{reporting_period}}"
            - name: get-water-usage
              type: call
              call: sap.get-plant-water-usage
              with:
                plant: "{{plant_code}}"
                period: "{{reporting_period}}"
            - name: upload-report
              type: call
              call: sharepoint.upload-file
              with:
                site_id: "sustainability"
                folder_path: "Reports/{{reporting_period}}"
                file_name: "plant-{{plant_code}}-sustainability.json"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "sustainability"
                text: "Sustainability report for plant {{plant_code}} ({{reporting_period}}): Energy: {{get-energy-data.total_kwh}} kWh. Water: {{get-water-usage.total_liters}} liters."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PLANT_METRICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: energy
          path: "/PlantEnergyConsumption(Plant='{{plant}}',Period='{{period}}')"
          inputParameters:
            - name: plant
              in: path
            - name: period
              in: path
          operations:
            - name: get-plant-energy-consumption
              method: GET
        - name: water
          path: "/PlantWaterUsage(Plant='{{plant}}',Period='{{period}}')"
          inputParameters:
            - name: plant
              in: path
            - name: period
              in: path
          operations:
            - name: get-plant-water-usage
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Calculates trade promotion ROI by pulling spend from SAP, incremental sales from Circana, and posting analysis to Salesforce and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Promotion ROI Calculator"
  description: "Calculates trade promotion ROI by pulling spend from SAP, incremental sales from Circana, and posting analysis to Salesforce and Microsoft Teams."
  tags:
    - marketing
    - finance
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade-promotion-roi
      port: 8080
      tools:
        - name: calculate-promotion-roi
          description: "Calculate trade promotion ROI: pull SAP spend, Circana lift, post to Salesforce and Teams."
          inputParameters:
            - name: promotion_id
              in: body
              type: string
              description: "The Salesforce promotion record ID."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center."
          steps:
            - name: get-promotion-spend
              type: call
              call: sap.get-cost-center-actuals
              with:
                cost_center: "{{cost_center}}"
            - name: get-sales-lift
              type: call
              call: circana.get-promotion-lift
              with:
                promotion_id: "{{promotion_id}}"
            - name: update-sf-promotion
              type: call
              call: salesforce.update-promotion
              with:
                promotion_id: "{{promotion_id}}"
                total_spend: "{{get-promotion-spend.total_actual}}"
                roi_percentage: "{{get-sales-lift.roi}}"
            - name: post-roi-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "trade-marketing"
                text: "Promotion ROI: {{promotion_id}}. Spend: ${{get-promotion-spend.total_actual}}. ROI: {{get-sales-lift.roi}}%."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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}}')/to_Actuals"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: promotion-lift
          path: "/promotions/{{promotion_id}}/lift"
          inputParameters:
            - name: promotion_id
              in: path
          operations:
            - name: get-promotion-lift
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://pepsico.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: promotions
          path: "/sobjects/Promotion__c/{{promotion_id}}"
          inputParameters:
            - name: promotion_id
              in: path
          operations:
            - name: update-promotion
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors weather impacts on Tropicana orange supply by checking SAP inventory levels, assessing supplier risk, and alerting supply chain planners via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tropicana Supply Chain Weather Alert"
  description: "Monitors weather impacts on Tropicana orange supply by checking SAP inventory levels, assessing supplier risk, and alerting supply chain planners via Microsoft Teams."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: weather-risk
      port: 8080
      tools:
        - name: assess-weather-impact
          description: "Assess weather impact on Tropicana supply: check SAP inventory, assess risk, alert planners."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The growing region, e.g. Florida, Brazil."
            - name: severity
              in: body
              type: string
              description: "Weather event severity: low, medium, high."
          steps:
            - name: check-citrus-inventory
              type: call
              call: sap.get-material-stock
              with:
                material_number: "CITRUS-CONCENTRATE"
                plant: "TROPICANA-MAIN"
            - name: create-risk-assessment
              type: call
              call: servicenow.create-task
              with:
                short_description: "Weather risk: {{region}} - {{severity}}"
                description: "Current citrus concentrate stock: {{check-citrus-inventory.available_stock}} {{check-citrus-inventory.unit}}. Weather severity: {{severity}}."
                category: "supply_chain_risk"
                assignment_group: "Tropicana_Supply_Chain"
            - name: alert-planners
              type: call
              call: msteams.send-message
              with:
                channel_id: "tropicana-supply"
                text: "WEATHER ALERT: {{region}} ({{severity}}). Citrus stock: {{check-citrus-inventory.available_stock}} {{check-citrus-inventory.unit}}. Risk assessment: {{create-risk-assessment.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles vendor payments by pulling invoice data from SAP, matching against Concur expense records, and logging discrepancies in ServiceNow.

naftiko: "0.5"
info:
  label: "Vendor Payment Reconciliation"
  description: "Reconciles vendor payments by pulling invoice data from SAP, matching against Concur expense records, and logging discrepancies in ServiceNow."
  tags:
    - finance
    - sap
    - sap-concur
    - servicenow
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: reconcile-vendor-payment
          description: "Reconcile vendor payments across SAP invoices, Concur expenses, and ServiceNow."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
          steps:
            - name: get-sap-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-concur-expense
              type: call
              call: concur.get-expense-report
              with:
                vendor_id: "{{vendor_id}}"
                invoice_reference: "{{invoice_number}}"
            - name: log-discrepancy
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Payment reconciliation: Vendor {{vendor_id}} Invoice {{invoice_number}}"
                description: "SAP amount: {{get-sap-invoice.total_amount}}. Concur expense: {{get-concur-expense.total_amount}}."
                category: "finance_reconciliation"
                assignment_group: "Accounts_Payable"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-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('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports?vendorId={{vendor_id}}&invoiceRef={{invoice_reference}}"
          inputParameters:
            - name: vendor_id
              in: query
            - name: invoice_reference
              in: query
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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

Rebalances warehouse inventory by checking stock levels across plants in SAP, creating stock transfer orders, and logging the rebalance in ServiceNow.

naftiko: "0.5"
info:
  label: "Warehouse Inventory Rebalance"
  description: "Rebalances warehouse inventory by checking stock levels across plants in SAP, creating stock transfer orders, and logging the rebalance in ServiceNow."
  tags:
    - supply-chain
    - distribution
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: rebalance-inventory
          description: "Orchestrate inventory rebalance: check multi-plant stock, create transfer orders, log in ServiceNow."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: source_plant
              in: body
              type: string
              description: "Source plant code."
            - name: target_plant
              in: body
              type: string
              description: "Target plant code."
            - name: quantity
              in: body
              type: string
              description: "Quantity to transfer."
          steps:
            - name: check-source-stock
              type: call
              call: sap.get-material-stock
              with:
                material_number: "{{material_number}}"
                plant: "{{source_plant}}"
            - name: create-transfer-order
              type: call
              call: sap.create-stock-transfer
              with:
                material_number: "{{material_number}}"
                source_plant: "{{source_plant}}"
                target_plant: "{{target_plant}}"
                quantity: "{{quantity}}"
            - name: log-rebalance
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Inventory rebalance: {{material_number}} from {{source_plant}} to {{target_plant}}"
                description: "Transferred {{quantity}} units. Transfer order: {{create-transfer-order.transfer_order_number}}"
                category: "warehouse_operations"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET
        - name: stock-transfers
          path: "/A_StockTransferOrder"
          operations:
            - name: create-stock-transfer
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.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

Monitors plant water usage compliance by pulling SAP consumption data, comparing against limits, and alerting via Microsoft Teams and ServiceNow.

naftiko: "0.5"
info:
  label: "Water Usage Compliance Monitor"
  description: "Monitors plant water usage compliance by pulling SAP consumption data, comparing against limits, and alerting via Microsoft Teams and ServiceNow."
  tags:
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: environmental
      port: 8080
      tools:
        - name: monitor-water-compliance
          description: "Monitor water compliance: pull SAP data, compare limits, alert team."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
            - name: period
              in: body
              type: string
              description: "The monitoring period."
          steps:
            - name: get-water-usage
              type: call
              call: sap.get-plant-water-usage
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: create-compliance-record
              type: call
              call: servicenow.create-task
              with:
                short_description: "Water compliance: Plant {{plant_code}} - {{period}}"
                description: "Usage: {{get-water-usage.total_liters}}L. Limit: {{get-water-usage.permit_limit}}L."
                category: "environmental_compliance"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "environmental"
                text: "Water Usage: Plant {{plant_code}} ({{period}}). Usage: {{get-water-usage.total_liters}}L. Permit: {{get-water-usage.permit_limit}}L."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pepsico-s4.sap.com/sap/opu/odata/sap/API_PLANT_METRICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: water
          path: "/PlantWaterUsage(Plant='{{plant}}',Period='{{period}}')"
          inputParameters:
            - name: plant
              in: path
            - name: period
              in: path
          operations:
            - name: get-plant-water-usage
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the compensation band and pay grade for a given job profile from Workday for use in offer letter generation and budget planning.

naftiko: "0.5"
info:
  label: "Workday Compensation Band Lookup"
  description: "Retrieves the compensation band and pay grade for a given job profile from Workday for use in offer letter generation and budget planning."
  tags:
    - hr
    - compensation
    - workday
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-comp
      port: 8080
      tools:
        - name: get-compensation-band
          description: "Given a Workday job profile ID, return the compensation grade, pay range minimum and maximum, and currency for use in offer generation or headcount budgeting."
          inputParameters:
            - name: job_profile_id
              in: body
              type: string
              description: "The Workday job profile ID to retrieve compensation data for."
          call: workday.get-comp-grade
          with:
            job_profile_id: "{{job_profile_id}}"
          outputParameters:
            - name: grade
              type: string
              mapping: "$.compensationGrade.descriptor"
            - name: pay_min
              type: string
              mapping: "$.compensationGradeProfile.minimumSalary"
            - name: pay_max
              type: string
              mapping: "$.compensationGradeProfile.maximumSalary"
            - name: currency
              type: string
              mapping: "$.compensationGradeProfile.currency"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation-grades
          path: "/pepsico/compensationGrades/{{job_profile_id}}"
          inputParameters:
            - name: job_profile_id
              in: path
          operations:
            - name: get-comp-grade
              method: GET

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

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and manager information."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a PepsiCo employee profile in Workday. Returns full name, department, job title, and manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.descriptor"
            - name: department
              type: string
              mapping: "$.worker.primaryPosition.department"
            - name: job_title
              type: string
              mapping: "$.worker.primaryPosition.jobTitle"
            - name: manager
              type: string
              mapping: "$.worker.primaryPosition.manager.descriptor"
  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: "/pepsico/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Exports current active headcount from Workday grouped by business unit and cost center, then posts a summary to the HR Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot by Business Unit"
  description: "Exports current active headcount from Workday grouped by business unit and cost center, then posts a summary to the HR Microsoft Teams channel."
  tags:
    - hr
    - workforce-planning
    - workday
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Retrieve current active headcount from Workday by business unit and post a formatted summary to the HR leadership Teams channel."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "The snapshot date in YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the HR summary."
          steps:
            - name: export-headcount
              type: call
              call: workday.list-workers
              with:
                status: "active"
                as_of_date: "{{as_of_date}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "PepsiCo Headcount as of {{as_of_date}}: {{export-headcount.total}} active employees across {{export-headcount.bu_count}} business units."
  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: "/pepsico/workers"
          inputParameters:
            - name: status
              in: query
            - name: as_of_date
              in: query
          operations:
            - name: list-workers
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates a performance review cycle in Workday for a given business unit and notifies all managers via Microsoft Teams to complete their reviews.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Trigger"
  description: "Initiates a performance review cycle in Workday for a given business unit and notifies all managers via Microsoft Teams to complete their reviews."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: trigger-review-cycle
          description: "Given a business unit code and review period, initiate a Workday performance review cycle and send a Teams notification to all managers in the BU to begin employee reviews."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "The PepsiCo business unit code for the review cycle (e.g., 'PBNA', 'FLNA')."
            - name: review_period
              in: body
              type: string
              description: "The performance review period label (e.g., 'Q2-2026', 'Annual-2025')."
            - name: due_date
              in: body
              type: string
              description: "The review completion deadline in YYYY-MM-DD format."
            - name: manager_channel_id
              in: body
              type: string
              description: "Teams channel ID for the manager notification."
          steps:
            - name: initiate-review
              type: call
              call: workday.create-review-cycle
              with:
                business_unit: "{{business_unit}}"
                review_period: "{{review_period}}"
                due_date: "{{due_date}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{manager_channel_id}}"
                text: "Performance review cycle '{{review_period}}' has been initiated for {{business_unit}}. Please complete all reviews by {{due_date}}. Workday cycle ID: {{initiate-review.cycle_id}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/pepsico/performanceReviews"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks workforce training compliance by pulling Workday training records, verifying certifications, and creating non-compliance tasks in ServiceNow.

naftiko: "0.5"
info:
  label: "Workforce Training Compliance Check"
  description: "Checks workforce training compliance by pulling Workday training records, verifying certifications, and creating non-compliance tasks in ServiceNow."
  tags:
    - hr
    - manufacturing
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: training-compliance
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Check training compliance: pull Workday records, verify certifications, create ServiceNow tasks."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to check."
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: get-training-records
              type: call
              call: workday.get-training-records
              with:
                department: "{{department}}"
                location: "{{plant_code}}"
            - name: create-compliance-tasks
              type: call
              call: servicenow.create-task
              with:
                short_description: "Training compliance gap: {{department}} at {{plant_code}}"
                description: "Overdue: {{get-training-records.overdue_count}}. Expiring: {{get-training-records.expiring_count}}."
                category: "training_compliance"
                assignment_group: "HR_Training"
            - name: notify-hr
              type: call
              call: msteams.send-message
              with:
                channel_id: "hr-compliance"
                text: "Training Compliance: {{department}} at {{plant_code}}. Total: {{get-training-records.total_employees}}. Compliant: {{get-training-records.compliant_count}}. Overdue: {{get-training-records.overdue_count}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/pepsico/training/records?department={{department}}&location={{location}}"
          inputParameters:
            - name: department
              in: query
            - name: location
              in: query
          operations:
            - name: get-training-records
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pepsico.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST