Kraft Heinz Capabilities

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

Sort
Expand

Uses Anthropic Claude to review and summarize product marketing claims documents retrieved from SharePoint, checking for regulatory compliance language and flagging ambiguous claims.

naftiko: "0.5"
info:
  label: "AI-Assisted Brand Claim Document Review"
  description: "Uses Anthropic Claude to review and summarize product marketing claims documents retrieved from SharePoint, checking for regulatory compliance language and flagging ambiguous claims."
  tags:
    - ai
    - marketing
    - compliance
    - anthropic
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: ai-compliance
      port: 8080
      tools:
        - name: review-brand-claims
          description: "Given a SharePoint document URL for a product marketing claims brief, retrieve the document, send it to Anthropic Claude for compliance review, and write the review summary back to SharePoint. Use before packaging or campaign approvals."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID where the claims document is stored."
            - name: document_path
              in: body
              type: string
              description: "The SharePoint document relative path."
          steps:
            - name: get-document
              type: call
              call: sharepoint.get-document
              with:
                site_id: "{{site_id}}"
                path: "{{document_path}}"
            - name: review-claims
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                content: "Review this product marketing claims document for regulatory compliance. Flag any ambiguous health, nutrition, or comparative claims. Document: {{get-document.content}}"
            - name: write-review
              type: call
              call: sharepoint.create-file
              with:
                site_id: "{{site_id}}"
                filename: "claims-review.md"
                content: "{{review-claims.text}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-document
              method: GET
            - name: create-file
              method: PUT
    - 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

Checks Azure AD group memberships for a user to validate access rights.

naftiko: "0.5"
info:
  label: "Azure AD User Group Membership Check"
  description: "Checks Azure AD group memberships for a user to validate access rights."
  tags:
    - security
    - identity
    - azure-active-directory
    - access
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: check-groups
          description: "List Azure AD group memberships for access validation."
          inputParameters:
            - name: user_upn
              type: string
              description: "User principal name."
          call: azuread.get-member-of
          with:
            upn: "{{user_upn}}"
          outputParameters:
            - name: groups
              type: string
              mapping: "$.value"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: member-of
          path: "/users/memberOf"
          operations:
            - name: get-member-of
              method: GET

Monitors Azure subscriptions for cost anomalies, creates a ServiceNow ticket for investigation, and posts an alert to the cloud FinOps Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Alert"
  description: "Monitors Azure subscriptions for cost anomalies, creates a ServiceNow ticket for investigation, and posts an alert to the cloud FinOps Teams channel."
  tags:
    - cloud
    - finops
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and look-back period, retrieve cost anomalies from Azure Cost Management, open a ServiceNow investigation ticket, and alert the FinOps channel in Teams. Use for scheduled cloud cost governance runs."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to analyze for cost anomalies."
            - name: period_days
              in: body
              type: integer
              description: "Number of days to check for cost anomalies, e.g. 7."
          steps:
            - name: get-cost-anomalies
              type: call
              call: azure-cost.get-anomalies
              with:
                subscription_id: "{{subscription_id}}"
                period_days: "{{period_days}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure cost anomaly in subscription {{subscription_id}}"
                category: "cloud_cost"
                priority: "3"
            - name: post-alert
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure Cost Anomaly: Subscription {{subscription_id}} | SNOW: {{create-ticket.number}} | Period: {{period_days}} days"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: anomalies
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/anomalies"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-anomalies
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Handles releases by checking Azure DevOps pipeline, ServiceNow change, and notifying Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Approval Handler"
  description: "Handles releases by checking Azure DevOps pipeline, ServiceNow change, and notifying Teams."
  tags:
    - operations
    - devops
    - azure-devops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-mgmt
      port: 8080
      tools:
        - name: handle-release
          description: "Handle release approval."
          inputParameters:
            - name: pipeline_id
              type: string
              description: "Pipeline ID."
            - name: change_request
              type: string
              description: "Change request."
          steps:
            - name: get-pipeline
              type: call
              call: azuredevops.get-run
              with:
                pipeline_id: "{{pipeline_id}}"
            - name: validate
              type: call
              call: servicenow.get-change
              with:
                number: "{{change_request}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "releases"
                text: "Release: Pipeline {{pipeline_id}} ({{get-pipeline.status}})"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/kraftheinz"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_token"
      resources:
        - name: pipelines
          path: "/_apis/pipelines"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Monitors brand sentiment from Snowflake, creates Salesforce cases, and alerts brand management via Teams.

naftiko: "0.5"
info:
  label: "Brand Sentiment Monitoring Responder"
  description: "Monitors brand sentiment from Snowflake, creates Salesforce cases, and alerts brand management via Teams."
  tags:
    - marketing
    - social
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: brand-monitoring
      port: 8080
      tools:
        - name: respond-sentiment
          description: "Monitor brand sentiment and respond to negative trends."
          inputParameters:
            - name: brand_name
              type: string
              description: "Brand name."
            - name: threshold
              type: number
              description: "Negative threshold pct."
          steps:
            - name: get-sentiment
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SOCIAL_WH"
                query: "SELECT negative_pct FROM sentiment WHERE brand='{{brand_name}}'"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                Subject: "Sentiment alert: {{brand_name}}"
            - name: alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "brand-mgmt"
                text: "SENTIMENT: {{brand_name}} negative at {{get-sentiment.negative_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Monitors co-manufacturer production by pulling Snowflake output data, comparing against SAP planned orders, and posting status to Teams.

naftiko: "0.5"
info:
  label: "Co-Manufacturer Production Monitoring"
  description: "Monitors co-manufacturer production by pulling Snowflake output data, comparing against SAP planned orders, and posting status to Teams."
  tags:
    - manufacturing
    - supply-chain
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: co-mfg
      port: 8080
      tools:
        - name: monitor-co-mfg
          description: "Monitor co-manufacturer production output against plans."
          inputParameters:
            - name: co_mfg_id
              type: string
              description: "Co-manufacturer identifier."
            - name: period
              type: string
              description: "Production period."
          steps:
            - name: get-output
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MFG_WH"
                query: "SELECT sku, actual_units, planned_units FROM co_mfg_output WHERE mfg_id='{{co_mfg_id}}' AND period='{{period}}'"
            - name: get-orders
              type: call
              call: sap.get-orders
              with:
                supplier: "{{co_mfg_id}}"
                period: "{{period}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "co-manufacturing"
                text: "Co-mfg {{co_mfg_id}} ({{period}}): Actual {{get-output.total_units}} vs planned {{get-orders.planned_units}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: orders
          path: "/data"
          operations:
            - name: get-orders
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Monitors cold chain temperatures from Snowflake IoT data, flags excursions, and creates ServiceNow incidents for out-of-range events.

naftiko: "0.5"
info:
  label: "Cold Chain Temperature Monitoring"
  description: "Monitors cold chain temperatures from Snowflake IoT data, flags excursions, and creates ServiceNow incidents for out-of-range events."
  tags:
    - supply-chain
    - quality
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cold-chain
      port: 8080
      tools:
        - name: monitor-cold-chain
          description: "Monitor cold chain temperature excursions and create incidents."
          inputParameters:
            - name: shipment_id
              type: string
              description: "Shipment tracking ID."
            - name: max_temp
              type: number
              description: "Maximum allowed temperature in Celsius."
          steps:
            - name: get-temps
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "IOT_WH"
                query: "SELECT timestamp, temp_celsius FROM cold_chain WHERE shipment='{{shipment_id}}' AND temp_celsius>{{max_temp}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Cold chain excursion: shipment {{shipment_id}}"
                description: "{{get-temps.excursion_count}} temperature excursions above {{max_temp}}C"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-alerts"
                text: "COLD CHAIN ALERT: Shipment {{shipment_id}} had {{get-temps.excursion_count}} excursions"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Compiles competitive intelligence from Snowflake Circana data, updates Salesforce, and posts digest to Teams.

naftiko: "0.5"
info:
  label: "Competitive Market Intelligence Digest"
  description: "Compiles competitive intelligence from Snowflake Circana data, updates Salesforce, and posts digest to Teams."
  tags:
    - marketing
    - analytics
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: market-intelligence
      port: 8080
      tools:
        - name: generate-digest
          description: "Generate competitive market intelligence digest."
          inputParameters:
            - name: category
              type: string
              description: "Product category."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MARKET_WH"
                query: "SELECT brand, share FROM circana WHERE category='{{category}}'"
            - name: update-sf
              type: call
              call: salesforce.update-report
              with:
                category: "{{category}}"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "market-intel"
                text: "Market digest for {{category}} ready"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Analyzes consumer reviews from Snowflake, creates Jira tasks, and posts summary to Teams.

naftiko: "0.5"
info:
  label: "Consumer Review Analysis Pipeline"
  description: "Analyzes consumer reviews from Snowflake, creates Jira tasks, and posts summary to Teams."
  tags:
    - marketing
    - quality
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consumer-insights
      port: 8080
      tools:
        - name: analyze-reviews
          description: "Analyze consumer reviews for complaint trends."
          inputParameters:
            - name: product_line
              type: string
              description: "Product line."
            - name: period_days
              type: number
              description: "Lookback days."
          steps:
            - name: get-reviews
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "CONSUMER_WH"
                query: "SELECT topic, count FROM reviews WHERE product='{{product_line}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "PROD"
                summary: "Reviews: {{product_line}}"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "insights"
                text: "Review analysis for {{product_line}} complete"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Initiates CM audit from Ariba supplier data, Jira tasks, and SharePoint checklists.

naftiko: "0.5"
info:
  label: "Contract Manufacturer Quality Audit"
  description: "Initiates CM audit from Ariba supplier data, Jira tasks, and SharePoint checklists."
  tags:
    - quality
    - procurement
    - sap
    - jira
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: quality-audit
      port: 8080
      tools:
        - name: initiate-audit
          description: "Start contract manufacturer quality audit."
          inputParameters:
            - name: supplier_id
              type: string
              description: "Supplier ID."
            - name: audit_type
              type: string
              description: "Audit type."
          steps:
            - name: get-supplier
              type: call
              call: ariba.get-supplier
              with:
                supplier_id: "{{supplier_id}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "QAUDIT"
                summary: "CM Audit: {{get-supplier.name}}"
            - name: share-checklist
              type: call
              call: sharepoint.copy-template
              with:
                template: "audit-{{audit_type}}"
                destination: "audits/{{supplier_id}}"
  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: get-supplier
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/drive/items"
          operations:
            - name: search-docs
              method: GET

Handles contractor expiry by checking Okta, Workday dates, and creating ServiceNow tasks.

naftiko: "0.5"
info:
  label: "Contractor Access Expiry Handler"
  description: "Handles contractor expiry by checking Okta, Workday dates, and creating ServiceNow tasks."
  tags:
    - security
    - identity
    - okta
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-lifecycle
      port: 8080
      tools:
        - name: handle-expiry
          description: "Handle contractor access expiry."
          inputParameters:
            - name: contractor_email
              type: string
              description: "Contractor email."
          steps:
            - name: get-okta
              type: call
              call: okta.get-user
              with:
                email: "{{contractor_email}}"
            - name: check-wd
              type: call
              call: workday.get-worker
              with:
                email: "{{contractor_email}}"
            - name: create-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Expiry: {{contractor_email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://kraftheinz.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user
              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: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

Routes complaints to quality by tracing batch in SAP, creating Jira investigation, and updating ServiceNow.

naftiko: "0.5"
info:
  label: "Customer Complaint Quality Investigation"
  description: "Routes complaints to quality by tracing batch in SAP, creating Jira investigation, and updating ServiceNow."
  tags:
    - quality
    - customer-service
    - sap
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: complaint-quality
      port: 8080
      tools:
        - name: route-complaint
          description: "Route customer complaint to quality investigation."
          inputParameters:
            - name: ticket_id
              type: string
              description: "ServiceNow ticket."
            - name: batch_number
              type: string
              description: "Batch number."
            - name: material_number
              type: string
              description: "Material number."
          steps:
            - name: trace
              type: call
              call: sap.get-batch
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: create-inv
              type: call
              call: jira.create-issue
              with:
                project_key: "QUAL"
                summary: "Complaint: batch {{batch_number}}"
            - name: update
              type: call
              call: servicenow.update-incident
              with:
                number: "{{ticket_id}}"
                comment: "Investigation: {{create-inv.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

Analyzes returns from SAP, Snowflake quality data, and creates Jira improvement tasks.

naftiko: "0.5"
info:
  label: "Customer Returns Analysis"
  description: "Analyzes returns from SAP, Snowflake quality data, and creates Jira improvement tasks."
  tags:
    - quality
    - sales
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: returns-analytics
      port: 8080
      tools:
        - name: analyze-returns
          description: "Analyze customer return patterns."
          inputParameters:
            - name: material_number
              type: string
              description: "Material."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-returns
              type: call
              call: sap.get-returns
              with:
                material: "{{material_number}}"
            - name: get-quality
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "QUALITY_WH"
                query: "SELECT reason FROM returns WHERE material='{{material_number}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "QUAL"
                summary: "Returns: {{material_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_RETURNS_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-returns
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

On a Datadog critical monitor trigger for Kraft Heinz digital commerce or manufacturing systems, creates a ServiceNow incident and posts a triage summary to the ops Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Production Monitoring Alert Handler"
  description: "On a Datadog critical monitor trigger for Kraft Heinz digital commerce or manufacturing systems, creates a ServiceNow incident and posts a triage summary to the ops Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog alert ID and monitor name, retrieve event details, open a ServiceNow incident, and post a triage message to the ops Teams channel. Invoke when Datadog fires a critical alert on production systems."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog event or alert ID."
            - name: monitor_name
              in: body
              type: string
              description: "The Datadog monitor name that fired the alert."
          steps:
            - name: get-event
              type: call
              call: datadog.get-event
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Datadog Alert: {{monitor_name}}"
                category: "monitoring"
                priority: "2"
            - name: post-triage
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Datadog Alert: {{monitor_name}} | SNOW: {{create-incident.number}} | Event: {{alert_id}}"
  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: events
          path: "/events/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks production service health in Datadog including error rate, latency, and uptime.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Checks production service health in Datadog including error rate, latency, and uptime."
  tags:
    - operations
    - monitoring
    - datadog
    - performance
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: check-service-health
          description: "Check Datadog for service health metrics."
          inputParameters:
            - name: service_name
              type: string
              description: "Datadog service name."
            - name: time_from
              type: string
              description: "Start timestamp."
          call: datadog.query-metrics
          with:
            query: "avg:trace.errors{service:{{service_name}}}"
            from: "{{time_from}}"
          outputParameters:
            - name: error_rate
              type: string
              mapping: "$.series[0].pointlist[0][1]"
            - name: latency
              type: string
              mapping: "$.series[1].pointlist[0][1]"
  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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Syncs demand forecasts from Snowflake with SAP inventory and creates planned production orders.

naftiko: "0.5"
info:
  label: "Demand Forecast to Production Sync"
  description: "Syncs demand forecasts from Snowflake with SAP inventory and creates planned production orders."
  tags:
    - supply-chain
    - manufacturing
    - snowflake
    - sap
    - planning
capability:
  exposes:
    - type: mcp
      namespace: demand-planning
      port: 8080
      tools:
        - name: sync-demand
          description: "Synchronize demand forecasts with production planning."
          inputParameters:
            - name: category
              type: string
              description: "Product category."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: weeks
              type: number
              description: "Planning weeks."
          steps:
            - name: get-forecast
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "DEMAND_WH"
                query: "SELECT sku, units FROM forecast WHERE category='{{category}}'"
            - name: check-stock
              type: call
              call: sap.get-stock
              with:
                plant: "{{plant_code}}"
                category: "{{category}}"
            - name: create-orders
              type: call
              call: sap.create-planned-order
              with:
                plant: "{{plant_code}}"
                data: "{{get-forecast.data}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-stock
              method: GET
            - name: create-planned-order
              method: POST

Monitors e-commerce pricing from Snowflake, flags MAP violations, creates Salesforce cases, alerts Teams.

naftiko: "0.5"
info:
  label: "Digital Shelf Price Monitor"
  description: "Monitors e-commerce pricing from Snowflake, flags MAP violations, creates Salesforce cases, alerts Teams."
  tags:
    - ecommerce
    - sales
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pricing-ops
      port: 8080
      tools:
        - name: monitor-pricing
          description: "Monitor digital shelf pricing for MAP violations."
          inputParameters:
            - name: brand
              type: string
              description: "Brand name."
            - name: marketplace
              type: string
              description: "Marketplace."
          steps:
            - name: get-prices
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "ECOM_WH"
                query: "SELECT sku, price FROM shelf WHERE brand='{{brand}}'"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                Subject: "MAP violation: {{brand}} on {{marketplace}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "pricing"
                text: "MAP alert: {{brand}} on {{marketplace}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Tracks distributor orders from Salesforce through SAP fulfillment and posts cash collection status to the finance Teams channel.

naftiko: "0.5"
info:
  label: "Distributor Order to Cash Tracker"
  description: "Tracks distributor orders from Salesforce through SAP fulfillment and posts cash collection status to the finance Teams channel."
  tags:
    - sales
    - finance
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: order-to-cash
      port: 8080
      tools:
        - name: track-order-to-cash
          description: "Track distributor order through fulfillment and collection."
          inputParameters:
            - name: order_id
              type: string
              description: "Salesforce order ID."
          steps:
            - name: get-order
              type: call
              call: salesforce.get-order
              with:
                order_id: "{{order_id}}"
            - name: get-fulfillment
              type: call
              call: sap.get-delivery-status
              with:
                order: "{{get-order.sap_reference}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance-ar"
                text: "Order {{order_id}}: Fulfillment {{get-fulfillment.status}}. Invoice: {{get-fulfillment.invoice_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order"
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: "/data"
          operations:
            - name: get-delivery-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Tracks fulfillment from Salesforce order, SAP picking, and updates ServiceNow customer ticket.

naftiko: "0.5"
info:
  label: "E-commerce Order Fulfillment Tracker"
  description: "Tracks fulfillment from Salesforce order, SAP picking, and updates ServiceNow customer ticket."
  tags:
    - ecommerce
    - supply-chain
    - salesforce
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ecom-fulfillment
      port: 8080
      tools:
        - name: track-fulfillment
          description: "Track e-commerce order fulfillment."
          inputParameters:
            - name: order_id
              type: string
              description: "Salesforce order ID."
            - name: ticket_id
              type: string
              description: "ServiceNow ticket."
          steps:
            - name: get-order
              type: call
              call: salesforce.get-order
              with:
                order_id: "{{order_id}}"
            - name: check-picking
              type: call
              call: sap.get-delivery
              with:
                order: "{{get-order.sap_order}}"
            - name: update-ticket
              type: call
              call: servicenow.update-incident
              with:
                number: "{{ticket_id}}"
                comment: "Status: {{get-order.status}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

Generates learning paths from Workday skills, matches with training, and creates Jira development plans.

naftiko: "0.5"
info:
  label: "Employee Learning Path Generator"
  description: "Generates learning paths from Workday skills, matches with training, and creates Jira development plans."
  tags:
    - hr
    - training
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: hr-learning
      port: 8080
      tools:
        - name: generate-path
          description: "Create personalized learning path."
          inputParameters:
            - name: employee_id
              type: string
              description: "Employee ID."
            - name: target_role
              type: string
              description: "Target role."
          steps:
            - name: get-skills
              type: call
              call: workday.get-skills
              with:
                worker_id: "{{employee_id}}"
            - name: create-plan
              type: call
              call: jira.create-issue
              with:
                project_key: "LEARN"
                summary: "Learning: {{target_role}} for {{employee_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: workers
          path: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When an employee termination is recorded in Workday, disables the Microsoft 365 account, clears Okta sessions, and closes all open ServiceNow tickets assigned to the departing employee.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Access Revocation"
  description: "When an employee termination is recorded in Workday, disables the Microsoft 365 account, clears Okta sessions, and closes all open ServiceNow tickets assigned to the departing employee."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID for a terminating employee, disable their Microsoft 365 account, revoke all Okta sessions, and close their open ServiceNow tickets. Invoke on confirmed termination events from Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: disable-m365
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{get-worker.work_email}}"
            - name: revoke-okta-sessions
              type: call
              call: okta.clear-sessions
              with:
                login: "{{get-worker.work_email}}"
            - name: close-snow-tickets
              type: call
              call: servicenow.close-tickets
              with:
                assigned_to: "{{get-worker.work_email}}"
  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: "/kraft-heinz/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://kraft-heinz.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{login}}/sessions"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: clear-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-tickets
              method: PATCH

Verifies allergen declarations by checking SAP BOM ingredients, querying Snowflake allergen database, and creating Jira review tasks for discrepancies.

naftiko: "0.5"
info:
  label: "Food Safety Allergen Verification"
  description: "Verifies allergen declarations by checking SAP BOM ingredients, querying Snowflake allergen database, and creating Jira review tasks for discrepancies."
  tags:
    - quality
    - food-safety
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: food-safety
      port: 8080
      tools:
        - name: verify-allergens
          description: "Verify allergen declarations against BOM and regulatory database."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: market
              type: string
              description: "Target market country code."
          steps:
            - name: get-ingredients
              type: call
              call: sap.get-bom
              with:
                material: "{{material_number}}"
            - name: check-allergens
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FOOD_SAFETY_WH"
                query: "SELECT allergen, status FROM allergen_db WHERE ingredient IN ({{get-ingredients.components}}) AND market='{{market}}'"
            - name: create-review
              type: call
              call: jira.create-issue
              with:
                project_key: "FSAFETY"
                summary: "Allergen verification: {{material_number}} for {{market}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bom
          path: "/data"
          operations:
            - name: get-bom
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a food safety or quality incident is reported via Salesforce Service Cloud, creates a high-priority ServiceNow incident, notifies the quality assurance team, and escalates to the regulatory affairs Teams channel.

naftiko: "0.5"
info:
  label: "Food Safety Incident Triage"
  description: "When a food safety or quality incident is reported via Salesforce Service Cloud, creates a high-priority ServiceNow incident, notifies the quality assurance team, and escalates to the regulatory affairs Teams channel."
  tags:
    - customer-support
    - quality
    - food-safety
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: triage-food-safety-incident
          description: "Given a Salesforce Service Cloud case ID flagged as food safety related, retrieve case details, create a P1 ServiceNow incident, and alert the quality assurance and regulatory affairs Teams channels. Use when a consumer complaint or safety report is escalated."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID for the food safety incident."
            - name: severity
              in: body
              type: string
              description: "Incident severity level: critical, high, or medium."
          steps:
            - name: get-case
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Food Safety Incident: {{get-case.subject}}"
                category: "food_safety"
                priority: "1"
                description: "Salesforce Case {{case_id}}: {{get-case.description}}"
            - name: alert-qa-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_qa_channel_id"
                text: "FOOD SAFETY INCIDENT: {{get-case.subject}} | Severity: {{severity}} | SNOW: {{create-snow-incident.number}} | SF Case: {{case_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraft-heinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

On a GitHub Actions workflow failure on a protected branch, creates a Jira bug and posts a summary alert to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug and posts a summary alert to the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow run ID and repository that failed on a protected branch, create a Jira bug ticket and alert the engineering Teams channel with failure context. Invoke when CI/CD fails on main or release branches."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: workflow_run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID that failed."
            - name: branch
              in: body
              type: string
              description: "The branch where the failure occurred."
          steps:
            - name: get-run
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo_name}}"
                run_id: "{{workflow_run_id}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch}} — Run {{workflow_run_id}}"
                description: "GitHub Actions failed on {{branch}}. Run ID: {{workflow_run_id}}"
            - name: post-alert
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "CI Failure: {{repo_name}} | Branch: {{branch}} | Jira: {{create-jira-bug.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraft-heinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Scans a GitHub repository for critical code vulnerabilities using GitHub Advanced Security and creates Jira issues for each critical finding, notifying the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Code Security Scan and Jira Triage"
  description: "Scans a GitHub repository for critical code vulnerabilities using GitHub Advanced Security and creates Jira issues for each critical finding, notifying the security team via Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-scanning
      port: 8080
      tools:
        - name: scan-and-triage-vulnerabilities
          description: "Given a GitHub repository, retrieve critical and high-severity code scanning alerts from GitHub Advanced Security, create a Jira security tracking issue, and notify the security channel in Teams. Use for weekly vulnerability management."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
          steps:
            - name: get-vulnerabilities
              type: call
              call: github.get-code-scanning-alerts
              with:
                repo: "{{repo_name}}"
            - name: create-jira-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                issuetype: "Security"
                summary: "Security scan: {{get-vulnerabilities.count}} critical findings in {{repo_name}}"
                description: "GitHub Advanced Security found {{get-vulnerabilities.count}} issues in {{repo_name}}."
            - name: notify-security
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Security Scan: {{repo_name}} has {{get-vulnerabilities.count}} critical vulnerabilities. Jira: {{create-jira-issue.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraft-heinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Tracks GMP training compliance by pulling Workday certifications, checking overdue trainings in Snowflake, and creating ServiceNow remediation tasks.

naftiko: "0.5"
info:
  label: "GMP Training Compliance Tracker"
  description: "Tracks GMP training compliance by pulling Workday certifications, checking overdue trainings in Snowflake, and creating ServiceNow remediation tasks."
  tags:
    - quality
    - manufacturing
    - workday
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: gmp-compliance
      port: 8080
      tools:
        - name: track-gmp-compliance
          description: "Track GMP training compliance across the workforce."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: department
              type: string
              description: "Department name."
          steps:
            - name: get-certifications
              type: call
              call: workday.get-certifications
              with:
                plant: "{{plant_code}}"
                department: "{{department}}"
            - name: check-overdue
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "HR_WH"
                query: "SELECT employee_id, training, days_overdue FROM gmp_compliance WHERE plant='{{plant_code}}' AND overdue=true"
            - name: create-remediation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "GMP training overdue: {{plant_code}} {{department}}"
                description: "{{check-overdue.count}} employees with overdue GMP training"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/kraftheinz/certifications"
          operations:
            - name: get-certifications
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

Retrieves web traffic metrics from Google Analytics for a brand website.

naftiko: "0.5"
info:
  label: "Google Analytics Web Traffic Report"
  description: "Retrieves web traffic metrics from Google Analytics for a brand website."
  tags:
    - marketing
    - analytics
    - google-analytics
    - web
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-traffic
          description: "Fetch web traffic data from Google Analytics."
          inputParameters:
            - name: property_id
              type: string
              description: "GA4 property ID."
            - name: date_from
              type: string
              description: "Start date."
            - name: date_to
              type: string
              description: "End date."
          call: ga.run-report
          with:
            property: "{{property_id}}"
            startDate: "{{date_from}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: conversion_rate
              type: string
              mapping: "$.rows[0].metricValues[1].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/runReport"
          operations:
            - name: run-report
              method: POST

Retrieves active employee headcount and salary band data from Workday grouped by department and cost center for finance planning and HR reporting.

naftiko: "0.5"
info:
  label: "Headcount and Payroll Snapshot"
  description: "Retrieves active employee headcount and salary band data from Workday grouped by department and cost center for finance planning and HR reporting."
  tags:
    - hr
    - finance
    - workday
    - headcount
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Return active employee records grouped by department and cost center from Workday, including employment type and salary band data. Use for quarterly headcount planning and budget variance analysis."
          call: workday.get-headcount
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
            - name: total_count
              type: number
              mapping: "$.total"
  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: "/kraft-heinz/workers"
          operations:
            - name: get-headcount
              method: GET

On a high-severity PagerDuty alert for production systems, creates a ServiceNow P1 incident, pages the on-call team, and posts a war-room message to the IT operations Teams channel.

naftiko: "0.5"
info:
  label: "IT Incident Response and PagerDuty Escalation"
  description: "On a high-severity PagerDuty alert for production systems, creates a ServiceNow P1 incident, pages the on-call team, and posts a war-room message to the IT operations Teams channel."
  tags:
    - itsm
    - incident-response
    - pagerduty
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a PagerDuty alert ID and affected service name, create a P1 ServiceNow incident, trigger an on-call PagerDuty page, and open a war-room Teams message. Invoke on critical production alerts."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The PagerDuty alert ID for the critical production alert."
            - name: service_name
              in: body
              type: string
              description: "The name of the affected production service."
            - name: alert_summary
              in: body
              type: string
              description: "A brief description of the alert condition."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                priority: "1"
                short_description: "P1: {{alert_summary}} in {{service_name}}"
                category: "production_outage"
            - name: trigger-page
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1 Incident: {{alert_summary}}"
                service_id: "$secrets.pagerduty_service_id"
                body_details: "SNOW: {{create-snow-incident.number}}"
            - name: open-war-room
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 INCIDENT: {{alert_summary}} | Service: {{service_name}} | SNOW: {{create-snow-incident.number}} | PD: {{trigger-page.incident_key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves Jira project backlog summary with issue counts by priority and status.

naftiko: "0.5"
info:
  label: "Jira Project Backlog Summary"
  description: "Retrieves Jira project backlog summary with issue counts by priority and status."
  tags:
    - project-management
    - operations
    - jira
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: project-ops
      port: 8080
      tools:
        - name: get-backlog
          description: "Get Jira project backlog summary."
          inputParameters:
            - name: project_key
              type: string
              description: "Jira project key."
          call: jira.search-issues
          with:
            jql: "project={{project_key}} AND status!=Done"
          outputParameters:
            - name: total
              type: string
              mapping: "$.total"
            - name: issues
              type: string
              mapping: "$.issues"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves sprint completion metrics from Jira for engineering teams and posts a weekly delivery performance summary to the technology leadership Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity and Delivery Report"
  description: "Retrieves sprint completion metrics from Jira for engineering teams and posts a weekly delivery performance summary to the technology leadership Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira project key and sprint ID, retrieve sprint velocity metrics (completed vs. committed points) and post a delivery summary to the technology leadership Teams channel. Use for weekly engineering stand-ups and sprint retrospectives."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. ENG."
            - name: sprint_id
              in: body
              type: integer
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint
              type: call
              call: jira.get-sprint
              with:
                sprint_id: "{{sprint_id}}"
            - name: post-summary
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_tech_channel_id"
                text: "Sprint {{sprint_id}} ({{project_key}}): {{get-sprint.completed_points}} of {{get-sprint.committed_points}} story points completed."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kraft-heinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{sprint_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Enriches talent pipeline from Workday requisitions, LinkedIn data, and Jira sourcing tasks.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Enrichment"
  description: "Enriches talent pipeline from Workday requisitions, LinkedIn data, and Jira sourcing tasks."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - jira
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: enrich-pipeline
          description: "Enrich talent pipeline."
          inputParameters:
            - name: department
              type: string
              description: "Department."
          steps:
            - name: get-reqs
              type: call
              call: workday.get-positions
              with:
                department: "{{department}}"
            - name: create-tasks
              type: call
              call: jira.create-issue
              with:
                project_key: "RECRUIT"
                summary: "Sourcing: {{department}}"
  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: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Handles line downtime by creating ServiceNow incident, updating SAP status, and alerting operations via Teams.

naftiko: "0.5"
info:
  label: "Manufacturing Line Downtime Handler"
  description: "Handles line downtime by creating ServiceNow incident, updating SAP status, and alerting operations via Teams."
  tags:
    - manufacturing
    - operations
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mfg-ops
      port: 8080
      tools:
        - name: handle-downtime
          description: "Respond to manufacturing line downtime."
          inputParameters:
            - name: production_line
              type: string
              description: "Line ID."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: reason
              type: string
              description: "Downtime reason."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Line down: {{production_line}}"
                urgency: "1"
            - name: update-sap
              type: call
              call: sap.update-status
              with:
                plant: "{{plant_code}}"
                line: "{{production_line}}"
            - name: alert-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "plant-ops"
                text: "LINE DOWN: {{production_line}}. Reason: {{reason}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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: sap
      baseUri: "https://kraftheinz-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: resource
          path: "/data"
          operations:
            - name: update-status
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Coordinates the launch of a new digital marketing campaign by creating tasks in Jira, scheduling posts in LinkedIn Campaign Manager, and notifying the brand team via Teams.

naftiko: "0.5"
info:
  label: "Marketing Campaign Launch Coordinator"
  description: "Coordinates the launch of a new digital marketing campaign by creating tasks in Jira, scheduling posts in LinkedIn Campaign Manager, and notifying the brand team via Teams."
  tags:
    - marketing
    - campaign
    - jira
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: campaign-ops
      port: 8080
      tools:
        - name: launch-marketing-campaign
          description: "Given a campaign name, target launch date, and budget, create a Jira project task for campaign tracking, schedule a LinkedIn sponsored content campaign, and notify the marketing Teams channel. Use for coordinating brand and product launch campaigns."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "The name of the marketing campaign to launch."
            - name: launch_date
              in: body
              type: string
              description: "Planned campaign launch date in YYYY-MM-DD format."
            - name: budget_usd
              in: body
              type: number
              description: "Total campaign budget in USD."
          steps:
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project_key: "MKT"
                issuetype: "Task"
                summary: "Campaign Launch: {{campaign_name}} ({{launch_date}})"
                description: "Budget: ${{budget_usd}} | Launch: {{launch_date}}"
            - name: create-linkedin-campaign
              type: call
              call: linkedin.create-campaign
              with:
                name: "{{campaign_name}}"
                totalBudget: "{{budget_usd}}"
                startDate: "{{launch_date}}"
            - name: notify-marketing
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_marketing_channel_id"
                text: "Campaign '{{campaign_name}}' launched! Jira: {{create-jira-task.key}} | LinkedIn Campaign: {{create-linkedin-campaign.campaign_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kraft-heinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaigns
          path: "/adCampaignsV2"
          operations:
            - name: create-campaign
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Generates media mix reports from Snowflake, refreshes Power BI, and posts summary to Teams.

naftiko: "0.5"
info:
  label: "Media Mix Optimization Report"
  description: "Generates media mix reports from Snowflake, refreshes Power BI, and posts summary to Teams."
  tags:
    - marketing
    - analytics
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: media-planning
      port: 8080
      tools:
        - name: gen-media-report
          description: "Generate media mix optimization report."
          inputParameters:
            - name: brand
              type: string
              description: "Brand."
            - name: date_from
              type: string
              description: "Start."
            - name: date_to
              type: string
              description: "End."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MARKETING_WH"
                query: "SELECT channel, roas FROM media WHERE brand='{{brand}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "media-mix"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "media"
                text: "Media report for {{brand}} ready"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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"
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Retrieves Meta Ads campaign performance metrics for a campaign and date range.

naftiko: "0.5"
info:
  label: "Meta Ad Campaign Performance Lookup"
  description: "Retrieves Meta Ads campaign performance metrics for a campaign and date range."
  tags:
    - marketing
    - social
    - meta
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: social-ads
      port: 8080
      tools:
        - name: get-campaign-insights
          description: "Fetch Meta Ads campaign insights."
          inputParameters:
            - name: campaign_id
              type: string
              description: "Meta campaign ID."
            - name: date_from
              type: string
              description: "Start date."
            - name: date_to
              type: string
              description: "End date."
          call: meta.get-insights
          with:
            campaign_id: "{{campaign_id}}"
            since: "{{date_from}}"
          outputParameters:
            - name: impressions
              type: string
              mapping: "$.data[0].impressions"
            - name: spend
              type: string
              mapping: "$.data[0].spend"
  consumes:
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_token"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: get-insights
              method: GET

Retrieves Facebook and Instagram campaign performance metrics from Meta Graph API and posts a weekly brand performance digest to the social media marketing Teams channel.

naftiko: "0.5"
info:
  label: "Meta Social Campaign Performance Digest"
  description: "Retrieves Facebook and Instagram campaign performance metrics from Meta Graph API and posts a weekly brand performance digest to the social media marketing Teams channel."
  tags:
    - marketing
    - social
    - meta
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-analytics
      port: 8080
      tools:
        - name: digest-meta-campaign-performance
          description: "Given a Meta ad account ID and date range, retrieve campaign impressions, clicks, and ROAS from Meta Graph API and post a performance digest to the social media Teams channel. Use for weekly brand performance reviews."
          inputParameters:
            - name: ad_account_id
              in: body
              type: string
              description: "The Meta ad account ID in act_XXXXXXXXX format."
            - name: start_date
              in: body
              type: string
              description: "Reporting period start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Reporting period end date in YYYY-MM-DD format."
          steps:
            - name: get-campaign-insights
              type: call
              call: meta.get-ad-insights
              with:
                ad_account_id: "{{ad_account_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_social_channel_id"
                text: "Meta Campaign Digest {{start_date}}-{{end_date}}: {{get-campaign-insights.impressions}} impressions | {{get-campaign-insights.clicks}} clicks"
  consumes:
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_access_token"
      resources:
        - name: ad-insights
          path: "/{{ad_account_id}}/insights"
          inputParameters:
            - name: ad_account_id
              in: path
          operations:
            - name: get-ad-insights
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new hire is confirmed in Workday, opens a ServiceNow onboarding ticket, provisions an Azure Active Directory account via Microsoft Graph, and sends a Teams welcome message to the new employee.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new hire is confirmed in Workday, opens a ServiceNow onboarding ticket, provisions an Azure Active Directory account via Microsoft Graph, and sends a Teams welcome message to the new employee."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
    - microsoft-365
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 onboarding sequence: open a ServiceNow IT ticket, provision a Microsoft 365 account, and send a Teams welcome message. Invoke when a new hire record is activated in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-aad
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                userPrincipalName: "{{get-worker.work_email}}"
                mailNickname: "{{get-worker.preferred_name}}"
            - name: send-welcome
              type: call
              call: msteams.post-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Kraft Heinz, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-snow-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kraft-heinz/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: post-message
              method: POST

Orchestrates NPD gate reviews by pulling project status from Jira, financial projections from Snowflake, and posting review summary to Teams.

naftiko: "0.5"
info:
  label: "New Product Development Gate Review"
  description: "Orchestrates NPD gate reviews by pulling project status from Jira, financial projections from Snowflake, and posting review summary to Teams."
  tags:
    - r-and-d
    - innovation
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: npd-gates
      port: 8080
      tools:
        - name: conduct-gate-review
          description: "Conduct NPD gate review by gathering project status and financials."
          inputParameters:
            - name: project_key
              type: string
              description: "Jira project key for NPD."
            - name: gate_number
              type: number
              description: "Gate review number."
          steps:
            - name: get-project-status
              type: call
              call: jira.get-issue
              with:
                issue_key: "{{project_key}}"
            - name: get-financials
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT npv, roi_pct, payback_months FROM npd_financials WHERE project='{{project_key}}'"
            - name: post-review
              type: call
              call: msteams.send-message
              with:
                channel_id: "npd-reviews"
                text: "Gate {{gate_number}} review for {{project_key}}: NPV ${{get-financials.npv}}, ROI {{get-financials.roi_pct}}%"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: get-issue
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Onboards new SKU by creating SAP material, Salesforce product, and notifying supply chain via Teams.

naftiko: "0.5"
info:
  label: "New SKU Onboarding Workflow"
  description: "Onboards new SKU by creating SAP material, Salesforce product, and notifying supply chain via Teams."
  tags:
    - supply-chain
    - sales
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sku-management
      port: 8080
      tools:
        - name: onboard-sku
          description: "Orchestrate new SKU onboarding."
          inputParameters:
            - name: sku_name
              type: string
              description: "Product name."
            - name: category
              type: string
              description: "Category."
            - name: unit_cost
              type: number
              description: "Unit cost."
          steps:
            - name: create-material
              type: call
              call: sap.create-material
              with:
                description: "{{sku_name}}"
                group: "{{category}}"
            - name: create-product
              type: call
              call: salesforce.create-product
              with:
                Name: "{{sku_name}}"
                ProductCode: "{{create-material.number}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain"
                text: "New SKU: {{sku_name}} ({{create-material.number}})"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: create-material
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Checks nutrition label compliance by pulling recipe data from SAP, validating against regulatory requirements in Snowflake, and creating Jira tasks.

naftiko: "0.5"
info:
  label: "Nutrition Label Compliance Check"
  description: "Checks nutrition label compliance by pulling recipe data from SAP, validating against regulatory requirements in Snowflake, and creating Jira tasks."
  tags:
    - quality
    - regulatory
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: label-compliance
      port: 8080
      tools:
        - name: check-nutrition-label
          description: "Check nutrition label compliance against regulations."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: target_market
              type: string
              description: "Target market country code."
          steps:
            - name: get-recipe
              type: call
              call: sap.get-recipe
              with:
                material: "{{material_number}}"
            - name: check-regs
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "REGULATORY_WH"
                query: "SELECT requirement, compliant FROM label_regs WHERE market='{{target_market}}' AND material='{{material_number}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "REGULATORY"
                summary: "Label compliance: {{material_number}} for {{target_market}}"
                description: "Non-compliant items: {{check-regs.non_compliant_count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: "/data"
          operations:
            - name: get-recipe
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Audits privileged Okta accounts against Workday employment, creating ServiceNow review tasks.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Audit"
  description: "Audits privileged Okta accounts against Workday employment, creating ServiceNow review tasks."
  tags:
    - security
    - identity
    - okta
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: security-audit
      port: 8080
      tools:
        - name: audit-access
          description: "Audit privileged access."
          inputParameters:
            - name: role_type
              type: string
              description: "Okta admin role type."
          steps:
            - name: get-admins
              type: call
              call: okta.list-admins
              with:
                role_type: "{{role_type}}"
            - name: check-employment
              type: call
              call: workday.get-active
              with:
                emails: "{{get-admins.emails}}"
            - name: create-review
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Access audit: {{role_type}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://kraftheinz.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user
              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: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

When an employee's role changes in Workday, updates their Okta group memberships to reflect the new role's access entitlements and notifies the IT security team.

naftiko: "0.5"
info:
  label: "Okta Role-Based Access Provisioning"
  description: "When an employee's role changes in Workday, updates their Okta group memberships to reflect the new role's access entitlements and notifies the IT security team."
  tags:
    - identity
    - security
    - hr
    - okta
    - workday
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: sync-role-access
          description: "Given a Workday employee ID and new job profile, update the employee's Okta group memberships to reflect the new role's access entitlements. Notify the security team in Teams. Invoke on Workday role change events."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role changed."
            - name: new_role
              in: body
              type: string
              description: "The new job profile or role name as defined in Workday."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: get-okta-user
              type: call
              call: okta.get-user
              with:
                login: "{{get-worker.work_email}}"
            - name: update-groups
              type: call
              call: okta.add-user-to-group
              with:
                user_id: "{{get-okta-user.id}}"
                profile: "{{new_role}}"
  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: "/kraft-heinz/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://kraft-heinz.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET
        - name: user-groups
          path: "/groups/{{group_id}}/users/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT

Checks packaging sustainability from SAP BOM, Snowflake compliance data, and creates Jira tasks.

naftiko: "0.5"
info:
  label: "Packaging Sustainability Compliance Check"
  description: "Checks packaging sustainability from SAP BOM, Snowflake compliance data, and creates Jira tasks."
  tags:
    - sustainability
    - quality
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: check-packaging
          description: "Verify packaging sustainability compliance."
          inputParameters:
            - name: material_number
              type: string
              description: "Material number."
            - name: plant_code
              type: string
              description: "Plant code."
          steps:
            - name: get-bom
              type: call
              call: sap.get-bom
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: check
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SUSTAINABILITY_WH"
                query: "SELECT recyclable_pct FROM packaging WHERE material IN ({{get-bom.components}})"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SUSTAIN"
                summary: "Packaging: {{material_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-bom
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Monitors plant energy from Snowflake IoT data, creates ServiceNow tasks, and alerts via Teams.

naftiko: "0.5"
info:
  label: "Plant Energy Consumption Monitor"
  description: "Monitors plant energy from Snowflake IoT data, creates ServiceNow tasks, and alerts via Teams."
  tags:
    - manufacturing
    - sustainability
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: energy-monitoring
      port: 8080
      tools:
        - name: monitor-energy
          description: "Monitor plant energy against targets."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: date
              type: string
              description: "Date."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "IOT_WH"
                query: "SELECT kwh FROM energy WHERE plant='{{plant_code}}'"
            - name: create-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Energy anomaly: {{plant_code}}"
            - name: alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "sustainability"
                text: "Energy alert: {{plant_code}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Generates maintenance reports from SAP orders, Snowflake equipment history, and posts to Teams.

naftiko: "0.5"
info:
  label: "Plant Maintenance Schedule Report"
  description: "Generates maintenance reports from SAP orders, Snowflake equipment history, and posts to Teams."
  tags:
    - manufacturing
    - operations
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: maintenance-reporting
      port: 8080
      tools:
        - name: gen-schedule
          description: "Generate maintenance schedule report."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: weeks
              type: number
              description: "Weeks ahead."
          steps:
            - name: get-orders
              type: call
              call: sap.get-orders
              with:
                plant: "{{plant_code}}"
            - name: get-history
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MFG_WH"
                query: "SELECT mtbf FROM equipment WHERE plant='{{plant_code}}'"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "maintenance"
                text: "Maintenance for {{plant_code}}: {{get-orders.count}} orders"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-orders
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Checks Power BI dataset refresh status and returns last refresh time.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks Power BI dataset refresh status and returns last refresh time."
  tags:
    - analytics
    - reporting
    - power-bi
    - data
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: check-refresh
          description: "Check Power BI dataset refresh status."
          inputParameters:
            - name: dataset_id
              type: string
              description: "Power BI dataset ID."
          call: powerbi.get-refresh
          with:
            datasetId: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST

Triggers a Power BI dataset refresh for the trade spend and promotional analytics workspace and notifies the commercial finance team via Teams on completion.

naftiko: "0.5"
info:
  label: "Power BI Trade Spend Analytics Refresh"
  description: "Triggers a Power BI dataset refresh for the trade spend and promotional analytics workspace and notifies the commercial finance team via Teams on completion."
  tags:
    - finance
    - analytics
    - power-bi
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade-analytics
      port: 8080
      tools:
        - name: refresh-trade-spend-report
          description: "Trigger a Power BI dataset refresh for the trade spend analytics workspace and dataset, then post a completion notification to the commercial finance Teams channel. Use at the start of each promotional planning cycle or on demand."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the trade spend dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.trigger-refresh
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Trade Spend dataset {{dataset_id}} refresh triggered. Refresh ID: {{trigger-refresh.refresh_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Reviews private label contracts by pulling data from Salesforce, checking pricing in SAP, and creating Jira approval tasks.

naftiko: "0.5"
info:
  label: "Private Label Contract Review Workflow"
  description: "Reviews private label contracts by pulling data from Salesforce, checking pricing in SAP, and creating Jira approval tasks."
  tags:
    - sales
    - procurement
    - salesforce
    - sap
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-mgmt
      port: 8080
      tools:
        - name: review-pl-contract
          description: "Review a private label contract across CRM, ERP, and project systems."
          inputParameters:
            - name: contract_id
              type: string
              description: "Salesforce contract ID."
          steps:
            - name: get-contract
              type: call
              call: salesforce.get-contract
              with:
                contract_id: "{{contract_id}}"
            - name: check-pricing
              type: call
              call: sap.get-pricing
              with:
                customer: "{{get-contract.customer_id}}"
                materials: "{{get-contract.product_list}}"
            - name: create-approval
              type: call
              call: jira.create-issue
              with:
                project_key: "CONTRACTS"
                summary: "PL Contract Review: {{get-contract.customer_name}}"
                description: "Contract value: {{get-contract.total_value}}. Margin: {{check-pricing.margin_pct}}%"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/sobjects/Contract"
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pricing
          path: "/data"
          operations:
            - name: get-pricing
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Analyzes costing variances between SAP standard and Snowflake actual costs, creating Jira reviews.

naftiko: "0.5"
info:
  label: "Product Costing Variance Analyzer"
  description: "Analyzes costing variances between SAP standard and Snowflake actual costs, creating Jira reviews."
  tags:
    - finance
    - manufacturing
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: cost-analytics
      port: 8080
      tools:
        - name: analyze-variance
          description: "Analyze product costing variances."
          inputParameters:
            - name: material_number
              type: string
              description: "Material number."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-standard
              type: call
              call: sap.get-cost
              with:
                material: "{{material_number}}"
            - name: get-actual
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT actual_cost FROM costs WHERE material='{{material_number}}'"
            - name: create-review
              type: call
              call: jira.create-issue
              with:
                project_key: "FIN"
                summary: "Variance: {{material_number}} ({{period}})"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-cost
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Traces affected batch in SAP, creates ServiceNow incident, and alerts quality team via Teams.

naftiko: "0.5"
info:
  label: "Product Recall Investigation Orchestrator"
  description: "Traces affected batch in SAP, creates ServiceNow incident, and alerts quality team via Teams."
  tags:
    - quality
    - supply-chain
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: investigate-recall
          description: "Orchestrate product recall investigation."
          inputParameters:
            - name: batch_number
              type: string
              description: "Batch number."
            - name: material_number
              type: string
              description: "Material number."
            - name: severity
              type: string
              description: "Severity level."
          steps:
            - name: trace-batch
              type: call
              call: sap.get-batch-details
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Recall: batch {{batch_number}}"
                urgency: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-alerts"
                text: "RECALL: Batch {{batch_number}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-batch-details
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Monitors product shelf life by checking SAP batch expiry dates, identifying at-risk inventory in Snowflake, and alerting supply chain via Teams.

naftiko: "0.5"
info:
  label: "Product Shelf Life Monitoring"
  description: "Monitors product shelf life by checking SAP batch expiry dates, identifying at-risk inventory in Snowflake, and alerting supply chain via Teams."
  tags:
    - quality
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: shelf-life
      port: 8080
      tools:
        - name: monitor-shelf-life
          description: "Monitor product shelf life and alert on expiring inventory."
          inputParameters:
            - name: plant_code
              type: string
              description: "SAP plant code."
            - name: days_threshold
              type: number
              description: "Days until expiry threshold."
          steps:
            - name: get-expiring
              type: call
              call: sap.get-expiring-batches
              with:
                plant: "{{plant_code}}"
                threshold: "{{days_threshold}}"
            - name: get-inventory-value
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "SELECT sum(value) FROM inventory WHERE plant='{{plant_code}}' AND days_to_expiry<={{days_threshold}}"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain"
                text: "Shelf life alert: {{get-expiring.count}} batches expiring within {{days_threshold}} days at {{plant_code}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: "/data"
          operations:
            - name: get-expiring-batches
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Releases production batch after QA by checking SAP inspection, updating status, and notifying logistics via Teams.

naftiko: "0.5"
info:
  label: "Production Batch Release Workflow"
  description: "Releases production batch after QA by checking SAP inspection, updating status, and notifying logistics via Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: batch-release
      port: 8080
      tools:
        - name: release-batch
          description: "Release production batch after QA."
          inputParameters:
            - name: batch_number
              type: string
              description: "Batch number."
            - name: material_number
              type: string
              description: "Material number."
          steps:
            - name: check-qa
              type: call
              call: sap.get-inspection
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: release
              type: call
              call: sap.update-batch
              with:
                batch: "{{batch_number}}"
                status: "RELEASED"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "logistics"
                text: "Batch {{batch_number}} released. QA: {{check-qa.decision}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-inspection
              method: GET
            - name: update-batch
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Optimizes scheduling from Snowflake demand, SAP capacity, and Jira schedule proposals.

naftiko: "0.5"
info:
  label: "Production Scheduling Optimizer"
  description: "Optimizes scheduling from Snowflake demand, SAP capacity, and Jira schedule proposals."
  tags:
    - manufacturing
    - supply-chain
    - snowflake
    - sap
    - jira
capability:
  exposes:
    - type: mcp
      namespace: production-planning
      port: 8080
      tools:
        - name: optimize-schedule
          description: "Optimize production scheduling."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-demand
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "DEMAND_WH"
                query: "SELECT sku, units FROM demand WHERE plant='{{plant_code}}'"
            - name: get-capacity
              type: call
              call: sap.get-capacity
              with:
                plant: "{{plant_code}}"
            - name: create-schedule
              type: call
              call: jira.create-issue
              with:
                project_key: "PROD"
                summary: "Schedule: {{plant_code}} {{period}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: resource
          path: "/data"
          operations:
            - name: get-capacity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Analyzes yield from SAP planned vs actual, Snowflake waste trends, and creates Jira improvement tasks.

naftiko: "0.5"
info:
  label: "Production Yield Analysis"
  description: "Analyzes yield from SAP planned vs actual, Snowflake waste trends, and creates Jira improvement tasks."
  tags:
    - manufacturing
    - quality
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: production-analytics
      port: 8080
      tools:
        - name: analyze-yield
          description: "Analyze production yield."
          inputParameters:
            - name: line
              type: string
              description: "Production line."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-yield
              type: call
              call: sap.get-confirmations
              with:
                plant: "{{plant_code}}"
                line: "{{line}}"
            - name: get-waste
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MFG_WH"
                query: "SELECT waste_pct FROM waste WHERE line='{{line}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "MFG"
                summary: "Yield: {{line}} ({{period}})"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: resource
          path: "/data"
          operations:
            - name: get-confirmations
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Handles shortages by checking SAP stock, identifying affected orders, and creating Ariba procurement requests.

naftiko: "0.5"
info:
  label: "Raw Material Shortage Alert Handler"
  description: "Handles shortages by checking SAP stock, identifying affected orders, and creating Ariba procurement requests."
  tags:
    - supply-chain
    - procurement
    - sap
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: supply-ops
      port: 8080
      tools:
        - name: handle-shortage
          description: "Handle raw material shortage."
          inputParameters:
            - name: material_number
              type: string
              description: "Material number."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: reorder_qty
              type: number
              description: "Reorder quantity."
          steps:
            - name: check-stock
              type: call
              call: sap.get-stock
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: get-orders
              type: call
              call: sap.get-orders
              with:
                material: "{{material_number}}"
            - name: create-req
              type: call
              call: ariba.create-requisition
              with:
                material: "{{material_number}}"
                quantity: "{{reorder_qty}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-stock
              method: GET
            - name: get-orders
              method: GET
    - 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: get-supplier
              method: GET

Tracks regulatory compliance from Jira submissions, SharePoint docs, and Power BI dashboard.

naftiko: "0.5"
info:
  label: "Regulatory Document Compliance Tracker"
  description: "Tracks regulatory compliance from Jira submissions, SharePoint docs, and Power BI dashboard."
  tags:
    - regulatory
    - quality
    - jira
    - sharepoint
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: track-compliance
          description: "Track regulatory submission status."
          inputParameters:
            - name: submission_id
              type: string
              description: "Jira submission key."
          steps:
            - name: get-status
              type: call
              call: jira.get-issue
              with:
                issue_key: "{{submission_id}}"
            - name: check-docs
              type: call
              call: sharepoint.list-folder
              with:
                folder: "{{submission_id}}"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "regulatory-tracker"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/drive/items"
          operations:
            - name: search-docs
              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"
          operations:
            - name: refresh-dataset
              method: POST

Audits planogram compliance from Salesforce visits, Snowflake metrics, and Jira follow-ups.

naftiko: "0.5"
info:
  label: "Retail Planogram Compliance Audit"
  description: "Audits planogram compliance from Salesforce visits, Snowflake metrics, and Jira follow-ups."
  tags:
    - sales
    - retail
    - salesforce
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: retail-compliance
      port: 8080
      tools:
        - name: audit-planogram
          description: "Audit planogram compliance."
          inputParameters:
            - name: region
              type: string
              description: "Region."
            - name: audit_week
              type: string
              description: "Audit week."
          steps:
            - name: get-visits
              type: call
              call: salesforce.get-visits
              with:
                region: "{{region}}"
            - name: get-compliance
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "RETAIL_WH"
                query: "SELECT score FROM planogram WHERE region='{{region}}'"
            - name: create-followup
              type: call
              call: jira.create-issue
              with:
                project_key: "RETAIL"
                summary: "Planogram: {{region}} week {{audit_week}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Orchestrates shelf audits from Salesforce data, Snowflake compliance, and Jira follow-ups.

naftiko: "0.5"
info:
  label: "Retail Shelf Audit Orchestrator"
  description: "Orchestrates shelf audits from Salesforce data, Snowflake compliance, and Jira follow-ups."
  tags:
    - sales
    - retail
    - salesforce
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: retail-ops
      port: 8080
      tools:
        - name: run-audit
          description: "Orchestrate retail shelf audit."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce account ID."
            - name: audit_period
              type: string
              description: "Period."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-compliance
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "RETAIL_WH"
                query: "SELECT score FROM audit WHERE account='{{account_id}}'"
            - name: create-followup
              type: call
              call: jira.create-issue
              with:
                project_key: "RETAIL"
                summary: "Audit: {{get-account.name}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Generates a weekly digest of Kraft Heinz's key retail and foodservice accounts from Salesforce CRM, including open opportunities and recent activity, then posts the summary to the sales leadership Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Health Digest"
  description: "Generates a weekly digest of Kraft Heinz's key retail and foodservice accounts from Salesforce CRM, including open opportunities and recent activity, then posts the summary to the sales leadership Teams channel."
  tags:
    - sales
    - crm
    - reporting
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-reporting
      port: 8080
      tools:
        - name: digest-account-health
          description: "Query Salesforce for accounts with recent activity and open opportunities, then post a formatted account health digest to the sales leadership Teams channel. Use for weekly pipeline reviews and customer health monitoring."
          inputParameters:
            - name: days_back
              in: body
              type: integer
              description: "Number of days of activity to include, e.g. 7 for a weekly digest."
          steps:
            - name: get-accounts
              type: call
              call: salesforce.query-accounts
              with:
                days_back: "{{days_back}}"
            - name: post-digest
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "Weekly Account Digest (last {{days_back}} days): {{get-accounts.count}} active accounts with open opportunities."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraft-heinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/query"
          operations:
            - name: query-accounts
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the sales opportunity pipeline from Salesforce for a business unit.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Lookup"
  description: "Retrieves the sales opportunity pipeline from Salesforce for a business unit."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: crm-sales
      port: 8080
      tools:
        - name: get-pipeline
          description: "Look up Salesforce opportunity pipeline by business unit."
          inputParameters:
            - name: business_unit
              type: string
              description: "Business unit name."
          call: salesforce.get-pipeline
          with:
            bu: "{{business_unit}}"
          outputParameters:
            - name: total_value
              type: string
              mapping: "$.totalSize"
            - name: opportunities
              type: string
              mapping: "$.records"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

When a Salesforce opportunity closes as Won, creates a corresponding SAP S/4HANA sales order and notifies the account team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Sales Order Sync"
  description: "When a Salesforce opportunity closes as Won, creates a corresponding SAP S/4HANA sales order and notifies the account team in Microsoft Teams."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-erp-sync
      port: 8080
      tools:
        - name: sync-opportunity-to-order
          description: "Given a Salesforce opportunity ID for a Closed Won deal, retrieve account and opportunity data, create a SAP S/4HANA sales order, and notify the account team in Teams. Use when a deal is marked Closed Won in Salesforce."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The 18-character Salesforce opportunity record ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-order
              type: call
              call: sap.create-sales-order
              with:
                customer_id: "{{get-opportunity.account_sap_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency_code}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "SAP Order {{create-sap-order.order_number}} created for opportunity {{opportunity_id}} ({{get-opportunity.name}})."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraft-heinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kraft-heinz-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a supplier invoice is submitted in SAP Ariba, validates it against the matching SAP S/4HANA purchase order and routes exceptions to the accounts payable team via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Invoice Validation and Routing"
  description: "When a supplier invoice is submitted in SAP Ariba, validates it against the matching SAP S/4HANA purchase order and routes exceptions to the accounts payable team via Teams."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap
    - invoice
    - approval
capability:
  exposes:
    - type: mcp
      namespace: invoice-ops
      port: 8080
      tools:
        - name: validate-and-route-invoice
          description: "Given an Ariba invoice ID and associated PO number, retrieve invoice details from SAP Ariba, compare with the SAP S/4HANA PO, and alert the AP team via Teams if discrepancies exceed tolerance. Use for three-way match validation."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice document ID."
            - name: po_number
              in: body
              type: string
              description: "The associated SAP purchase order number."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: notify-ap
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ap_channel_id"
                text: "Invoice {{invoice_id}} requires review. Invoiced: {{get-invoice.total_amount}} | PO Amount: {{get-po.total_value}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kraft-heinz-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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves supplier performance scores from SAP Ariba Supplier Risk, cross-references with open POs in SAP S/4HANA, and escalates high-risk suppliers to the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Risk Assessment"
  description: "Retrieves supplier performance scores from SAP Ariba Supplier Risk, cross-references with open POs in SAP S/4HANA, and escalates high-risk suppliers to the procurement team via Teams."
  tags:
    - procurement
    - sap-ariba
    - sap
    - supplier-risk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-risk
      port: 8080
      tools:
        - name: assess-supplier-risk
          description: "Given a supplier ID, retrieve their risk score from SAP Ariba Supplier Risk and check for open purchase orders in SAP S/4HANA. If risk score exceeds threshold, notify the procurement Teams channel. Use for quarterly supplier risk reviews."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID to assess."
          steps:
            - name: get-risk-score
              type: call
              call: ariba.get-supplier-risk
              with:
                supplier_id: "{{supplier_id}}"
            - name: get-open-pos
              type: call
              call: sap.get-supplier-pos
              with:
                supplier_id: "{{supplier_id}}"
            - name: notify-procurement
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "Supplier Risk Alert: {{supplier_id}} | Risk Score: {{get-risk-score.score}} | Open POs: {{get-open-pos.count}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplierRisk/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: supplier-risk
          path: "/suppliers/{{supplier_id}}/riskScore"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier-risk
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kraft-heinz-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"
          operations:
            - name: get-supplier-pos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Traces a product batch through SAP to retrieve production origins and component lots.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Traces a product batch through SAP to retrieve production origins and component lots."
  tags:
    - quality
    - supply-chain
    - sap
    - traceability
capability:
  exposes:
    - type: mcp
      namespace: erp-traceability
      port: 8080
      tools:
        - name: trace-batch
          description: "Trace a product batch in SAP for production details."
          inputParameters:
            - name: batch_number
              type: string
              description: "SAP batch number."
            - name: material_number
              type: string
              description: "SAP material number."
          call: sap.get-batch-trace
          with:
            batch: "{{batch_number}}"
            material: "{{material_number}}"
          outputParameters:
            - name: plant
              type: string
              mapping: "$.d.ProductionPlant"
            - name: date
              type: string
              mapping: "$.d.ManufactureDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-batch-trace
              method: GET

Retrieves the bill of materials for a finished product from SAP including component materials and quantities.

naftiko: "0.5"
info:
  label: "SAP Bill of Materials Lookup"
  description: "Retrieves the bill of materials for a finished product from SAP including component materials and quantities."
  tags:
    - manufacturing
    - r-and-d
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-engineering
      port: 8080
      tools:
        - name: get-bom
          description: "Retrieve BOM from SAP for a material. Returns component list with quantities."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: plant_code
              type: string
              description: "SAP plant code."
          call: sap.get-bom
          with:
            material: "{{material_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: bom_number
              type: string
              mapping: "$.d.BillOfMaterial"
            - name: components
              type: string
              mapping: "$.d.to_BillOfMaterialItem.results"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-bom
              method: GET

Retrieves expense reports from SAP Concur that exceed policy thresholds, creates ServiceNow approval tasks for finance review, and notifies the AP team via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel and Expense Policy Audit"
  description: "Retrieves expense reports from SAP Concur that exceed policy thresholds, creates ServiceNow approval tasks for finance review, and notifies the AP team via Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
    - audit
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit-expense-reports
          description: "Retrieve submitted expense reports from SAP Concur exceeding the policy spending threshold and create ServiceNow approval tasks for AP review. Run nightly or before period close."
          inputParameters:
            - name: threshold_amount
              in: body
              type: number
              description: "Dollar threshold above which expense reports require additional approval."
            - name: report_date
              in: body
              type: string
              description: "Date filter for submitted reports in YYYY-MM-DD format."
          steps:
            - name: get-reports
              type: call
              call: concur.list-expense-reports
              with:
                submitDateAfter: "{{report_date}}"
            - name: create-review-tasks
              type: call
              call: servicenow.create-approval
              with:
                short_description: "Expense reports exceeding ${{threshold_amount}} pending review"
                category: "expense_audit"
            - name: notify-ap
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ap_channel_id"
                text: "Expense audit complete: reports exceeding ${{threshold_amount}} have been queued for AP review in ServiceNow."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: list-expense-reports
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves actual spending for a cost center from SAP for a fiscal period.

naftiko: "0.5"
info:
  label: "SAP Cost Center Actuals Lookup"
  description: "Retrieves actual spending for a cost center from SAP for a fiscal period."
  tags:
    - finance
    - operations
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: get-actuals
          description: "Look up cost center actuals in SAP."
          inputParameters:
            - name: cost_center
              type: string
              description: "SAP cost center ID."
            - name: period
              type: string
              description: "Fiscal period."
          call: sap.get-actuals
          with:
            cost_center: "{{cost_center}}"
            period: "{{period}}"
          outputParameters:
            - name: total
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.Currency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_OPLACCTGDOCITEMCUBE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-actuals
              method: GET

Monitors budgets from SAP actuals, Snowflake plans, and alerts via Teams.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Monitor"
  description: "Monitors budgets from SAP actuals, Snowflake plans, and alerts via Teams."
  tags:
    - finance
    - operations
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: budget-monitoring
      port: 8080
      tools:
        - name: monitor-budget
          description: "Monitor cost center budget."
          inputParameters:
            - name: cost_center
              type: string
              description: "Cost center."
            - name: period
              type: string
              description: "Period."
            - name: threshold
              type: number
              description: "Threshold pct."
          steps:
            - name: get-actuals
              type: call
              call: sap.get-actuals
              with:
                cc: "{{cost_center}}"
                period: "{{period}}"
            - name: get-plan
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT planned FROM budget WHERE cc='{{cost_center}}'"
            - name: alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance"
                text: "Budget: {{cost_center}} at {{get-plan.consumed_pct}}%"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_OPLACCTGDOCITEMCUBE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Processes credit memos by validating SAP invoice, creating credit doc, and updating Salesforce account.

naftiko: "0.5"
info:
  label: "SAP Credit Memo Processing"
  description: "Processes credit memos by validating SAP invoice, creating credit doc, and updating Salesforce account."
  tags:
    - finance
    - sales
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: finance-ar
      port: 8080
      tools:
        - name: process-credit-memo
          description: "Process credit memo."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Invoice number."
            - name: credit_amount
              type: number
              description: "Credit amount."
            - name: reason
              type: string
              description: "Reason."
          steps:
            - name: validate
              type: call
              call: sap.get-invoice
              with:
                invoice: "{{invoice_number}}"
            - name: create-credit
              type: call
              call: sap.create-credit-memo
              with:
                reference: "{{invoice_number}}"
                amount: "{{credit_amount}}"
            - name: update-account
              type: call
              call: salesforce.update-account
              with:
                id: "{{validate.customer_id}}"
                credit: "{{credit_amount}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-invoice
              method: GET
            - name: create-credit-memo
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

Orchestrates monthly close by running SAP tasks, validating Snowflake balances, and posting status to Teams.

naftiko: "0.5"
info:
  label: "SAP Financial Period Close Orchestrator"
  description: "Orchestrates monthly close by running SAP tasks, validating Snowflake balances, and posting status to Teams."
  tags:
    - finance
    - operations
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: close-period
          description: "Orchestrate financial period close."
          inputParameters:
            - name: period
              type: string
              description: "Fiscal period."
            - name: company_code
              type: string
              description: "Company code."
          steps:
            - name: check-items
              type: call
              call: sap.get-open-items
              with:
                code: "{{company_code}}"
                period: "{{period}}"
            - name: validate
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT * FROM recon WHERE code='{{company_code}}'"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance-close"
                text: "Period {{period}}: Open items {{check-items.count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_OPLACCTGDOCITEMCUBE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-open-items
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Confirms goods receipt in SAP S/4HANA for a purchase order, returning receipt document and quantity.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Confirmation"
  description: "Confirms goods receipt in SAP S/4HANA for a purchase order, returning receipt document and quantity."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-logistics
      port: 8080
      tools:
        - name: confirm-goods-receipt
          description: "Confirm goods receipt against a PO. Returns receipt doc, quantity, and posting date."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number."
            - name: plant_code
              type: string
              description: "SAP plant code."
          call: sap.post-goods-receipt
          with:
            po_number: "{{po_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: receipt_doc
              type: string
              mapping: "$.d.MaterialDocumentNumber"
            - name: quantity
              type: string
              mapping: "$.d.QuantityReceived"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: post-goods-receipt
              method: POST

Creates intercompany transfers in SAP, updates Snowflake forecasts, and notifies via Teams.

naftiko: "0.5"
info:
  label: "SAP Intercompany Transfer Workflow"
  description: "Creates intercompany transfers in SAP, updates Snowflake forecasts, and notifies via Teams."
  tags:
    - supply-chain
    - logistics
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: intercompany
      port: 8080
      tools:
        - name: create-transfer
          description: "Create intercompany stock transfer."
          inputParameters:
            - name: material
              type: string
              description: "Material."
            - name: from_plant
              type: string
              description: "Source plant."
            - name: to_plant
              type: string
              description: "Target plant."
            - name: quantity
              type: number
              description: "Quantity."
          steps:
            - name: transfer
              type: call
              call: sap.create-transfer
              with:
                material: "{{material}}"
                from: "{{from_plant}}"
                to: "{{to_plant}}"
            - name: update
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "CALL update_forecast('{{to_plant}}', '{{material}}', {{quantity}})"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "logistics"
                text: "Transfer: {{quantity}} of {{material}} from {{from_plant}} to {{to_plant}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_STOCK_TRANSFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: create-transfer
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Creates maintenance orders in SAP from ServiceNow requests and notifies team via Teams.

naftiko: "0.5"
info:
  label: "SAP Maintenance Order Creation"
  description: "Creates maintenance orders in SAP from ServiceNow requests and notifies team via Teams."
  tags:
    - manufacturing
    - operations
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-order
          description: "Create maintenance order."
          inputParameters:
            - name: snow_ticket
              type: string
              description: "ServiceNow ticket."
            - name: equipment_id
              type: string
              description: "Equipment ID."
            - name: priority
              type: string
              description: "Priority."
          steps:
            - name: get-request
              type: call
              call: servicenow.get-request
              with:
                number: "{{snow_ticket}}"
            - name: create-order
              type: call
              call: sap.create-order
              with:
                equipment: "{{equipment_id}}"
                priority: "{{priority}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "maintenance"
                text: "Maintenance order for {{equipment_id}}. Priority: {{priority}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Validates that SAP S/4HANA posting periods are properly closed at month-end by checking open items and period status, then posts a close-readiness summary to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Month-End Period Close Validation"
  description: "Validates that SAP S/4HANA posting periods are properly closed at month-end by checking open items and period status, then posts a close-readiness summary to the finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - period-close
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: validate-period-close
          description: "Given a fiscal period and SAP company code, check posting period status and count of open items in SAP S/4HANA, then post a close-readiness report to the finance Teams channel. Use at month-end before final close."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format, e.g. 202503."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code, e.g. 1000."
          steps:
            - name: get-period-status
              type: call
              call: sap.get-posting-periods
              with:
                period: "{{fiscal_period}}"
                companyCode: "{{company_code}}"
            - name: get-open-items
              type: call
              call: sap.get-open-items
              with:
                period: "{{fiscal_period}}"
                companyCode: "{{company_code}}"
            - name: post-summary
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Period Close Check {{fiscal_period}} ({{company_code}}): Status={{get-period-status.status}} | Open Items={{get-open-items.count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraft-heinz-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPLANDATA_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: posting-periods
          path: "/PostingPeriods"
          operations:
            - name: get-posting-periods
              method: GET
        - name: open-items
          path: "/OpenItems"
          operations:
            - name: get-open-items
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor name, total value, and currency for procurement review and spend visibility.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor name, total value, and currency for procurement review and spend visibility."
  tags:
    - procurement
    - erp
    - sap
    - finance
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, vendor name, total amount, and currency. Use for procurement approvals, spend analysis, and vendor reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to look up, e.g. 4500067890."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraft-heinz-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 product recipe details from SAP including ingredients, process parameters, and yield specifications.

naftiko: "0.5"
info:
  label: "SAP Recipe Management Lookup"
  description: "Retrieves product recipe details from SAP including ingredients, process parameters, and yield specifications."
  tags:
    - manufacturing
    - r-and-d
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: recipe-mgmt
      port: 8080
      tools:
        - name: get-recipe
          description: "Look up a product recipe in SAP by material number. Returns ingredients, process steps, and yield."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
          call: sap.get-recipe
          with:
            material: "{{material_number}}"
          outputParameters:
            - name: recipe_id
              type: string
              mapping: "$.d.RecipeId"
            - name: ingredients
              type: string
              mapping: "$.d.Ingredients"
            - name: yield_pct
              type: string
              mapping: "$.d.PlannedYield"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: "/A_Recipe"
          operations:
            - name: get-recipe
              method: GET

Tracks shipments from SAP delivery docs and updates Salesforce orders with tracking info.

naftiko: "0.5"
info:
  label: "SAP Transport Shipment Tracker"
  description: "Tracks shipments from SAP delivery docs and updates Salesforce orders with tracking info."
  tags:
    - supply-chain
    - logistics
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: logistics-tracking
      port: 8080
      tools:
        - name: track-shipment
          description: "Track outbound shipment."
          inputParameters:
            - name: delivery_number
              type: string
              description: "SAP delivery number."
            - name: sf_order_id
              type: string
              description: "Salesforce order ID."
          steps:
            - name: get-delivery
              type: call
              call: sap.get-delivery
              with:
                delivery: "{{delivery_number}}"
            - name: update-order
              type: call
              call: salesforce.update-order
              with:
                order_id: "{{sf_order_id}}"
                tracking: "{{get-delivery.tracking}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

Retrieves vendor payment terms and credit limit from SAP.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Terms Lookup"
  description: "Retrieves vendor payment terms and credit limit from SAP."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-payment-terms
          description: "Look up vendor payment terms in SAP."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor number."
          call: sap.get-vendor-terms
          with:
            vendor: "{{vendor_number}}"
          outputParameters:
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: credit_limit
              type: string
              mapping: "$.d.CreditLimit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-vendor-terms
              method: GET

Posts warehouse transfers in SAP, updates Snowflake inventory, and confirms via Teams.

naftiko: "0.5"
info:
  label: "SAP Warehouse Transfer Posting"
  description: "Posts warehouse transfers in SAP, updates Snowflake inventory, and confirms via Teams."
  tags:
    - supply-chain
    - logistics
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: post-transfer
          description: "Post warehouse transfer."
          inputParameters:
            - name: material
              type: string
              description: "Material."
            - name: from_loc
              type: string
              description: "Source."
            - name: to_loc
              type: string
              description: "Target."
            - name: quantity
              type: number
              description: "Quantity."
          steps:
            - name: transfer
              type: call
              call: sap.post-transfer
              with:
                material: "{{material}}"
                from: "{{from_loc}}"
            - name: update
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "CALL update_inv('{{material}}', {{quantity}})"
            - name: confirm
              type: call
              call: msteams.send-message
              with:
                channel_id: "warehouse"
                text: "Transfer: {{quantity}} of {{material}} to {{to_loc}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: post-transfer
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Creates and tracks IT infrastructure change requests in ServiceNow, assigns them to the change advisory board, and sends approval reminders via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Lifecycle Management"
  description: "Creates and tracks IT infrastructure change requests in ServiceNow, assigns them to the change advisory board, and sends approval reminders via Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: create-change-request
          description: "Given a change description, risk level, and planned implementation window, create a ServiceNow change request and notify the change advisory board in Teams. Use before any production infrastructure modification."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the planned change and business justification."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: implementation_window
              in: body
              type: string
              description: "Planned maintenance window in ISO 8601 format."
          steps:
            - name: create-cr
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "{{change_description}}"
                risk: "{{risk_level}}"
                start_date: "{{implementation_window}}"
            - name: notify-cab
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_cab_channel_id"
                text: "New Change Request {{create-cr.number}} ({{risk_level}} risk) requires CAB review: {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves current status of a ServiceNow incident including priority and assignment.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves current status of a ServiceNow incident including priority and assignment."
  tags:
    - operations
    - it-service
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: it-service-mgmt
      port: 8080
      tools:
        - name: get-incident
          description: "Look up ServiceNow incident status."
          inputParameters:
            - name: incident_number
              type: string
              description: "ServiceNow incident number."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

Searches SharePoint for documents matching a keyword.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches SharePoint for documents matching a keyword."
  tags:
    - operations
    - documents
    - sharepoint
    - search
capability:
  exposes:
    - type: mcp
      namespace: doc-management
      port: 8080
      tools:
        - name: search-docs
          description: "Search SharePoint for documents."
          inputParameters:
            - name: keyword
              type: string
              description: "Search keyword."
            - name: site_id
              type: string
              description: "SharePoint site ID."
          call: sharepoint.search
          with:
            siteId: "{{site_id}}"
            query: "{{keyword}}"
          outputParameters:
            - name: results
              type: string
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/drive/items"
          operations:
            - name: search-docs
              method: GET

Monitors Snowflake task execution for the consumer analytics and demand-sensing pipelines, creates a ServiceNow incident if jobs fail, and alerts the data team via Teams.

naftiko: "0.5"
info:
  label: "Snowflake Consumer Analytics Pipeline Monitor"
  description: "Monitors Snowflake task execution for the consumer analytics and demand-sensing pipelines, creates a ServiceNow incident if jobs fail, and alerts the data team via Teams."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-analytics-pipelines
          description: "Query Snowflake task history for failures in the consumer analytics and demand-sensing data pipelines over the last N hours. Open a ServiceNow incident and alert the data team if critical jobs have failed."
          inputParameters:
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours of task execution history to check, e.g. 6."
          steps:
            - name: get-failed-tasks
              type: call
              call: snowflake.query-task-history
              with:
                hours_back: "{{hours_back}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Snowflake pipeline failures in last {{hours_back}} hours"
                category: "data_platform"
                priority: "2"
            - name: notify-data-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "Snowflake pipeline failures detected over last {{hours_back}}h. SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraft-heinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/statements"
          operations:
            - name: query-task-history
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kraft-heinz.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Audits Snowflake query history for excessive credit consumption and long-running queries, posts a governance summary to the data platform Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Data Governance Query Audit"
  description: "Audits Snowflake query history for excessive credit consumption and long-running queries, posts a governance summary to the data platform Teams channel."
  tags:
    - data
    - governance
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: audit-snowflake-queries
          description: "Query Snowflake execution history for queries exceeding cost or duration thresholds and post a governance report to the data platform Teams channel. Use for daily FinOps and data platform cost management."
          inputParameters:
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours of query history to audit, e.g. 24."
            - name: threshold_seconds
              in: body
              type: integer
              description: "Query execution time in seconds above which queries are flagged."
          steps:
            - name: query-history
              type: call
              call: snowflake.query-history
              with:
                hours_back: "{{hours_back}}"
            - name: post-report
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "Snowflake Governance Report (last {{hours_back}}h): {{query-history.flagged_count}} queries exceeded {{threshold_seconds}}s."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraft-heinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: query-history
          path: "/statements"
          operations:
            - name: query-history
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Queries Snowflake for retail POS analytics including velocity, distribution, and share data.

naftiko: "0.5"
info:
  label: "Snowflake Retail POS Analytics Query"
  description: "Queries Snowflake for retail POS analytics including velocity, distribution, and share data."
  tags:
    - analytics
    - sales
    - snowflake
    - retail
capability:
  exposes:
    - type: mcp
      namespace: retail-analytics
      port: 8080
      tools:
        - name: query-pos-data
          description: "Query Snowflake retail POS data for a category and retailer."
          inputParameters:
            - name: category
              type: string
              description: "Product category."
            - name: retailer
              type: string
              description: "Retail account."
            - name: date_from
              type: string
              description: "Start date."
          call: snowflake.execute-query
          with:
            warehouse: "RETAIL_ANALYTICS_WH"
            query: "SELECT * FROM pos WHERE category='{{category}}'"
          outputParameters:
            - name: data
              type: string
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for supply chain KPIs including fill rate, OTIF, and inventory turns.

naftiko: "0.5"
info:
  label: "Snowflake Supply Chain KPI Query"
  description: "Queries Snowflake for supply chain KPIs including fill rate, OTIF, and inventory turns."
  tags:
    - supply-chain
    - analytics
    - snowflake
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sc-analytics
      port: 8080
      tools:
        - name: query-sc-kpis
          description: "Query supply chain KPIs from Snowflake."
          inputParameters:
            - name: region
              type: string
              description: "Region code."
            - name: period
              type: string
              description: "Period."
          call: snowflake.execute-query
          with:
            warehouse: "SC_ANALYTICS_WH"
            query: "SELECT fill_rate, otif FROM sc_kpis WHERE region='{{region}}'"
          outputParameters:
            - name: fill_rate
              type: string
              mapping: "$.data[0].fill_rate"
            - name: otif
              type: string
              mapping: "$.data[0].otif"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Triggers store-level replenishment by querying Snowflake POS data, checking SAP DC inventory, and creating Salesforce replenishment orders.

naftiko: "0.5"
info:
  label: "Store Level Inventory Replenishment"
  description: "Triggers store-level replenishment by querying Snowflake POS data, checking SAP DC inventory, and creating Salesforce replenishment orders."
  tags:
    - supply-chain
    - sales
    - snowflake
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: replenishment
      port: 8080
      tools:
        - name: trigger-replenishment
          description: "Trigger store replenishment based on POS velocity and DC inventory."
          inputParameters:
            - name: retailer
              type: string
              description: "Retailer account name."
            - name: region
              type: string
              description: "Sales region."
          steps:
            - name: get-pos-velocity
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "RETAIL_WH"
                query: "SELECT sku, velocity, weeks_of_supply FROM pos WHERE retailer='{{retailer}}' AND region='{{region}}' AND weeks_of_supply<2"
            - name: check-dc-stock
              type: call
              call: sap.get-dc-inventory
              with:
                region: "{{region}}"
                skus: "{{get-pos-velocity.skus}}"
            - name: create-order
              type: call
              call: salesforce.create-replenishment
              with:
                retailer: "{{retailer}}"
                items: "{{get-pos-velocity.data}}"
                available: "{{check-dc-stock.levels}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/data"
          operations:
            - name: get-dc-inventory
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order"
          operations:
            - name: create-replenishment
              method: POST

Generates supplier scorecards from Ariba delivery data, Snowflake quality metrics, and posts to Teams.

naftiko: "0.5"
info:
  label: "Supplier Performance Scorecard Generator"
  description: "Generates supplier scorecards from Ariba delivery data, Snowflake quality metrics, and posts to Teams."
  tags:
    - procurement
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-analytics
      port: 8080
      tools:
        - name: generate-scorecard
          description: "Generate supplier performance scorecard."
          inputParameters:
            - name: supplier_id
              type: string
              description: "Ariba supplier ID."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-delivery
              type: call
              call: ariba.get-performance
              with:
                supplier_id: "{{supplier_id}}"
                period: "{{period}}"
            - name: get-quality
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "PROCUREMENT_WH"
                query: "SELECT defect_rate FROM supplier_quality WHERE supplier='{{supplier_id}}'"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "procurement"
                text: "Supplier {{supplier_id}}: OTD {{get-delivery.on_time_rate}}%"
  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: get-supplier
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Queries SAP S/4HANA for current production order status and inventory levels, then writes a demand-sensing snapshot to Snowflake for supply chain analytics and forecasting.

naftiko: "0.5"
info:
  label: "Supply Chain Demand Sensing Snapshot"
  description: "Queries SAP S/4HANA for current production order status and inventory levels, then writes a demand-sensing snapshot to Snowflake for supply chain analytics and forecasting."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: capture-demand-snapshot
          description: "Pull production order status and stock levels for a given SAP plant from S/4HANA and write a timestamped demand snapshot to Snowflake for downstream forecasting models. Use for daily supply chain data ingestion."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code to snapshot, e.g. KH01 for Chicago manufacturing."
          steps:
            - name: get-production-orders
              type: call
              call: sap.get-production-orders
              with:
                plant: "{{plant_code}}"
            - name: get-stock-levels
              type: call
              call: sap.get-stock-levels
              with:
                plant: "{{plant_code}}"
            - name: write-snapshot
              type: call
              call: snowflake.insert-snapshot
              with:
                plant: "{{plant_code}}"
                orders: "{{get-production-orders.results}}"
                stock: "{{get-stock-levels.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraft-heinz-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder"
          operations:
            - name: get-production-orders
              method: GET
        - name: stock-levels
          path: "/A_MatlStkInAcctMod"
          operations:
            - name: get-stock-levels
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraft-heinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-snapshot
              method: POST

Assesses risk from Snowflake supplier data, Ariba status, and posts alerts to Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Risk Assessment"
  description: "Assesses risk from Snowflake supplier data, Ariba status, and posts alerts to Teams."
  tags:
    - supply-chain
    - procurement
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-risk
      port: 8080
      tools:
        - name: assess-risk
          description: "Assess supply chain risk."
          inputParameters:
            - name: material_group
              type: string
              description: "Material group."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "SELECT supplier, share FROM concentration WHERE group='{{material_group}}'"
            - name: get-risk
              type: call
              call: ariba.get-risk
              with:
                group: "{{material_group}}"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-risk"
                text: "Risk for {{material_group}}: Top share {{get-data.top_share}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - 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: get-supplier
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Generates TPE by pulling Salesforce promotions, Snowflake sales, and refreshing Power BI.

naftiko: "0.5"
info:
  label: "Trade Promotion Effectiveness Report"
  description: "Generates TPE by pulling Salesforce promotions, Snowflake sales, and refreshing Power BI."
  tags:
    - sales
    - marketing
    - salesforce
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: trade-analytics
      port: 8080
      tools:
        - name: generate-tpe
          description: "Generate trade promotion effectiveness report."
          inputParameters:
            - name: promotion_id
              type: string
              description: "Salesforce promotion ID."
            - name: date_from
              type: string
              description: "Start date."
            - name: date_to
              type: string
              description: "End date."
          steps:
            - name: get-promo
              type: call
              call: salesforce.get-promotion
              with:
                promotion_id: "{{promotion_id}}"
            - name: get-sales
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SALES_WH"
                query: "SELECT revenue FROM pos WHERE promo='{{promotion_id}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "trade-promotion-effectiveness"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kraftheinz.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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"
          operations:
            - name: refresh-dataset
              method: POST

Performs three-way match between SAP PO, goods receipt, and invoice, routing exceptions to ServiceNow.

naftiko: "0.5"
info:
  label: "Vendor Invoice Three-Way Match"
  description: "Performs three-way match between SAP PO, goods receipt, and invoice, routing exceptions to ServiceNow."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ap-automation
      port: 8080
      tools:
        - name: three-way-match
          description: "Perform three-way match for vendor invoice."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Invoice number."
            - name: po_number
              type: string
              description: "PO number."
          steps:
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: get-receipt
              type: call
              call: sap.get-receipt
              with:
                po_number: "{{po_number}}"
            - name: create-exception
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Mismatch: {{invoice_number}} vs PO {{po_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-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: resource
          path: "/data"
          operations:
            - name: get-po
              method: GET
            - name: get-receipt
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kraftheinz.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

Analyzes warehouse capacity from SAP, demand from Snowflake, and refreshes Power BI dashboard.

naftiko: "0.5"
info:
  label: "Warehouse Capacity Planning Orchestrator"
  description: "Analyzes warehouse capacity from SAP, demand from Snowflake, and refreshes Power BI dashboard."
  tags:
    - supply-chain
    - logistics
    - sap
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: warehouse-planning
      port: 8080
      tools:
        - name: plan-capacity
          description: "Analyze warehouse capacity."
          inputParameters:
            - name: warehouse_id
              type: string
              description: "Warehouse number."
            - name: weeks
              type: number
              description: "Forecast weeks."
          steps:
            - name: get-util
              type: call
              call: sap.get-warehouse-stock
              with:
                warehouse: "{{warehouse_id}}"
            - name: get-forecast
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "SELECT pallets FROM forecast WHERE id='{{warehouse_id}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "warehouse-capacity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kraftheinz-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-warehouse-stock
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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"
          operations:
            - name: refresh-dataset
              method: POST

Tracks waste reduction initiatives by pulling manufacturing waste data from Snowflake, comparing to targets, and posting progress to Teams.

naftiko: "0.5"
info:
  label: "Waste Reduction Initiative Tracker"
  description: "Tracks waste reduction initiatives by pulling manufacturing waste data from Snowflake, comparing to targets, and posting progress to Teams."
  tags:
    - manufacturing
    - sustainability
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: waste-reduction
      port: 8080
      tools:
        - name: track-waste-reduction
          description: "Track waste reduction progress against targets."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: initiative_id
              type: string
              description: "Jira initiative key."
          steps:
            - name: get-waste-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MFG_WH"
                query: "SELECT waste_type, current_pct, target_pct FROM waste_tracking WHERE plant='{{plant_code}}'"
            - name: update-initiative
              type: call
              call: jira.update-issue
              with:
                issue_key: "{{initiative_id}}"
                comment: "Current waste: {{get-waste-data.current_total}}%. Target: {{get-waste-data.target_total}}%"
            - name: post-progress
              type: call
              call: msteams.send-message
              with:
                channel_id: "sustainability"
                text: "Waste reduction at {{plant_code}}: {{get-waste-data.current_total}}% (target: {{get-waste-data.target_total}}%)"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kraftheinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: update-issue
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Generates diversity metrics from Workday, enriches with Snowflake analytics, refreshes Power BI.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Report"
  description: "Generates diversity metrics from Workday, enriches with Snowflake analytics, refreshes Power BI."
  tags:
    - hr
    - analytics
    - workday
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: hr-analytics
      port: 8080
      tools:
        - name: generate-diversity
          description: "Generate workforce diversity metrics."
          inputParameters:
            - name: business_unit
              type: string
              description: "Business unit."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-demo
              type: call
              call: workday.get-demographics
              with:
                bu: "{{business_unit}}"
            - name: get-analytics
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "HR_WH"
                query: "SELECT diversity_index FROM metrics WHERE bu='{{business_unit}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "diversity-dashboard"
  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: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kraftheinz.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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"
          operations:
            - name: refresh-dataset
              method: POST

Retrieves headcount data from Workday by department including active employees and open positions.

naftiko: "0.5"
info:
  label: "Workday Headcount Report Lookup"
  description: "Retrieves headcount data from Workday by department including active employees and open positions."
  tags:
    - hr
    - workforce
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount
          description: "Get headcount report from Workday by department."
          inputParameters:
            - name: department
              type: string
              description: "Department name."
          call: workday.get-headcount
          with:
            department: "{{department}}"
          outputParameters:
            - name: active_count
              type: string
              mapping: "$.headcount.active"
            - name: open_positions
              type: string
              mapping: "$.headcount.open"
  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: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET

When a new job requisition is approved in Workday Recruiting, creates a Jira tracking issue for the hiring team and posts a notification to the HR Teams channel.

naftiko: "0.5"
info:
  label: "Workday Job Requisition to Jira Tracker Sync"
  description: "When a new job requisition is approved in Workday Recruiting, creates a Jira tracking issue for the hiring team and posts a notification to the HR Teams channel."
  tags:
    - hr
    - recruiting
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: recruiting-ops
      port: 8080
      tools:
        - name: sync-requisition-to-jira
          description: "Given a Workday job requisition ID, retrieve requisition details and create a Jira task for the hiring team. Notify the HR Teams channel with a summary. Invoke when a job requisition is approved in Workday."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Hire: {{get-requisition.job_title}} — {{get-requisition.department}}"
                description: "Workday requisition {{requisition_id}}. Target: {{get-requisition.target_hire_date}}"
            - name: notify-hr
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "New req approved: {{get-requisition.job_title}} | Jira: {{create-jira-task.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/kraft-heinz/recruiting/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kraft-heinz.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Initiates the annual performance review cycle in Workday for all eligible Kraft Heinz employees and sends a kickoff reminder to managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Initiation"
  description: "Initiates the annual performance review cycle in Workday for all eligible Kraft Heinz employees and sends a kickoff reminder to managers via Microsoft Teams."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a review cycle name and due date, start the Workday performance review process and send reminder messages to all managers via Teams. Use at the beginning of each performance review period."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "Name of the performance cycle, e.g. 2025 Annual Review."
            - name: due_date
              in: body
              type: string
              description: "Review completion deadline in YYYY-MM-DD format."
          steps:
            - name: start-cycle
              type: call
              call: workday.create-review-cycle
              with:
                name: "{{cycle_name}}"
                dueDate: "{{due_date}}"
            - name: notify-hr
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Performance Review '{{cycle_name}}' has launched in Workday. Deadline: {{due_date}}. Please complete reviews before the deadline."
  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: "/kraft-heinz/performanceManagement/reviewCycles"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves employee time off balances from Workday.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves employee time off balances from Workday."
  tags:
    - hr
    - workforce
    - workday
    - time-off
capability:
  exposes:
    - type: mcp
      namespace: hr-time-mgmt
      port: 8080
      tools:
        - name: get-time-off
          description: "Look up time off balances in Workday."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday employee ID."
          call: workday.get-time-off
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: vacation
              type: string
              mapping: "$.balance.vacation"
            - name: sick
              type: string
              mapping: "$.balance.sick"
  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: "/kraftheinz/workers"
          operations:
            - name: get-worker
              method: GET