General Mills Capabilities

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

Sort
Expand

Lists members of privileged Azure AD groups for General Mills quarterly access certifications and writes results to a SharePoint audit list.

naftiko: "0.5"
info:
  label: "Azure AD Privileged Access Review"
  description: "Lists members of privileged Azure AD groups for General Mills quarterly access certifications and writes results to a SharePoint audit list."
  tags:
    - identity
    - security
    - azure-ad
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: run-access-review
          description: "Given an Azure AD group ID and SharePoint site and list IDs, retrieve all group members and write them to the SharePoint access review list. Use quarterly for privileged access certification at General Mills."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Azure AD group ID to audit."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "The SharePoint site ID for audit records."
            - name: sharepoint_list_id
              in: body
              type: string
              description: "The SharePoint list ID for the review entries."
          steps:
            - name: list-members
              type: call
              call: "azure-ad-review.list-group-members"
              with:
                group_id: "{{group_id}}"
            - name: write-audit-record
              type: call
              call: "sharepoint-audit.create-list-item"
              with:
                site_id: "{{sharepoint_site_id}}"
                list_id: "{{sharepoint_list_id}}"
                members: "{{list-members.value}}"
  consumes:
    - type: http
      namespace: azure-ad-review
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-group-members
              method: GET
    - type: http
      namespace: sharepoint-audit
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_id}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_id
              in: path
          operations:
            - name: create-list-item
              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

Queries Azure Cost Management for General Mills subscription spend anomalies and posts an alert to the FinOps Microsoft Teams channel when thresholds are exceeded.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly Alert Handler"
  description: "Queries Azure Cost Management for General Mills subscription spend anomalies and posts an alert to the FinOps Microsoft Teams channel when thresholds are exceeded."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and spend threshold, query Azure Cost Management and post an alert to the FinOps Teams channel if the threshold is exceeded. Use when responding to Azure cost anomaly notifications."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to audit."
            - name: threshold_usd
              in: body
              type: number
              description: "Spend threshold in USD; alert fires when current spend exceeds this."
          steps:
            - name: get-spend
              type: call
              call: "azure-cost.query-usage"
              with:
                subscription_id: "{{subscription_id}}"
            - name: alert-finops
              type: call
              call: "msteams-finops.send-message"
              with:
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure Cost Alert — Subscription {{subscription_id}} at {{get-spend.total_cost}} {{get-spend.currency}} has crossed the ${{threshold_usd}} threshold. Review the billing dashboard."
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com/subscriptions"
      authentication:
        type: bearer
        token: "$secrets.azure_management_token"
      resources:
        - name: cost-query
          path: "/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: query-usage
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-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/generalmills"
      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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks 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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://generalmills.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 Workday termination is processed, disables the Azure AD account, opens a ServiceNow offboarding ticket, and notifies IT Security via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When a Workday termination is processed, disables the Azure AD account, opens a ServiceNow offboarding ticket, and notifies IT Security via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - azure-ad
    - servicenow
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, disable the Azure AD account, open a ServiceNow offboarding ticket, and alert IT Security via Teams. Use immediately upon confirmed General Mills employee separation."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working day in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-off.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: disable-ad-account
              type: call
              call: "azure-ad-off.disable-user"
              with:
                user_id: "{{get-worker.azure_object_id}}"
            - name: open-offboard-ticket
              type: call
              call: "servicenow-off.create-incident"
              with:
                category: "hr_offboarding"
                short_description: "Offboarding: {{get-worker.full_name}} — last day {{termination_date}}"
                assignment_group: "IT_Security"
  consumes:
    - type: http
      namespace: workday-off
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/generalmills/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad-off
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow-off
      baseUri: "https://generalmills.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 a new hire is created in Workday, opens a ServiceNow IT onboarding ticket, provisions an Azure AD account, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow IT onboarding ticket, provisions an Azure AD account, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - azure-ad
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Azure AD, and Microsoft Teams. Use when a new General Mills hire is confirmed and IT provisioning must begin."
          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-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-ad-account
              type: call
              call: "azure-ad.create-user"
              with:
                display_name: "{{get-employee.full_name}}"
                department: "{{get-employee.department}}"
            - name: open-it-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                category: "hr_onboarding"
                short_description: "New hire IT setup: {{get-employee.full_name}} — start {{start_date}}"
                assignment_group: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to General Mills, {{get-employee.first_name}}! Your IT setup ticket is {{open-it-ticket.number}}. We look forward to your start on {{start_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/generalmills/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://generalmills.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: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

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://generalmills-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://generalmills.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://generalmills.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 GitHub Actions workflow fails on the main branch, creates a Jira bug and posts an alert to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Actions CI Failure Handler"
  description: "When a GitHub Actions workflow fails on the main branch, creates a Jira bug and posts an alert to the engineering Microsoft Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions failure event, create a Jira Bug and post an alert to the engineering Teams channel. Use when a protected-branch workflow fails at General Mills."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions run ID."
            - name: branch
              in: body
              type: string
              description: "The branch the workflow ran on."
            - name: run_url
              in: body
              type: string
              description: "Direct URL to the failed workflow run."
          steps:
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI] {{repo}} / {{branch}} — {{workflow_name}} failed"
                description: "Run {{run_id}} failed on {{branch}}.\nWorkflow: {{workflow_name}}\nURL: {{run_url}}"
            - name: notify-engineering
              type: call
              call: "msteams-eng.send-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "CI Failure: {{repo}} ({{branch}}) — {{workflow_name}} | Jira: {{create-jira-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://generalmills.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-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches critical Dependabot security alerts for a General Mills GitHub repository and creates Jira security issues for each unresolved vulnerability.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Alert Triage"
  description: "Fetches critical Dependabot security alerts for a General Mills GitHub repository and creates Jira security issues for each unresolved vulnerability."
  tags:
    - security
    - devops
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: security-triage
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Given a GitHub repository and Jira project key, fetch all open critical Dependabot alerts and create a Jira security issue for each. Use during General Mills security triage cycles or in response to vulnerability disclosures."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key for security issues (e.g., SEC)."
          steps:
            - name: get-alerts
              type: call
              call: "github-sec.list-dependabot-alerts"
              with:
                repo: "{{repo}}"
                severity: "critical"
                state: "open"
            - name: create-security-issue
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Security"
                summary: "Critical Dependabot alerts in {{repo}}: {{get-alerts.total_count}} open"
                description: "Repository: {{repo}}\nOpen critical vulnerabilities: {{get-alerts.total_count}}\nReview: https://github.com/{{repo}}/security/dependabot"
  consumes:
    - type: http
      namespace: github-sec
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
            - name: state
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira-sec
      baseUri: "https://generalmills.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

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: "/generalmills/certifications"
          operations:
            - name: get-certifications
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://generalmills.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://generalmills.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 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://generalmills.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

Fetches all open Jira issues in the current sprint for a General Mills engineering project and posts a backlog status summary to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Backlog Health Digest"
  description: "Fetches all open Jira issues in the current sprint for a General Mills engineering project and posts a backlog status summary to the engineering Microsoft Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - reporting
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: devops-reporting
      port: 8080
      tools:
        - name: digest-sprint-backlog
          description: "Given a Jira project key and Teams channel, query open sprint issues and post a backlog health summary. Use for daily stand-up prep or sprint review briefings at General Mills."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key (e.g., TECH, GMILS)."
            - name: channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID to post the digest to."
          steps:
            - name: get-issues
              type: call
              call: "jira-sprint.search-issues"
              with:
                jql: "project={{project_key}} AND sprint in openSprints() ORDER BY status ASC"
            - name: post-digest
              type: call
              call: "msteams-sprint.send-message"
              with:
                channel_id: "{{channel_id}}"
                text: "Sprint Backlog ({{project_key}}): {{get-issues.total}} open — To Do: {{get-issues.todo_count}}, In Progress: {{get-issues.inprogress_count}}, In Review: {{get-issues.review_count}}."
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://generalmills.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue-search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams-sprint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches LinkedIn campaign performance analytics for General Mills brand pages and posts a summary to the marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Brand Campaign Performance Digest"
  description: "Fetches LinkedIn campaign performance analytics for General Mills brand pages and posts a summary to the marketing Microsoft Teams channel."
  tags:
    - marketing
    - linkedin
    - microsoft-teams
    - reporting
    - social
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-campaign
          description: "Given a LinkedIn campaign ID and date range, fetch impressions, clicks, and engagement metrics and post a performance summary to the marketing Teams channel. Use for weekly brand and campaign performance reviews."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The LinkedIn campaign ID to retrieve analytics for."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-analytics
              type: call
              call: "linkedin-analytics.get-campaign-stats"
              with:
                campaign_id: "{{campaign_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-summary
              type: call
              call: "msteams-marketing.send-message"
              with:
                channel_id: "$secrets.teams_marketing_channel_id"
                text: "LinkedIn Campaign {{campaign_id}} ({{start_date}} — {{end_date}}): Impressions={{get-analytics.impressions}}, Clicks={{get-analytics.clicks}}, CTR={{get-analytics.ctr}}%."
  consumes:
    - type: http
      namespace: linkedin-analytics
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalyticsV2"
          inputParameters:
            - name: q
              in: query
              value: "analytics"
            - name: pivot
              in: query
              value: "CAMPAIGN"
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: msteams-marketing
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://generalmills.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://generalmills.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://generalmills-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 launch by creating Salesforce campaign, Meta ads, and notifying marketing via Teams.

naftiko: "0.5"
info:
  label: "Marketing Campaign Launch Coordinator"
  description: "Coordinates launch by creating Salesforce campaign, Meta ads, and notifying marketing via Teams."
  tags:
    - marketing
    - campaigns
    - salesforce
    - meta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: campaign-ops
      port: 8080
      tools:
        - name: launch-campaign
          description: "Orchestrate marketing campaign launch."
          inputParameters:
            - name: campaign_name
              type: string
              description: "Campaign name."
            - name: brand
              type: string
              description: "Brand."
            - name: start_date
              type: string
              description: "Start date."
            - name: budget
              type: number
              description: "Budget USD."
          steps:
            - name: create-campaign
              type: call
              call: salesforce.create-campaign
              with:
                Name: "{{campaign_name}}"
                Brand: "{{brand}}"
            - name: activate-ads
              type: call
              call: meta.activate
              with:
                name: "{{campaign_name}}"
                status: "ACTIVE"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "marketing"
                text: "Campaign '{{campaign_name}}' launched for {{brand}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://generalmills.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: 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
    - 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 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://generalmills.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

Queries Microsoft Graph for General Mills Microsoft 365 license assignments and consumption for IT cost allocation and renewal planning.

naftiko: "0.5"
info:
  label: "Microsoft 365 License Utilization Report"
  description: "Queries Microsoft Graph for General Mills Microsoft 365 license assignments and consumption for IT cost allocation and renewal planning."
  tags:
    - identity
    - microsoft-365
    - reporting
    - it-finance
capability:
  exposes:
    - type: mcp
      namespace: m365-reporting
      port: 8080
      tools:
        - name: get-license-utilization
          description: "Query Microsoft Graph for all subscribed Microsoft 365 SKUs and consumed unit counts. Use for monthly IT license chargeback, compliance audits, and renewal planning at General Mills."
          call: "msgraph-lic.get-subscribed-skus"
          outputParameters:
            - name: skus
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msgraph-lic
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: subscribed-skus
          path: "/subscribedSkus"
          operations:
            - name: get-subscribed-skus
              method: GET

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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills.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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://generalmills.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

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://generalmills-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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills-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://generalmills.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

Triggers an on-demand Power BI dataset refresh for General Mills consumer brand performance dashboards used by the marketing and finance teams.

naftiko: "0.5"
info:
  label: "Power BI Consumer Brand Dashboard Refresh"
  description: "Triggers an on-demand Power BI dataset refresh for General Mills consumer brand performance dashboards used by the marketing and finance teams."
  tags:
    - data
    - analytics
    - power-bi
    - marketing
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: brand-analytics
      port: 8080
      tools:
        - name: refresh-brand-dashboard
          description: "Given a Power BI workspace ID and dataset ID, trigger an on-demand dataset refresh. Use when consumer brand or retail sales data must be reflected in dashboards outside the scheduled refresh window."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          call: "powerbi.refresh-dataset"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

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 and posts a dashboard link to the General Mills executive leadership Microsoft Teams channel before leadership briefings.

naftiko: "0.5"
info:
  label: "Power BI Executive Reporting Digest"
  description: "Triggers a Power BI dataset refresh and posts a dashboard link to the General Mills executive leadership Microsoft Teams channel before leadership briefings."
  tags:
    - reporting
    - power-bi
    - microsoft-teams
    - executive
capability:
  exposes:
    - type: mcp
      namespace: exec-reporting
      port: 8080
      tools:
        - name: publish-exec-dashboard
          description: "Given Power BI workspace and dataset IDs and a dashboard URL, trigger a refresh and post the dashboard link to the executive Teams channel. Use before weekly leadership briefings or board reporting cycles."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
            - name: dashboard_url
              in: body
              type: string
              description: "The Power BI dashboard URL to share with leadership."
          steps:
            - name: refresh-dataset
              type: call
              call: "powerbi-exec.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: post-link
              type: call
              call: "msteams-exec.send-message"
              with:
                channel_id: "$secrets.teams_exec_channel_id"
                text: "Executive dashboard refreshed and ready for review: {{dashboard_url}} (Request ID: {{refresh-dataset.requestId}})"
  consumes:
    - type: http
      namespace: powerbi-exec
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-exec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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://generalmills.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

Updates a Salesforce customer account record with new contact, industry, or revenue information from the General Mills CRM team.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Update"
  description: "Updates a Salesforce customer account record with new contact, industry, or revenue information from the General Mills CRM team."
  tags:
    - crm
    - sales
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-accounts
      port: 8080
      tools:
        - name: update-customer-account
          description: "Given a Salesforce account ID and updated attributes, patch the account record. Use when CRM operations refreshes retailer or distributor account data for the General Mills sales team."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID (18-character SFDC ID)."
            - name: industry
              in: body
              type: string
              description: "Updated industry classification."
            - name: annual_revenue
              in: body
              type: number
              description: "Updated annual revenue estimate."
            - name: phone
              in: body
              type: string
              description: "Updated main phone number for the account."
          call: "salesforce-crm.update-account"
          with:
            account_id: "{{account_id}}"
            industry: "{{industry}}"
            annual_revenue: "{{annual_revenue}}"
            phone: "{{phone}}"
          outputParameters:
            - name: success
              type: boolean
              mapping: "$.success"
  consumes:
    - type: http
      namespace: salesforce-crm
      baseUri: "https://generalmills.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH

When a Salesforce opportunity closes as Closed-Won, opens a ServiceNow customer onboarding ticket and notifies the account owner via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Customer Onboarding Trigger"
  description: "When a Salesforce opportunity closes as Closed-Won, opens a ServiceNow customer onboarding ticket and notifies the account owner via Microsoft Teams."
  tags:
    - crm
    - sales
    - salesforce
    - servicenow
    - customer-onboarding
capability:
  exposes:
    - type: mcp
      namespace: customer-onboarding
      port: 8080
      tools:
        - name: trigger-customer-onboarding
          description: "Given a Salesforce opportunity ID, retrieve account details, open a ServiceNow onboarding ticket, and notify the account owner via Teams. Use when a new General Mills retail or food service customer deal is closed."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID that was closed-won."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-won.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: open-onboard-ticket
              type: call
              call: "servicenow-won.create-incident"
              with:
                category: "customer_onboarding"
                short_description: "New customer onboarding: {{get-opportunity.account_name}}"
                description: "Opportunity {{opportunity_id}}, value ${{get-opportunity.amount}}, closed {{get-opportunity.close_date}}"
            - name: notify-owner
              type: call
              call: "msteams-won.send-message"
              with:
                recipient_upn: "{{get-opportunity.owner_email}}"
                text: "Opportunity {{opportunity_id}} ({{get-opportunity.account_name}}) is Closed-Won! Onboarding ticket: {{open-onboard-ticket.number}}. Implementation begins."
  consumes:
    - type: http
      namespace: salesforce-won
      baseUri: "https://generalmills.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: servicenow-won
      baseUri: "https://generalmills.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-won
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Fetches open Salesforce opportunities above a threshold for a General Mills sales region and posts a pipeline summary to the sales Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Digest"
  description: "Fetches open Salesforce opportunities above a threshold for a General Mills sales region and posts a pipeline summary to the sales Microsoft Teams channel."
  tags:
    - crm
    - sales
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: crm-pipeline
      port: 8080
      tools:
        - name: digest-opportunity-pipeline
          description: "Given a sales region and minimum deal value, query Salesforce for open opportunities and post a pipeline summary to the sales Teams channel. Use for weekly pipeline reviews and sales leadership briefings."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Sales region to filter opportunities (e.g., North America, EMEA)."
            - name: min_amount
              in: body
              type: number
              description: "Minimum opportunity value in USD to include."
          steps:
            - name: query-pipeline
              type: call
              call: "salesforce-pipeline.query-opportunities"
              with:
                region: "{{region}}"
                min_amount: "{{min_amount}}"
            - name: post-summary
              type: call
              call: "msteams-pipeline.send-message"
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "Sales Pipeline ({{region}}, >${{min_amount}}): {{query-pipeline.total_count}} opportunities totaling ${{query-pipeline.total_value}}."
  consumes:
    - type: http
      namespace: salesforce-pipeline
      baseUri: "https://generalmills.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams-pipeline
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-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://generalmills.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

Opens a Salesforce case for a retail trade promotion request linked to the customer account, enabling the General Mills trade marketing team to track promotions.

naftiko: "0.5"
info:
  label: "Salesforce Trade Promotion Case Creator"
  description: "Opens a Salesforce case for a retail trade promotion request linked to the customer account, enabling the General Mills trade marketing team to track promotions."
  tags:
    - crm
    - marketing
    - salesforce
    - trade-promotion
capability:
  exposes:
    - type: mcp
      namespace: trade-marketing
      port: 8080
      tools:
        - name: create-promotion-case
          description: "Given a Salesforce account ID, promotion type, and start/end dates, create a Salesforce case to track a retail trade promotion. Use when General Mills trade marketing initiates a promotional program with a retail partner."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce retailer account ID."
            - name: promotion_type
              in: body
              type: string
              description: "Type of promotion (e.g., price reduction, display feature, coupon)."
            - name: start_date
              in: body
              type: string
              description: "Promotion start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Promotion end date in YYYY-MM-DD format."
          call: "salesforce-promo.create-case"
          with:
            account_id: "{{account_id}}"
            subject: "Trade Promotion: {{promotion_type}} ({{start_date}} to {{end_date}})"
            type: "Trade Promotion"
          outputParameters:
            - name: case_number
              type: string
              mapping: "$.caseNumber"
            - name: case_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: salesforce-promo
      baseUri: "https://generalmills.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

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://generalmills-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://generalmills-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 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://generalmills-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://generalmills-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://generalmills.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 procurement and operating spend by cost center for a fiscal period for General Mills financial close and budget variance reporting.

naftiko: "0.5"
info:
  label: "SAP Cost Center Spend Report"
  description: "Queries SAP S/4HANA for procurement and operating spend by cost center for a fiscal period for General Mills financial close and budget variance reporting."
  tags:
    - finance
    - erp
    - sap
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: get-spend-by-cost-center
          description: "Given a fiscal year, period, and optional cost center code, return total spend actuals from SAP S/4HANA. Use for monthly budget variance reviews, quarterly financial close, and executive cost reporting."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The SAP fiscal year (e.g., 2025)."
            - name: period
              in: body
              type: string
              description: "The fiscal period number (1-12)."
            - name: cost_center
              in: body
              type: string
              description: "Optional SAP cost center code to filter results."
          call: "sap-cca.get-cost-center-actuals"
          with:
            fiscal_year: "{{fiscal_year}}"
            period: "{{period}}"
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: total_actuals
              type: number
              mapping: "$.d.results[0].AmountInCoCodeCurrency"
            - name: currency
              type: string
              mapping: "$.d.results[0].CompanyCodeCurrency"
  consumes:
    - type: http
      namespace: sap-cca
      baseUri: "https://generalmills-s4.sap.com/sap/opu/odata/sap/FAC_COSTCENTER_0001"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-center-actuals
          path: "/CostCenterActuals"
          inputParameters:
            - name: fiscal_year
              in: query
            - name: period
              in: query
            - name: cost_center
              in: query
          operations:
            - name: get-cost-center-actuals
              method: GET

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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills-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://generalmills.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://generalmills.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://generalmills-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

Creates a new SAP purchase order for a General Mills procurement request, links it to the appropriate cost center, and notifies the requester via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Creation"
  description: "Creates a new SAP purchase order for a General Mills procurement request, links it to the appropriate cost center, and notifies the requester via Microsoft Teams."
  tags:
    - finance
    - procurement
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: create-purchase-order
          description: "Given supplier ID, cost center, item description, and amount, create a SAP S/4HANA purchase order and send a confirmation to the requester via Microsoft Teams. Use when fulfilling General Mills procurement requests."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP vendor/supplier number."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center to charge the purchase to."
            - name: item_description
              in: body
              type: string
              description: "Description of the goods or services being purchased."
            - name: amount
              in: body
              type: number
              description: "Total purchase order value."
            - name: requester_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the procurement requester."
          steps:
            - name: create-po
              type: call
              call: "sap-create-po.create-purchase-order"
              with:
                supplier_id: "{{supplier_id}}"
                cost_center: "{{cost_center}}"
                item_description: "{{item_description}}"
                amount: "{{amount}}"
            - name: notify-requester
              type: call
              call: "msteams-procure.send-message"
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Purchase order {{create-po.po_number}} created for ${{amount}} against cost center {{cost_center}}. Status: {{create-po.status}}."
  consumes:
    - type: http
      namespace: sap-create-po
      baseUri: "https://generalmills-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: create-purchase-order
              method: POST
    - type: http
      namespace: msteams-procure
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

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://generalmills-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

Looks up a General Mills SAP S/4HANA purchase order by number and returns header status, vendor, total value, and currency.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Lookup"
  description: "Looks up a General Mills SAP S/4HANA purchase order by number and returns header status, vendor, total value, and currency."
  tags:
    - finance
    - erp
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP PO number, return status, vendor name, total value, and currency. Use when auditing procurement spend, resolving supplier invoicing queries, or preparing for financial close."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP S/4HANA purchase order number."
          call: "sap-s4.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: number
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://generalmills-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

Submits a supplier invoice to SAP S/4HANA accounts payable, links it to the PO, and notifies the approving manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Supplier Invoice Submission"
  description: "Submits a supplier invoice to SAP S/4HANA accounts payable, links it to the PO, and notifies the approving manager via Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ap-processing
      port: 8080
      tools:
        - name: submit-supplier-invoice
          description: "Given invoice details and a linked SAP PO number, create the invoice record in SAP S/4HANA and notify the finance manager in Microsoft Teams for approval. Use during General Mills accounts-payable processing."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP PO number this invoice is billed against."
            - name: invoice_number
              in: body
              type: string
              description: "The supplier invoice number."
            - name: amount
              in: body
              type: number
              description: "Invoice total in the PO currency."
            - name: approver_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the finance approver."
          steps:
            - name: create-invoice
              type: call
              call: "sap-ap.create-supplier-invoice"
              with:
                po_number: "{{po_number}}"
                invoice_number: "{{invoice_number}}"
                amount: "{{amount}}"
            - name: notify-approver
              type: call
              call: "msteams-ap.send-message"
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Invoice {{invoice_number}} for SAP PO {{po_number}} (${{amount}}) has been submitted. Invoice ID: {{create-invoice.invoice_id}}. Please review and approve in SAP."
  consumes:
    - type: http
      namespace: sap-ap
      baseUri: "https://generalmills-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: create-supplier-invoice
              method: POST
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

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://generalmills-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://generalmills.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://generalmills-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://generalmills-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://generalmills.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 ServiceNow for the status of the latest scheduled backup job and alerts the General Mills IT operations Teams channel if backup failed or is overdue.

naftiko: "0.5"
info:
  label: "ServiceNow Backup Verification Check"
  description: "Queries ServiceNow for the status of the latest scheduled backup job and alerts the General Mills IT operations Teams channel if backup failed or is overdue."
  tags:
    - itsm
    - operations
    - servicenow
    - microsoft-teams
    - backup
capability:
  exposes:
    - type: mcp
      namespace: backup-verification
      port: 8080
      tools:
        - name: verify-backup-status
          description: "Query ServiceNow for the latest backup job record and post a Teams alert summarizing status. Use as part of daily General Mills IT operations checks."
          inputParameters:
            - name: backup_job_name
              in: body
              type: string
              description: "The ServiceNow scheduled job name for the backup to verify."
          steps:
            - name: get-backup-record
              type: call
              call: "servicenow-bkp.get-backup-record"
              with:
                job_name: "{{backup_job_name}}"
            - name: post-status
              type: call
              call: "msteams-bkp.send-message"
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "Backup Check — {{backup_job_name}}: Status={{get-backup-record.status}}, Last run={{get-backup-record.last_run_date}}. Investigate if status is not 'Success'."
  consumes:
    - type: http
      namespace: servicenow-bkp
      baseUri: "https://generalmills.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: backup-records
          path: "/table/scheduled_job"
          inputParameters:
            - name: job_name
              in: query
          operations:
            - name: get-backup-record
              method: GET
    - type: http
      namespace: msteams-bkp
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a ServiceNow change request for a planned General Mills IT or infrastructure change with risk-based routing.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Creation"
  description: "Creates a ServiceNow change request for a planned General Mills IT or infrastructure change with risk-based routing."
  tags:
    - itsm
    - change-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: create-change-request
          description: "Given change description, risk level, and implementation window, create a ServiceNow change request. Use when planning IT, application, or infrastructure changes in the General Mills environment."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the change."
            - name: risk
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: start_date
              in: body
              type: string
              description: "Planned implementation start in ISO 8601 format."
            - name: end_date
              in: body
              type: string
              description: "Planned implementation end in ISO 8601 format."
          call: "servicenow-chg.create-change"
          with:
            short_description: "{{short_description}}"
            risk: "{{risk}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: change_number
              type: string
              mapping: "$.result.number"
            - name: state
              type: string
              mapping: "$.result.state"
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://generalmills.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

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://generalmills.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

Escalates a ServiceNow incident to P1, assigns the on-call engineering group, and broadcasts an alert to the General Mills IT operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Escalation"
  description: "Escalates a ServiceNow incident to P1, assigns the on-call engineering group, and broadcasts an alert to the General Mills IT operations Microsoft Teams channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-incident-ops
      port: 8080
      tools:
        - name: escalate-to-p1
          description: "Given a ServiceNow incident number and escalation reason, update priority to P1, reassign to the on-call group, and post a critical alert to the IT operations Teams channel. Use when an incident is confirmed as business-critical at General Mills."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
            - name: escalation_reason
              in: body
              type: string
              description: "Reason for the P1 escalation."
          steps:
            - name: update-incident
              type: call
              call: "servicenow-itsm.patch-incident"
              with:
                number: "{{incident_number}}"
                priority: "1"
                assignment_group: "GM_IT_Critical_OnCall"
                work_notes: "P1 escalation: {{escalation_reason}}"
            - name: alert-it-ops
              type: call
              call: "msteams-itsm.send-message"
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 ESCALATION: {{incident_number}} — {{escalation_reason}}. Assigned to GM IT Critical On-Call. Immediate response required."
  consumes:
    - type: http
      namespace: servicenow-itsm
      baseUri: "https://generalmills.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: patch-incident
              method: PATCH
    - type: http
      namespace: msteams-itsm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              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

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://generalmills.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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills.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

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://generalmills.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

Triggers a Terraform Cloud plan-and-apply run for a General Mills infrastructure workspace following an approved change request.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Run"
  description: "Triggers a Terraform Cloud plan-and-apply run for a General Mills infrastructure workspace following an approved change request."
  tags:
    - cloud
    - infrastructure
    - terraform
    - devops
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and run message, trigger a new plan-and-apply run. Use when deploying approved General Mills infrastructure changes to cloud environments."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID (e.g., ws-xxxxxxxxxxxxxxxx)."
            - name: message
              in: body
              type: string
              description: "Human-readable message describing the reason for this run."
          call: "terraform-cloud.create-run"
          with:
            workspace_id: "{{workspace_id}}"
            message: "{{message}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.data.id"
            - name: status
              type: string
              mapping: "$.data.attributes.status"
  consumes:
    - type: http
      namespace: terraform-cloud
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST

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://generalmills.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://generalmills.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://generalmills-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://generalmills.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://generalmills-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://generalmills.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://generalmills.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://generalmills.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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://generalmills.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

Exports current General Mills headcount grouped by department and cost center from Workday for quarterly workforce planning and executive reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Export for Finance"
  description: "Exports current General Mills headcount grouped by department and cost center from Workday for quarterly workforce planning and executive reporting."
  tags:
    - hr
    - reporting
    - workday
    - headcount
    - finance
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns active General Mills employees grouped by department and cost center from Workday. Use for headcount planning, budget reviews, and HR analytics."
          call: "workday-hcm.headcount-export"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
            - name: total_count
              type: number
              mapping: "$.total"
  consumes:
    - type: http
      namespace: workday-hcm
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers-export
          path: "/generalmills/workers"
          inputParameters:
            - name: format
              in: query
              value: "json"
          operations:
            - name: headcount-export
              method: GET

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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET

Fetches approved open job requisitions from Workday Recruiting and publishes them to the General Mills LinkedIn company page.

naftiko: "0.5"
info:
  label: "Workday Open Requisition to LinkedIn Publisher"
  description: "Fetches approved open job requisitions from Workday Recruiting and publishes them to the General Mills LinkedIn company page."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: talent-publishing
      port: 8080
      tools:
        - name: publish-job-to-linkedin
          description: "Given a Workday job requisition ID, fetch job details from Workday and post the role to the General Mills LinkedIn company page. Use when a recruiter approves a role for external publication."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID to publish."
          steps:
            - name: get-requisition
              type: call
              call: "workday-jobs.get-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin-jobs.create-job-posting"
              with:
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
                company_id: "$secrets.linkedin_gm_company_id"
  consumes:
    - type: http
      namespace: workday-jobs
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/generalmills/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: linkedin-jobs
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/simpleJobPostings"
          operations:
            - name: create-job-posting
              method: POST

When a Workday role change is approved, updates Azure AD group membership to reflect the new role and notifies the employee via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Provisioner"
  description: "When a Workday role change is approved, updates Azure AD group membership to reflect the new role and notifies the employee via Microsoft Teams."
  tags:
    - hr
    - identity
    - workday
    - azure-ad
    - microsoft-teams
    - role-change
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID, new role, and Azure AD group ID, update group membership and send a Teams notification to the employee. Use when an internal transfer or promotion is finalized in Workday at General Mills."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee changing roles."
            - name: new_role
              in: body
              type: string
              description: "The new job title."
            - name: new_ad_group
              in: body
              type: string
              description: "Azure AD group ID for the new role's access."
          steps:
            - name: get-worker
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: add-to-group
              type: call
              call: "azure-ad-role.add-group-member"
              with:
                group_id: "{{new_ad_group}}"
                user_id: "{{get-worker.azure_object_id}}"
            - name: notify-employee
              type: call
              call: "msteams-role.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Your role has been updated to {{new_role}}. Your system access has been provisioned. Welcome to your new position!"
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/generalmills/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members/$ref"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-group-member
              method: POST
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-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: "/generalmills/workers"
          operations:
            - name: get-worker
              method: GET

Returns approval status and date coverage for a General Mills employee time-off request from Workday.

naftiko: "0.5"
info:
  label: "Workday Time-Off Request Status Lookup"
  description: "Returns approval status and date coverage for a General Mills employee time-off request from Workday."
  tags:
    - hr
    - workday
    - time-off
capability:
  exposes:
    - type: mcp
      namespace: hr-time
      port: 8080
      tools:
        - name: get-time-off-request
          description: "Given a Workday worker ID and time-off request ID, return current approval status and covered dates. Use when employees or managers need to verify leave approval status."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the employee."
            - name: request_id
              in: body
              type: string
              description: "The Workday time-off request ID."
          call: "workday-pto.get-time-off-request"
          with:
            worker_id: "{{worker_id}}"
            request_id: "{{request_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.overallStatus"
            - name: start_date
              type: string
              mapping: "$.data.startDate"
            - name: end_date
              type: string
              mapping: "$.data.endDate"
  consumes:
    - type: http
      namespace: workday-pto
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off-requests
          path: "/generalmills/workers/{{worker_id}}/timeOffRequests/{{request_id}}"
          inputParameters:
            - name: worker_id
              in: path
            - name: request_id
              in: path
          operations:
            - name: get-time-off-request
              method: GET