Unilever Capabilities

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

Sort
Expand

Launches the annual performance review cycle in Workday for all employees, posts a kickoff notification to the global HR Teams channel, and tracks completion via ServiceNow.

naftiko: "0.5"
info:
  label: "Annual Performance Review Kickoff"
  description: "Launches the annual performance review cycle in Workday for all employees, posts a kickoff notification to the global HR Teams channel, and tracks completion via ServiceNow."
  tags:
    - hr
    - performance-management
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: performance-mgmt
      port: 8080
      tools:
        - name: launch-annual-review
          description: "Given a review cycle name and deadline, launch the performance review in Workday, create a ServiceNow tracking task, and notify all managers via Teams."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "Name of the performance review cycle (e.g., 2026 Annual Performance Review)."
            - name: submission_deadline
              in: body
              type: string
              description: "Review submission deadline in YYYY-MM-DD format."
            - name: global_hr_channel_id
              in: body
              type: string
              description: "Teams channel ID for the global HR communications channel."
          steps:
            - name: launch-review-cycle
              type: call
              call: "workday-perf.create-review-cycle"
              with:
                cycleName: "{{cycle_name}}"
                dueDate: "{{submission_deadline}}"
            - name: create-tracking-task
              type: call
              call: "servicenow-perf.create-task"
              with:
                short_description: "{{cycle_name}} completion tracking"
                category: "performance_management"
                assignment_group: "HR_Operations"
                due_date: "{{submission_deadline}}"
            - name: notify-managers
              type: call
              call: "msteams-perf.post-channel-message"
              with:
                channel_id: "{{global_hr_channel_id}}"
                text: "{{cycle_name}} is now open. All managers must complete reviews by {{submission_deadline}}. Log in to Workday to begin. Tracking task: {{create-tracking-task.number}}"
  consumes:
    - type: http
      namespace: workday-perf
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/performanceReviewCycles"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: servicenow-perf
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-perf
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks deployment frequency from Azure DevOps in Snowflake, computes DORA metrics, and distributes reports to engineering leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Deployment Frequency Reporter"
  description: "Tracks deployment frequency from Azure DevOps in Snowflake, computes DORA metrics, and distributes reports to engineering leadership via Microsoft Teams."
  tags:
    - devops
    - azure-devops
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: azure_devops_deploym
      port: 8080
      tools:
        - name: azure-devops
          description: "Given an execution date, run the azure devops deployment frequency reporter process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.AZURE_DEVOPS_DEPLOYMENT_FREQUENCY_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.AZURE_DEVOPS_DEPLOYMENT_FREQUE_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_azure_devops_deploym_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes Azure cloud costs in Snowflake, identifies savings opportunities, creates Jira optimization tasks, and notifies the cloud governance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure FinOps Cost Optimization Advisor"
  description: "Analyzes Azure cloud costs in Snowflake, identifies savings opportunities, creates Jira optimization tasks, and notifies the cloud governance team via Microsoft Teams."
  tags:
    - cloud
    - microsoft-azure
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: azure_finops_cost_op
      port: 8080
      tools:
        - name: azure-finops
          description: "Given an execution date, run the azure finops cost optimization advisor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.AZURE_FINOPS_COST_OPTIMIZATION_ADVISOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.AZURE_FINOPS_COST_OPTIMIZATION_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Azure FinOps Cost Optimization Advisor - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_azure_finops_cost_op_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the health status of a specified Azure resource.

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

Tracks influencer marketing campaign performance in Snowflake, computes engagement ROI, and distributes insights to the brand team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Beauty Brand Influencer Campaign Tracker"
  description: "Tracks influencer marketing campaign performance in Snowflake, computes engagement ROI, and distributes insights to the brand team via Microsoft Teams."
  tags:
    - marketing
    - influencer
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: beauty_brand_influen
      port: 8080
      tools:
        - name: beauty-brand
          description: "Given an execution date, run the beauty brand influencer campaign tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.BEAUTY_BRAND_INFLUENCER_CAMPAIGN_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.BEAUTY_BRAND_INFLUENCER_CAMPAI_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_beauty_brand_influen_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors social media sentiment spikes in Snowflake, flags potential brand crises, creates ServiceNow incidents, and alerts the communications team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Brand Social Media Crisis Detector"
  description: "Monitors social media sentiment spikes in Snowflake, flags potential brand crises, creates ServiceNow incidents, and alerts the communications team via Microsoft Teams."
  tags:
    - marketing
    - social-media
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: brand_social_media_c
      port: 8080
      tools:
        - name: brand-social
          description: "Given an execution date, run the brand social media crisis detector process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.BRAND_SOCIAL_MEDIA_CRISIS_DETECTOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.BRAND_SOCIAL_MEDIA_CRISIS_DETE_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "marketing"
                short_description: "Brand Social Media Crisis Detector processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_brand_social_media_c_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves LinkedIn and Meta brand page engagement metrics for a Unilever brand and publishes a weekly social performance digest to the brand marketing Teams channel.

naftiko: "0.5"
info:
  label: "Brand Social Media Performance Report"
  description: "Retrieves LinkedIn and Meta brand page engagement metrics for a Unilever brand and publishes a weekly social performance digest to the brand marketing Teams channel."
  tags:
    - marketing
    - social-media
    - linkedin
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-social-performance
          description: "Given a LinkedIn organization ID and a brand name, retrieve social engagement metrics and post a weekly social performance digest to the brand marketing Teams channel."
          inputParameters:
            - name: linkedin_org_id
              in: body
              type: string
              description: "LinkedIn organization URN ID for the Unilever brand."
            - name: brand_name
              in: body
              type: string
              description: "Name of the Unilever brand (e.g., Dove, Axe, Hellmann's, Knorr)."
            - name: marketing_channel_id
              in: body
              type: string
              description: "Teams channel ID for the brand marketing team."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: "linkedin-social.get-organization-statistics"
              with:
                organizationId: "{{linkedin_org_id}}"
            - name: post-social-digest
              type: call
              call: "msteams-social.post-channel-message"
              with:
                channel_id: "{{marketing_channel_id}}"
                text: "Social Report — {{brand_name}}: LinkedIn followers: {{get-linkedin-metrics.follower_count}} | New followers (7d): {{get-linkedin-metrics.new_followers}} | Engagement: {{get-linkedin-metrics.engagement_rate}}%"
  consumes:
    - type: http
      namespace: linkedin-social
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organization-statistics
          path: "/organizationPageStatistics"
          inputParameters:
            - name: organizationId
              in: query
          operations:
            - name: get-organization-statistics
              method: GET
    - type: http
      namespace: msteams-social
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Calculates scope 3 carbon footprint across the supply chain in Snowflake, logs progress against targets, and notifies the ESG team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Carbon Footprint Supply Chain Calculator"
  description: "Calculates scope 3 carbon footprint across the supply chain in Snowflake, logs progress against targets, and notifies the ESG team via Microsoft Teams."
  tags:
    - sustainability
    - supply-chain
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: carbon_footprint_sup
      port: 8080
      tools:
        - name: carbon-footprint
          description: "Given an execution date, run the carbon footprint supply chain calculator process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CARBON_FOOTPRINT_SUPPLY_CHAIN_CALCULATOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CARBON_FOOTPRINT_SUPPLY_CHAIN__RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_carbon_footprint_sup_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Confluence wiki page by ID.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence wiki page by ID."
  tags:
    - documentation
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given a Confluence page ID, retrieve details. Use for documentation reviews."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://unilever.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Validates consumer panel data ingestion completeness in Snowflake, flags missing feeds, creates ServiceNow incidents, and alerts the analytics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Consumer Panel Data Ingestion Validator"
  description: "Validates consumer panel data ingestion completeness in Snowflake, flags missing feeds, creates ServiceNow incidents, and alerts the analytics team via Microsoft Teams."
  tags:
    - analytics
    - consumer-insights
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consumer_panel_data_
      port: 8080
      tools:
        - name: consumer-panel
          description: "Given an execution date, run the consumer panel data ingestion validator process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CONSUMER_PANEL_DATA_INGESTION_VALIDATOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CONSUMER_PANEL_DATA_INGESTION__RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "analytics"
                short_description: "Consumer Panel Data Ingestion Validator processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_consumer_panel_data__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee or consumer submits a GDPR data subject access request, creates a ServiceNow compliance ticket with 30-day SLA and notifies the data privacy team via Teams.

naftiko: "0.5"
info:
  label: "Data Privacy Subject Access Request Handling"
  description: "When an employee or consumer submits a GDPR data subject access request, creates a ServiceNow compliance ticket with 30-day SLA and notifies the data privacy team via Teams."
  tags:
    - compliance
    - gdpr
    - data-privacy
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-privacy
      port: 8080
      tools:
        - name: handle-subject-access-request
          description: "Given a requestor email and request type (access, erasure, rectification), create a ServiceNow GDPR compliance ticket with a 30-day SLA and notify the privacy team via Teams."
          inputParameters:
            - name: requestor_email
              in: body
              type: string
              description: "Email address of the data subject making the request."
            - name: request_type
              in: body
              type: string
              description: "GDPR request type: access, erasure, rectification, portability."
            - name: privacy_team_channel_id
              in: body
              type: string
              description: "Teams channel ID for the data privacy team."
          steps:
            - name: create-dsar-ticket
              type: call
              call: "servicenow-dsar.create-task"
              with:
                short_description: "GDPR {{request_type}} request — {{requestor_email}}"
                category: "data_privacy"
                assignment_group: "Data_Privacy_Team"
                due_date: "30_days_from_now"
            - name: notify-privacy-team
              type: call
              call: "msteams-dsar.post-channel-message"
              with:
                channel_id: "{{privacy_team_channel_id}}"
                text: "New GDPR request: {{request_type}} from {{requestor_email}} | SLA: 30 days | ServiceNow ticket: {{create-dsar-ticket.number}}"
  consumes:
    - type: http
      namespace: servicenow-dsar
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-dsar
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Datadog for service health status.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for service health status."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a Datadog service name, retrieve health status. Use for operational checks."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
          call: "datadog.get-service-health"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.attributes.status"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: services
          path: "/service_level_objectives?query={{service_name}}"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-service-health
              method: GET

Validates product content on digital shelves against brand standards in Snowflake, creates Jira remediation tasks, and alerts the e-commerce team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Digital Shelf Content Compliance Checker"
  description: "Validates product content on digital shelves against brand standards in Snowflake, creates Jira remediation tasks, and alerts the e-commerce team via Microsoft Teams."
  tags:
    - e-commerce
    - content
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: digital_shelf_conten
      port: 8080
      tools:
        - name: digital-shelf
          description: "Given an execution date, run the digital shelf content compliance checker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.DIGITAL_SHELF_CONTENT_COMPLIANCE_CHECKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.DIGITAL_SHELF_CONTENT_COMPLIAN_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Digital Shelf Content Compliance Checker - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_digital_shelf_conten_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Aggregates DTC e-commerce metrics in Snowflake, refreshes Power BI dashboards, and distributes performance digests to the digital commerce team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "E-Commerce DTC Channel Performance Digest"
  description: "Aggregates DTC e-commerce metrics in Snowflake, refreshes Power BI dashboards, and distributes performance digests to the digital commerce team via Microsoft Teams."
  tags:
    - e-commerce
    - analytics
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ecommerce_dtc_channe
      port: 8080
      tools:
        - name: ecommerce-dtc
          description: "Given an execution date, run the e-commerce dtc channel performance digest process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.ECOMMERCE_DTC_CHANNEL_PERFORMANCE_DIGEST LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.ECOMMERCE_DTC_CHANNEL_PERFORMA_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_ecommerce_dtc_channe_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves all Workday employees who have not yet completed open enrollment and sends personalized benefit enrollment reminders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Benefits Enrollment Reminder"
  description: "Retrieves all Workday employees who have not yet completed open enrollment and sends personalized benefit enrollment reminders via Microsoft Teams."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment deadline and benefit portal URL, retrieve unenrolled employees from Workday and post reminder messages to the all-employees Teams channel."
          inputParameters:
            - name: enrollment_deadline
              in: body
              type: string
              description: "Open enrollment deadline in YYYY-MM-DD format."
            - name: benefit_portal_url
              in: body
              type: string
              description: "URL to the benefits enrollment portal."
            - name: hr_channel_id
              in: body
              type: string
              description: "Teams channel ID for the all-employees channel."
          steps:
            - name: get-unenrolled-workers
              type: call
              call: "workday-benefits.get-workers"
              with:
                enrollmentStatus: "not_started"
            - name: post-enrollment-reminder
              type: call
              call: "msteams-benefits.post-channel-message"
              with:
                channel_id: "{{hr_channel_id}}"
                text: "Benefits enrollment closes {{enrollment_deadline}}. {{get-unenrolled-workers.count}} employees have not yet enrolled. Complete your elections at {{benefit_portal_url}}."
  consumes:
    - type: http
      namespace: workday-benefits
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: enrollmentStatus
              in: query
          operations:
            - name: get-workers
              method: GET
    - type: http
      namespace: msteams-benefits
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee's last day is confirmed in Workday, creates a ServiceNow access revocation task and notifies the IT security team via Teams to disable all system access.

naftiko: "0.5"
info:
  label: "Employee Offboarding Access Revocation"
  description: "When an employee's last day is confirmed in Workday, creates a ServiceNow access revocation task and notifies the IT security team via Teams to disable all system access."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding-access-revocation
          description: "Given a Workday employee ID and separation date, create a ServiceNow access revocation ticket and notify the IT security team via Teams to ensure timely deprovisioning."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the departing employee."
            - name: separation_date
              in: body
              type: string
              description: "Last day of employment in YYYY-MM-DD format."
            - name: it_security_channel_id
              in: body
              type: string
              description: "Teams channel ID for the IT security team."
          steps:
            - name: get-employee
              type: call
              call: "workday-off.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-revocation-task
              type: call
              call: "servicenow-off.create-task"
              with:
                short_description: "Access revocation: {{get-employee.full_name}} — last day {{separation_date}}"
                category: "access_management"
                assignment_group: "IT_Security"
                due_date: "{{separation_date}}"
            - name: notify-it-security
              type: call
              call: "msteams-off.post-channel-message"
              with:
                channel_id: "{{it_security_channel_id}}"
                text: "Offboarding: {{get-employee.full_name}} separates {{separation_date}}. Revoke all system access by EOD on that date. Task: {{create-revocation-task.number}}"
  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: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow-off
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-off
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a food safety concern is reported, creates a ServiceNow P1 incident, logs in Snowflake, opens a Jira investigation, and alerts the food safety team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Food Safety Incident Response Chain"
  description: "When a food safety concern is reported, creates a ServiceNow P1 incident, logs in Snowflake, opens a Jira investigation, and alerts the food safety team via Microsoft Teams."
  tags:
    - food-safety
    - servicenow
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: food_safety_incident
      port: 8080
      tools:
        - name: food-safety
          description: "Given an execution date, run the food safety incident response chain process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.FOOD_SAFETY_INCIDENT_RESPONSE_CHAIN LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.FOOD_SAFETY_INCIDENT_RESPONSE__RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "food-safety"
                short_description: "Food Safety Incident Response Chain processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_food_safety_incident_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates month-end GL period close in SAP S/4HANA, creates a ServiceNow close checklist task, and notifies the global controller via Microsoft Teams.

naftiko: "0.5"
info:
  label: "General Ledger Period Close"
  description: "Initiates month-end GL period close in SAP S/4HANA, creates a ServiceNow close checklist task, and notifies the global controller via Microsoft Teams."
  tags:
    - finance
    - period-close
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: initiate-period-close
          description: "Given a fiscal period and year, open the period close in SAP S/4HANA, create a ServiceNow checklist task, and notify the global controller via Teams."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period number (01-12)."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year (e.g., 2026)."
            - name: controller_upn
              in: body
              type: string
              description: "UPN of the global controller to notify."
          steps:
            - name: open-period
              type: call
              call: "sap-close.open-period"
              with:
                period: "{{fiscal_period}}"
                year: "{{fiscal_year}}"
            - name: create-checklist
              type: call
              call: "servicenow-close.create-task"
              with:
                short_description: "GL close checklist FY{{fiscal_year}}-P{{fiscal_period}}"
                category: "finance_close"
                assignment_group: "Finance_Accounting"
            - name: notify-controller
              type: call
              call: "msteams-close.send-message"
              with:
                recipient_upn: "{{controller_upn}}"
                text: "Period close initiated: FY{{fiscal_year}}-P{{fiscal_period}}. Checklist task: {{create-checklist.number}}. Please approve all journal entries by the deadline."
  consumes:
    - type: http
      namespace: sap-close
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_FISCALPERIOD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fiscal-periods
          path: "/A_FiscalPeriod"
          operations:
            - name: open-period
              method: POST
    - type: http
      namespace: servicenow-close
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-close
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Scans GitHub Actions workflows for supply chain vulnerabilities in Snowflake, creates Jira remediation tickets, and alerts the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Actions Supply Chain Security Scanner"
  description: "Scans GitHub Actions workflows for supply chain vulnerabilities in Snowflake, creates Jira remediation tickets, and alerts the security team via Microsoft Teams."
  tags:
    - security
    - github
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: github_actions_suppl
      port: 8080
      tools:
        - name: github-actions
          description: "Given an execution date, run the github actions supply chain security scanner process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.GITHUB_ACTIONS_SUPPLY_CHAIN_SECURITY_SCA LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.GITHUB_ACTIONS_SUPPLY_CHAIN_SE_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "GitHub Actions Supply Chain Security Scanner - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_github_actions_suppl_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects code quality metrics from GitHub repos in Snowflake, tracks trends, creates Jira improvement tasks, and notifies engineering leads via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Code Quality Metrics Reporter"
  description: "Collects code quality metrics from GitHub repos in Snowflake, tracks trends, creates Jira improvement tasks, and notifies engineering leads via Microsoft Teams."
  tags:
    - devops
    - github
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: github_code_quality_
      port: 8080
      tools:
        - name: github-code
          description: "Given an execution date, run the github code quality metrics reporter process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.GITHUB_CODE_QUALITY_METRICS_REPORTER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.GITHUB_CODE_QUALITY_METRICS_RE_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "GitHub Code Quality Metrics Reporter - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_github_code_quality__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves metadata for a GitHub repository.

naftiko: "0.5"
info:
  label: "GitHub Repository Info Lookup"
  description: "Retrieves metadata for a GitHub repository."
  tags:
    - devops
    - github
    - source-control
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given org and repo name, retrieve metadata. Use for developer onboarding."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "The GitHub organization."
            - name: repo
              in: body
              type: string
              description: "The repository name."
          call: "github.get-repo"
          with:
            org: "{{org}}"
            repo: "{{repo}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.full_name"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{org}}/{{repo}}"
          inputParameters:
            - name: org
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

Submits a global IT change request in ServiceNow for system changes affecting Unilever's global infrastructure, routes for CAB approval, and notifies impacted stakeholders via Teams.

naftiko: "0.5"
info:
  label: "Global IT Change Management Request"
  description: "Submits a global IT change request in ServiceNow for system changes affecting Unilever's global infrastructure, routes for CAB approval, and notifies impacted stakeholders via Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, risk level, and affected regions, create a ServiceNow change request, assign to the Global CAB, and notify regional IT leads via Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed global IT change."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, high, critical."
            - name: implementation_date
              in: body
              type: string
              description: "Planned implementation date in YYYY-MM-DD format."
            - name: it_leads_channel_id
              in: body
              type: string
              description: "Teams channel ID for regional IT leads."
          steps:
            - name: create-change
              type: call
              call: "servicenow-change.create-change"
              with:
                short_description: "{{change_description}}"
                risk: "{{risk_level}}"
                start_date: "{{implementation_date}}"
                assignment_group: "Global_CAB"
            - name: notify-it-leads
              type: call
              call: "msteams-change.post-channel-message"
              with:
                channel_id: "{{it_leads_channel_id}}"
                text: "Change request {{create-change.number}}: {{change_description}} | Risk: {{risk_level}} | Implementation: {{implementation_date}} | CAB review required."
  consumes:
    - type: http
      namespace: servicenow-change
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-change
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Reviews home care product formulas against regulatory requirements in Snowflake, flags non-compliant ingredients, creates ServiceNow cases, and notifies the regulatory team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Home Care Formula Regulatory Review"
  description: "Reviews home care product formulas against regulatory requirements in Snowflake, flags non-compliant ingredients, creates ServiceNow cases, and notifies the regulatory team via Microsoft Teams."
  tags:
    - regulatory
    - home-care
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: home_care_formula_re
      port: 8080
      tools:
        - name: home-care
          description: "Given an execution date, run the home care formula regulatory review process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.HOME_CARE_FORMULA_REGULATORY_REVIEW LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.HOME_CARE_FORMULA_REGULATORY_R_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "regulatory"
                short_description: "Home Care Formula Regulatory Review processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_home_care_formula_re_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors cold chain temperature data in Snowflake, flags excursions, creates ServiceNow incidents, and alerts the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Ice Cream Cold Chain Temperature Monitor"
  description: "Monitors cold chain temperature data in Snowflake, flags excursions, creates ServiceNow incidents, and alerts the logistics team via Microsoft Teams."
  tags:
    - logistics
    - cold-chain
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ice_cream_cold_chain
      port: 8080
      tools:
        - name: ice-cream
          description: "Given an execution date, run the ice cream cold chain temperature monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.ICE_CREAM_COLD_CHAIN_TEMPERATURE_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.ICE_CREAM_COLD_CHAIN_TEMPERATU_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "logistics"
                short_description: "Ice Cream Cold Chain Temperature Monitor processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_ice_cream_cold_chain_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a major incident is declared in ServiceNow, creates a Microsoft Teams bridge channel, logs the event in Snowflake, and notifies the SRE team.

naftiko: "0.5"
info:
  label: "IT Incident Major Incident Bridge Launcher"
  description: "When a major incident is declared in ServiceNow, creates a Microsoft Teams bridge channel, logs the event in Snowflake, and notifies the SRE team."
  tags:
    - itsm
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it_incident_major_in
      port: 8080
      tools:
        - name: it-incident
          description: "Given an execution date, run the it incident major incident bridge launcher process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.IT_INCIDENT_MAJOR_INCIDENT_BRIDGE_LAUNCH LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.IT_INCIDENT_MAJOR_INCIDENT_BRI_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "itsm"
                short_description: "IT Incident Major Incident Bridge Launcher processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_it_incident_major_in_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a P1 IT incident is raised in ServiceNow, creates a Datadog event for observability tracking, sends an escalation alert to the regional IT team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "IT Incident Response and Escalation"
  description: "When a P1 IT incident is raised in ServiceNow, creates a Datadog event for observability tracking, sends an escalation alert to the regional IT team via Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-incident-response
      port: 8080
      tools:
        - name: handle-it-incident
          description: "Given a P1 ServiceNow incident ID and affected system, create a Datadog event for correlation and notify the regional IT team lead via Teams with full incident context."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
            - name: affected_system
              in: body
              type: string
              description: "The IT system affected by the incident (e.g., SAP ERP, M365, Network)."
            - name: it_lead_upn
              in: body
              type: string
              description: "UPN of the regional IT team lead for escalation."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-it.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: create-datadog-event
              type: call
              call: "datadog.create-event"
              with:
                title: "P1 IT Incident: {{affected_system}}"
                text: "ServiceNow: {{incident_number}} — {{get-incident.short_description}}"
                alert_type: "error"
            - name: escalate-to-it-lead
              type: call
              call: "msteams-it.send-message"
              with:
                recipient_upn: "{{it_lead_upn}}"
                text: "P1 IT INCIDENT: {{affected_system}} | ServiceNow: {{incident_number}} | Description: {{get-incident.short_description}} | Datadog: {{create-datadog-event.url}}"
  consumes:
    - type: http
      namespace: servicenow-it
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams-it
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Jira issue by key.

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

Pulls campaign performance metrics from Salesforce Marketing Cloud and LinkedIn for a given Unilever brand campaign and posts a weekly digest to the brand marketing Teams channel.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Pulls campaign performance metrics from Salesforce Marketing Cloud and LinkedIn for a given Unilever brand campaign and posts a weekly digest to the brand marketing Teams channel."
  tags:
    - marketing
    - campaign
    - salesforce
    - linkedin
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-brand-campaign
          description: "Given a Salesforce campaign ID and LinkedIn organization ID, retrieve campaign reach, engagement, and conversion metrics, and post a weekly brand performance digest to the Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce campaign ID for the brand campaign."
            - name: linkedin_org_id
              in: body
              type: string
              description: "Unilever's LinkedIn organization ID for social metrics."
            - name: brand_channel_id
              in: body
              type: string
              description: "Teams channel ID for the brand marketing team."
          steps:
            - name: get-campaign-stats
              type: call
              call: "salesforce-mktg.get-campaign"
              with:
                campaign_id: "{{campaign_id}}"
            - name: get-linkedin-stats
              type: call
              call: "linkedin.get-organization-statistics"
              with:
                organizationId: "{{linkedin_org_id}}"
            - name: post-brand-digest
              type: call
              call: "msteams-mktg.post-channel-message"
              with:
                channel_id: "{{brand_channel_id}}"
                text: "Campaign Report: {{get-campaign-stats.name}} | Leads: {{get-campaign-stats.leads_count}} | Conversions: {{get-campaign-stats.converted_leads}} | LinkedIn Engagements: {{get-linkedin-stats.engagement_count}}"
  consumes:
    - type: http
      namespace: salesforce-mktg
      baseUri: "https://unilever.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organization-statistics
          path: "/organizationPageStatistics"
          inputParameters:
            - name: organizationId
              in: query
          operations:
            - name: get-organization-statistics
              method: GET
    - type: http
      namespace: msteams-mktg
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Sends a message to a specified Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Sender"
  description: "Sends a message to a specified Microsoft Teams channel."
  tags:
    - collaboration
    - microsoft-teams
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: send-channel-message
          description: "Given team ID, channel ID, and message, post to the channel. Use for notifications."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The channel ID."
            - name: message_text
              in: body
              type: string
              description: "The message body."
          call: "msteams.send-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message_text}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: msteams
      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-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message to the new hire and their manager."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, orchestrate full onboarding: open a ServiceNow ticket, provision Microsoft 365, and send Teams welcome messages."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's first day in YYYY-MM-DD format."
            - name: business_unit
              in: body
              type: string
              description: "Business unit the employee is joining (e.g., Beauty, Foods, Home Care, Personal Care)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: open-onboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}} — {{business_unit}} — {{start_date}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "New hire {{get-employee.first_name}} {{get-employee.last_name}} starts {{start_date}} in {{business_unit}}. Onboarding ticket: {{open-onboarding-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Syncs product innovation ideas from Notion to Jira epics, logs in Snowflake, and notifies the innovation team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Notion Product Innovation Pipeline Sync"
  description: "Syncs product innovation ideas from Notion to Jira epics, logs in Snowflake, and notifies the innovation team via Microsoft Teams."
  tags:
    - innovation
    - notion
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: notion_product_innov
      port: 8080
      tools:
        - name: notion-product
          description: "Given an execution date, run the notion product innovation pipeline sync process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.NOTION_PRODUCT_INNOVATION_PIPELINE_SYNC LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.NOTION_PRODUCT_INNOVATION_PIPE_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Notion Product Innovation Pipeline Sync - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_notion_product_innov_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up an Okta user by login email.

naftiko: "0.5"
info:
  label: "Okta User Lookup"
  description: "Looks up an Okta user by login email."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user
          description: "Given an Okta user login, retrieve profile details. Use for identity verification."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login email."
          call: "okta.get-user"
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://unilever.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_login}}"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves current headcount by brand division and cost center from Workday for workforce planning and payroll cost analysis.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Retrieves current headcount by brand division and cost center from Workday for workforce planning and payroll cost analysis."
  tags:
    - hr
    - payroll
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-by-division
          description: "Returns current active headcount grouped by Unilever brand division and cost center. Use for payroll planning and labor cost allocation."
          inputParameters:
            - name: division
              in: body
              type: string
              description: "Unilever brand division to filter (e.g., Beauty, Foods, Home Care). Leave blank for all."
          call: "workday-payroll.get-workers"
          with:
            division: "{{division}}"
          outputParameters:
            - name: total_count
              type: number
              mapping: "$.totalCount"
            - name: divisions
              type: array
              mapping: "$.divisions"
  consumes:
    - type: http
      namespace: workday-payroll
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: division
              in: query
          operations:
            - name: get-workers
              method: GET

Validates personal care product ingredients against regulatory databases in Snowflake, flags non-compliant formulations, and alerts the regulatory affairs team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Personal Care Ingredient Compliance Checker"
  description: "Validates personal care product ingredients against regulatory databases in Snowflake, flags non-compliant formulations, and alerts the regulatory affairs team via Microsoft Teams."
  tags:
    - regulatory
    - personal-care
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: personal_care_ingred
      port: 8080
      tools:
        - name: personal-care
          description: "Given an execution date, run the personal care ingredient compliance checker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.PERSONAL_CARE_INGREDIENT_COMPLIANCE_CHEC LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.PERSONAL_CARE_INGREDIENT_COMPL_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_personal_care_ingred_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a personal care production line goes down, retrieves SAP equipment status, creates a ServiceNow ticket, and notifies plant operations via Microsoft Teams.

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

When a manufacturing plant equipment failure is reported, creates a SAP Plant Maintenance work order and notifies the maintenance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Plant Maintenance Work Order Management"
  description: "When a manufacturing plant equipment failure is reported, creates a SAP Plant Maintenance work order and notifies the maintenance team via Microsoft Teams."
  tags:
    - manufacturing
    - plant-maintenance
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-maintenance-work-order
          description: "Given a plant code, equipment ID, and fault description, create a SAP PM work order for the maintenance team and notify the plant engineer via Teams."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code where the equipment is located."
            - name: equipment_id
              in: body
              type: string
              description: "SAP equipment ID requiring maintenance."
            - name: fault_description
              in: body
              type: string
              description: "Description of the equipment fault or failure."
            - name: plant_engineer_upn
              in: body
              type: string
              description: "UPN of the plant engineer to notify."
          steps:
            - name: create-work-order
              type: call
              call: "sap-pm.create-work-order"
              with:
                plant: "{{plant_code}}"
                equipment: "{{equipment_id}}"
                short_text: "{{fault_description}}"
            - name: notify-plant-engineer
              type: call
              call: "msteams-pm.send-message"
              with:
                recipient_upn: "{{plant_engineer_upn}}"
                text: "SAP PM work order created: Equipment {{equipment_id}} at Plant {{plant_code}}. Fault: {{fault_description}}. Work order: {{create-work-order.work_order_number}}"
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams-pm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Tracks plastic packaging reduction metrics in Snowflake, computes progress against targets, refreshes Power BI dashboards, and notifies the sustainability team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Plastic Waste Reduction Progress Tracker"
  description: "Tracks plastic packaging reduction metrics in Snowflake, computes progress against targets, refreshes Power BI dashboards, and notifies the sustainability team via Microsoft Teams."
  tags:
    - sustainability
    - packaging
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plastic_waste_reduct
      port: 8080
      tools:
        - name: plastic-waste
          description: "Given an execution date, run the plastic waste reduction progress tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.PLASTIC_WASTE_REDUCTION_PROGRESS_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.PLASTIC_WASTE_REDUCTION_PROGRE_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_plastic_waste_reduct_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the last refresh status for a Power BI dataset.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status for a Power BI dataset."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a Power BI dataset ID, check refresh status. Use for dashboard monitoring."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

When a product quality non-conformance is detected in SAP QM, opens a ServiceNow quality incident, assigns it to the quality assurance team, and notifies the plant manager via Teams.

naftiko: "0.5"
info:
  label: "Product Quality Non-Conformance Alert"
  description: "When a product quality non-conformance is detected in SAP QM, opens a ServiceNow quality incident, assigns it to the quality assurance team, and notifies the plant manager via Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: handle-quality-nonconformance
          description: "Given a SAP quality notification ID and plant, create a ServiceNow quality incident, assign it to QA, and notify the plant manager via Teams with corrective action requirements."
          inputParameters:
            - name: quality_notification_id
              in: body
              type: string
              description: "The SAP quality notification ID for the non-conformance."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code where the non-conformance was detected."
            - name: product_material
              in: body
              type: string
              description: "SAP material number of the affected product."
            - name: plant_manager_upn
              in: body
              type: string
              description: "UPN of the plant manager to notify."
          steps:
            - name: get-quality-notification
              type: call
              call: "sap-quality.get-quality-notification"
              with:
                notification_id: "{{quality_notification_id}}"
            - name: create-quality-incident
              type: call
              call: "servicenow-quality.create-incident"
              with:
                short_description: "Quality NC: Material {{product_material}} at Plant {{plant_code}}"
                category: "quality_assurance"
                priority: "2"
                assignment_group: "QA_Team"
            - name: notify-plant-manager
              type: call
              call: "msteams-quality.send-message"
              with:
                recipient_upn: "{{plant_manager_upn}}"
                text: "Quality non-conformance at Plant {{plant_code}}: Material {{product_material}}. SAP notification: {{quality_notification_id}}. ServiceNow incident: {{create-quality-incident.number}}"
  consumes:
    - type: http
      namespace: sap-quality
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/A_QualityNotification('{{notification_id}}')"
          inputParameters:
            - name: notification_id
              in: path
          operations:
            - name: get-quality-notification
              method: GET
    - type: http
      namespace: servicenow-quality
      baseUri: "https://unilever.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-quality
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Places a batch on hold in SAP, creates a quality case in ServiceNow, and notifies QA and distribution via Microsoft Teams.

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

Retrieves open Salesforce opportunity pipeline for Unilever's top retail accounts and posts a weekly pipeline digest to the global sales leadership Teams channel.

naftiko: "0.5"
info:
  label: "Retail Customer Opportunity Pipeline Report"
  description: "Retrieves open Salesforce opportunity pipeline for Unilever's top retail accounts and posts a weekly pipeline digest to the global sales leadership Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-pipeline
      port: 8080
      tools:
        - name: digest-retail-pipeline
          description: "Retrieve all open Salesforce opportunities for a key account tier and post a pipeline health digest to the global sales leadership Teams channel."
          inputParameters:
            - name: account_tier
              in: body
              type: string
              description: "Retail account tier to report on (e.g., Global Strategic, Regional Key Account)."
            - name: sales_channel_id
              in: body
              type: string
              description: "Teams channel ID for global sales leadership."
          steps:
            - name: get-pipeline-data
              type: call
              call: "salesforce-pipeline.search-opportunities"
              with:
                account_tier: "{{account_tier}}"
                stage: "Open"
            - name: post-pipeline-digest
              type: call
              call: "msteams-pipeline.post-channel-message"
              with:
                channel_id: "{{sales_channel_id}}"
                text: "Retail Pipeline ({{account_tier}}): Open opps: {{get-pipeline-data.count}} | Total value: {{get-pipeline-data.total_amount}} | Closing this month: {{get-pipeline-data.closing_this_month}}"
  consumes:
    - type: http
      namespace: salesforce-pipeline
      baseUri: "https://unilever.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: account_tier
              in: query
            - name: stage
              in: query
          operations:
            - name: search-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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Identifies distribution gaps across retail channels in Snowflake, creates Jira tasks for field teams, and notifies sales management via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Retail Distribution Gap Analyzer"
  description: "Identifies distribution gaps across retail channels in Snowflake, creates Jira tasks for field teams, and notifies sales management via Microsoft Teams."
  tags:
    - sales
    - retail
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail_distribution_
      port: 8080
      tools:
        - name: retail-distribution
          description: "Given an execution date, run the retail distribution gap analyzer process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.RETAIL_DISTRIBUTION_GAP_ANALYZER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.RETAIL_DISTRIBUTION_GAP_ANALYZ_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Retail Distribution Gap Analyzer - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_retail_distribution__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Enriches a Salesforce retail account with the latest trade terms, promotional history, and volume data from SAP, and notifies the key account manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Account Enrichment"
  description: "Enriches a Salesforce retail account with the latest trade terms, promotional history, and volume data from SAP, and notifies the key account manager via Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-retailer-account
          description: "Given a Salesforce account ID and SAP customer number, fetch the latest trade terms and sales volume from SAP, update the Salesforce account record, and notify the KAM via Teams."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "The Salesforce account ID for the retail customer."
            - name: sap_customer_number
              in: body
              type: string
              description: "The SAP customer number corresponding to this retailer."
            - name: kam_upn
              in: body
              type: string
              description: "UPN of the key account manager to notify."
          steps:
            - name: get-sap-customer
              type: call
              call: "sap-sales.get-customer"
              with:
                customer_number: "{{sap_customer_number}}"
            - name: update-sf-account
              type: call
              call: "salesforce.update-account"
              with:
                account_id: "{{salesforce_account_id}}"
                annual_revenue: "{{get-sap-customer.annual_revenue}}"
                trade_terms: "{{get-sap-customer.trade_terms}}"
            - name: notify-kam
              type: call
              call: "msteams-sales.send-message"
              with:
                recipient_upn: "{{kam_upn}}"
                text: "Account enriched: SAP customer {{sap_customer_number}} data synced to Salesforce. Trade terms: {{get-sap-customer.trade_terms}}. Annual revenue: {{get-sap-customer.annual_revenue}}"
  consumes:
    - type: http
      namespace: sap-sales
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/A_BusinessPartner('{{customer_number}}')"
          inputParameters:
            - name: customer_number
              in: path
          operations:
            - name: get-customer
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://unilever.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH
    - type: http
      namespace: msteams-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Retrieves a Salesforce account record by ID, returning account name, industry, annual revenue, and owner."
  tags:
    - sales
    - salesforce
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up a Salesforce account by ID. Returns name, industry, revenue, and owner."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: annual_revenue
              type: string
              mapping: "$.AnnualRevenue"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://unilever.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Prepares key account quarterly review packages from Salesforce data in Snowflake, refreshes Power BI dashboards, and notifies account managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Key Account Quarterly Review"
  description: "Prepares key account quarterly review packages from Salesforce data in Snowflake, refreshes Power BI dashboards, and notifies account managers via Microsoft Teams."
  tags:
    - sales
    - salesforce
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce_key_accou
      port: 8080
      tools:
        - name: salesforce-key
          description: "Given an execution date, run the salesforce key account quarterly review process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SALESFORCE_KEY_ACCOUNT_QUARTERLY_REVIEW LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SALESFORCE_KEY_ACCOUNT_QUARTER_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_salesforce_key_accou_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors contract lifecycle events in SAP Ariba via Snowflake, flags expiring contracts, creates Jira renewal tasks, and notifies procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Lifecycle Monitor"
  description: "Monitors contract lifecycle events in SAP Ariba via Snowflake, flags expiring contracts, creates Jira renewal tasks, and notifies procurement via Microsoft Teams."
  tags:
    - procurement
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_ariba_contract_l
      port: 8080
      tools:
        - name: sap-ariba
          description: "Given an execution date, run the sap ariba contract lifecycle monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_ARIBA_CONTRACT_LIFECYCLE_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_ARIBA_CONTRACT_LIFECYCLE_M_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "SAP Ariba Contract Lifecycle Monitor - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_ariba_contract_l_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a new supplier is approved in SAP Ariba, creates their vendor master record in SAP S/4HANA, notifies the procurement team via Teams, and opens a ServiceNow onboarding task.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "When a new supplier is approved in SAP Ariba, creates their vendor master record in SAP S/4HANA, notifies the procurement team via Teams, and opens a ServiceNow onboarding task."
  tags:
    - procurement
    - supplier-management
    - sap-ariba
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-new-supplier
          description: "Given an approved SAP Ariba supplier ID, create the vendor master in SAP S/4HANA, open a ServiceNow supplier setup task, and notify the category manager via Teams."
          inputParameters:
            - name: ariba_supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID that has been approved."
            - name: category_manager_upn
              in: body
              type: string
              description: "UPN of the category manager to notify."
          steps:
            - name: get-ariba-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplierId: "{{ariba_supplier_id}}"
            - name: create-sap-vendor
              type: call
              call: "sap-vendor.create-vendor-master"
              with:
                name: "{{get-ariba-supplier.name}}"
                country: "{{get-ariba-supplier.country}}"
                tax_id: "{{get-ariba-supplier.tax_id}}"
            - name: create-setup-task
              type: call
              call: "servicenow-supplier.create-task"
              with:
                short_description: "Supplier setup: {{get-ariba-supplier.name}} — Ariba ID {{ariba_supplier_id}}"
                category: "procurement"
                assignment_group: "Procurement_Ops"
            - name: notify-category-manager
              type: call
              call: "msteams-supplier.send-message"
              with:
                recipient_upn: "{{category_manager_upn}}"
                text: "New supplier onboarded: {{get-ariba-supplier.name}} | SAP vendor: {{create-sap-vendor.vendor_number}} | Setup task: {{create-setup-task.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: apikey
        key: "apikey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: suppliers
          path: "/suppliers/{{supplierId}}"
          inputParameters:
            - name: supplierId
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: sap-vendor
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendor-master
          path: "/A_BusinessPartner"
          operations:
            - name: create-vendor-master
              method: POST
    - type: http
      namespace: servicenow-supplier
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-supplier
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Traces batch genealogy from raw materials to finished goods in SAP via Snowflake, logs the full chain, and notifies the quality team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Batch Genealogy Traceability Chain"
  description: "Traces batch genealogy from raw materials to finished goods in SAP via Snowflake, logs the full chain, and notifies the quality team via Microsoft Teams."
  tags:
    - quality
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_batch_genealogy_
      port: 8080
      tools:
        - name: sap-batch
          description: "Given an execution date, run the sap batch genealogy traceability chain process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_BATCH_GENEALOGY_TRACEABILITY_CHAIN LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_BATCH_GENEALOGY_TRACEABILI_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_batch_genealogy__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves batch details from SAP, returning production date, expiry date, and batch status for personal care and food product traceability.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Retrieves batch details from SAP, returning production date, expiry date, and batch status for personal care and food product traceability."
  tags:
    - manufacturing
    - sap
    - quality
    - traceability
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: get-batch-details
          description: "Look up batch traceability in SAP. Returns production date, expiry, and status."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number."
          call: sap.get-batch
          with:
            material_number: "{{material_number}}"
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: production_date
              type: string
              mapping: "$.d.MfgDate"
            - name: expiry_date
              type: string
              mapping: "$.d.ShelfLifeExpirationDate"
            - name: batch_status
              type: string
              mapping: "$.d.BatchStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch(Material='{{material_number}}',Batch='{{batch_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET

Retrieves a billing document from SAP by number.

naftiko: "0.5"
info:
  label: "SAP Billing Document Lookup"
  description: "Retrieves a billing document from SAP by number."
  tags:
    - finance
    - sap
    - billing
capability:
  exposes:
    - type: mcp
      namespace: billing
      port: 8080
      tools:
        - name: get-billing-doc
          description: "Given a SAP billing document number, retrieve details. Use for revenue reconciliation."
          inputParameters:
            - name: billing_doc
              in: body
              type: string
              description: "The SAP billing document number."
          call: "sap.get-billing-doc"
          with:
            billing_doc: "{{billing_doc}}"
          outputParameters:
            - name: net_value
              type: string
              mapping: "$.d.TotalNetAmount"
            - name: payer
              type: string
              mapping: "$.d.PayerParty"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: billing-docs
          path: "/A_BillingDocument('{{billing_doc}}')"
          inputParameters:
            - name: billing_doc
              in: path
          operations:
            - name: get-billing-doc
              method: GET

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

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

Retrieves cost center details from SAP including description and responsible person.

naftiko: "0.5"
info:
  label: "SAP Cost Center Lookup"
  description: "Retrieves cost center details from SAP including description and responsible person."
  tags:
    - finance
    - sap
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-cost-center
          description: "Given a SAP cost center ID, retrieve details. Use for financial reporting."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center ID."
          call: "sap.get-cost-center"
          with:
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.CostCenterDescription"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center
              method: GET

Processes SAP credit memo requests, validates against original invoices in Snowflake, creates ServiceNow approval cases, and notifies the AR team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Credit Memo Processing Workflow"
  description: "Processes SAP credit memo requests, validates against original invoices in Snowflake, creates ServiceNow approval cases, and notifies the AR team via Microsoft Teams."
  tags:
    - finance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_credit_memo_proc
      port: 8080
      tools:
        - name: sap-credit
          description: "Given an execution date, run the sap credit memo processing workflow process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_CREDIT_MEMO_PROCESSING_WORKFLOW LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_CREDIT_MEMO_PROCESSING_WOR_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "finance"
                short_description: "SAP Credit Memo Processing Workflow processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_credit_memo_proc_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves customer master data from SAP by customer number.

naftiko: "0.5"
info:
  label: "SAP Customer Master Lookup"
  description: "Retrieves customer master data from SAP by customer number."
  tags:
    - sales
    - sap
    - customer-data
capability:
  exposes:
    - type: mcp
      namespace: customer-data
      port: 8080
      tools:
        - name: get-customer
          description: "Given a SAP customer number, retrieve master data. Use for customer verification."
          inputParameters:
            - name: customer_number
              in: body
              type: string
              description: "The SAP customer number."
          call: "sap.get-customer"
          with:
            customer_number: "{{customer_number}}"
          outputParameters:
            - name: customer_name
              type: string
              mapping: "$.d.CustomerName"
            - name: country
              type: string
              mapping: "$.d.Country"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/A_Customer('{{customer_number}}')"
          inputParameters:
            - name: customer_number
              in: path
          operations:
            - name: get-customer
              method: GET

Monitors customs compliance status from SAP in Snowflake, flags delayed clearances, creates ServiceNow cases, and alerts the trade compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Customs Trade Compliance Monitor"
  description: "Monitors customs compliance status from SAP in Snowflake, flags delayed clearances, creates ServiceNow cases, and alerts the trade compliance team via Microsoft Teams."
  tags:
    - compliance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_customs_trade_co
      port: 8080
      tools:
        - name: sap-customs
          description: "Given an execution date, run the sap customs trade compliance monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_CUSTOMS_TRADE_COMPLIANCE_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_CUSTOMS_TRADE_COMPLIANCE_M_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "compliance"
                short_description: "SAP Customs Trade Compliance Monitor processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_customs_trade_co_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

Runs demand sensing algorithms against POS data in Snowflake, updates SAP forecast, and notifies the demand planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Demand Sensing Pipeline"
  description: "Runs demand sensing algorithms against POS data in Snowflake, updates SAP forecast, and notifies the demand planning team via Microsoft Teams."
  tags:
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_demand_sensing_p
      port: 8080
      tools:
        - name: sap-demand
          description: "Given an execution date, run the sap demand sensing pipeline process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_DEMAND_SENSING_PIPELINE LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_DEMAND_SENSING_PIPELINE_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_demand_sensing_p_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes factory yield data from SAP in Snowflake, identifies improvement opportunities, creates Jira tasks, and notifies plant management via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Factory Yield Optimization Report"
  description: "Analyzes factory yield data from SAP in Snowflake, identifies improvement opportunities, creates Jira tasks, and notifies plant management via Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_factory_yield_op
      port: 8080
      tools:
        - name: sap-factory
          description: "Given an execution date, run the sap factory yield optimization report process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_FACTORY_YIELD_OPTIMIZATION_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_FACTORY_YIELD_OPTIMIZATION_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "SAP Factory Yield Optimization Report - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_factory_yield_op_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the GL balance from SAP for a given company code and account.

naftiko: "0.5"
info:
  label: "SAP General Ledger Balance Lookup"
  description: "Retrieves the GL balance from SAP for a given company code and account."
  tags:
    - finance
    - sap
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: accounting
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Given a company code and GL account, retrieve the balance. Use for financial close."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: gl_account
              in: body
              type: string
              description: "The GL account number."
          call: "sap.get-gl-balance"
          with:
            company_code: "{{company_code}}"
            gl_account: "{{gl_account}}"
          outputParameters:
            - name: balance
              type: string
              mapping: "$.d.EndingBalanceAmtInCoCodeCrcy"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountLineItem"
          operations:
            - name: get-gl-balance
              method: GET

Retrieves a goods movement document from SAP by document number, returning material, quantity, movement type, and posting date.

naftiko: "0.5"
info:
  label: "SAP Goods Movement Lookup"
  description: "Retrieves a goods movement document from SAP by document number, returning material, quantity, movement type, and posting date."
  tags:
    - logistics
    - sap
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: goods-movement
      port: 8080
      tools:
        - name: get-goods-movement
          description: "Given a SAP material document number, retrieve goods movement details including movement type, quantity, and storage location. Use for inventory transaction audits."
          inputParameters:
            - name: document_number
              in: body
              type: string
              description: "The SAP material document number."
          call: "sap.get-goods-movement"
          with:
            document_number: "{{document_number}}"
          outputParameters:
            - name: movement_type
              type: string
              mapping: "$.d.GoodsMovementType"
            - name: quantity
              type: string
              mapping: "$.d.QuantityInEntryUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader('{{document_number}}')"
          inputParameters:
            - name: document_number
              in: path
          operations:
            - name: get-goods-movement
              method: GET

Reconciles intercompany elimination entries in SAP via Snowflake, flags imbalances, creates ServiceNow tasks, and notifies the consolidation team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Intercompany Elimination Reconciler"
  description: "Reconciles intercompany elimination entries in SAP via Snowflake, flags imbalances, creates ServiceNow tasks, and notifies the consolidation team via Microsoft Teams."
  tags:
    - finance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_intercompany_eli
      port: 8080
      tools:
        - name: sap-intercompany
          description: "Given an execution date, run the sap intercompany elimination reconciler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_INTERCOMPANY_ELIMINATION_RECONCILER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_INTERCOMPANY_ELIMINATION_R_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "finance"
                short_description: "SAP Intercompany Elimination Reconciler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_intercompany_eli_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves real-time stock levels for a material from SAP S/4HANA.

naftiko: "0.5"
info:
  label: "SAP Material Stock Check"
  description: "Retrieves real-time stock levels for a material from SAP S/4HANA."
  tags:
    - supply-chain
    - sap
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-material-stock
          description: "Given a SAP material number, retrieve stock levels. Use for inventory checks."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-stock"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: unrestricted_qty
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-stock
              method: GET

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

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

Processes MRP exception messages from SAP in Snowflake, creates ServiceNow urgency cases, and alerts the supply planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP MRP Exception Handler"
  description: "Processes MRP exception messages from SAP in Snowflake, creates ServiceNow urgency cases, and alerts the supply planning team via Microsoft Teams."
  tags:
    - supply-chain
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_mrp_exception_ha
      port: 8080
      tools:
        - name: sap-mrp
          description: "Given an execution date, run the sap mrp exception handler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_MRP_EXCEPTION_HANDLER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_MRP_EXCEPTION_HANDLER_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "supply-chain"
                short_description: "SAP MRP Exception Handler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_mrp_exception_ha_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Validates SAP period-end close completeness in Snowflake, flags open items, creates ServiceNow tasks, and notifies the accounting team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Period End Close Validator"
  description: "Validates SAP period-end close completeness in Snowflake, flags open items, creates ServiceNow tasks, and notifies the accounting team via Microsoft Teams."
  tags:
    - finance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_period_end_close
      port: 8080
      tools:
        - name: sap-period
          description: "Given an execution date, run the sap period end close validator process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_PERIOD_END_CLOSE_VALIDATOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_PERIOD_END_CLOSE_VALIDATOR_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "finance"
                short_description: "SAP Period End Close Validator processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_period_end_close_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

Runs predictive maintenance models against SAP sensor data in Snowflake, creates ServiceNow work orders, and notifies the maintenance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Predictive Scheduler"
  description: "Runs predictive maintenance models against SAP sensor data in Snowflake, creates ServiceNow work orders, and notifies the maintenance team via Microsoft Teams."
  tags:
    - maintenance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_plant_maintenanc
      port: 8080
      tools:
        - name: sap-plant
          description: "Given an execution date, run the sap plant maintenance predictive scheduler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_PLANT_MAINTENANCE_PREDICTIVE_SCHEDUL LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_PLANT_MAINTENANCE_PREDICTI_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "maintenance"
                short_description: "SAP Plant Maintenance Predictive Scheduler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_plant_maintenanc_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a production order status from SAP by order number.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Lookup"
  description: "Retrieves a production order status from SAP by order number."
  tags:
    - manufacturing
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Given a SAP production order number, retrieve the order status. Use for production tracking."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The production order number."
          call: "sap.get-production-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Retrieves the status of a SAP production order including planned quantity, confirmed quantity, and system status for personal care and home care manufacturing.

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

Detects production scheduling conflicts in SAP via Snowflake, creates ServiceNow escalation cases, and notifies the planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Production Scheduling Conflict Resolver"
  description: "Detects production scheduling conflicts in SAP via Snowflake, creates ServiceNow escalation cases, and notifies the planning team via Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_production_sched
      port: 8080
      tools:
        - name: sap-production
          description: "Given an execution date, run the sap production scheduling conflict resolver process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_PRODUCTION_SCHEDULING_CONFLICT_RESOL LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_PRODUCTION_SCHEDULING_CONF_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "manufacturing"
                short_description: "SAP Production Scheduling Conflict Resolver processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_production_sched_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP S/4HANA purchase order by PO number and returns vendor, status, and line item details for procurement verification.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Retrieves a SAP S/4HANA purchase order by PO number and returns vendor, status, and line item details for procurement verification."
  tags:
    - procurement
    - sap
    - finance
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, and currency. Use for procurement approvals and invoice three-way match."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., 4500012345)."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-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

Generates quality certificates for shipped batches from SAP data in Snowflake, logs issuance, creates ServiceNow records, and notifies the QA team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Quality Certificate Generator"
  description: "Generates quality certificates for shipped batches from SAP data in Snowflake, logs issuance, creates ServiceNow records, and notifies the QA team via Microsoft Teams."
  tags:
    - quality
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_quality_certific
      port: 8080
      tools:
        - name: sap-quality
          description: "Given an execution date, run the sap quality certificate generator process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_QUALITY_CERTIFICATE_GENERATOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_QUALITY_CERTIFICATE_GENERA_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "quality"
                short_description: "SAP Quality Certificate Generator processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_quality_certific_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

Processes returned goods in SAP, logs return reasons in Snowflake, creates Jira root cause analysis tasks, and notifies the quality team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Returned Goods Processing Chain"
  description: "Processes returned goods in SAP, logs return reasons in Snowflake, creates Jira root cause analysis tasks, and notifies the quality team via Microsoft Teams."
  tags:
    - quality
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_returned_goods_p
      port: 8080
      tools:
        - name: sap-returned
          description: "Given an execution date, run the sap returned goods processing chain process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_RETURNED_GOODS_PROCESSING_CHAIN LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_RETURNED_GOODS_PROCESSING__RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "SAP Returned Goods Processing Chain - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_returned_goods_p_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves routing operations for a material from SAP, returning operation details and work center.

naftiko: "0.5"
info:
  label: "SAP Routing Operation Lookup"
  description: "Retrieves routing operations for a material from SAP, returning operation details and work center."
  tags:
    - manufacturing
    - sap
    - production-planning
capability:
  exposes:
    - type: mcp
      namespace: production-planning
      port: 8080
      tools:
        - name: get-routing
          description: "Given a SAP material and plant, retrieve routing operations. Use for production planning."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant
              in: body
              type: string
              description: "The SAP plant code."
          call: "sap.get-routing"
          with:
            material_number: "{{material_number}}"
            plant: "{{plant}}"
          outputParameters:
            - name: work_center
              type: string
              mapping: "$.d.WorkCenter"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ROUTING"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: routings
          path: "/A_ProductionRouting"
          operations:
            - name: get-routing
              method: GET

Retrieves a SAP sales order by number, returning customer, status, and value.

naftiko: "0.5"
info:
  label: "SAP Sales Order Lookup"
  description: "Retrieves a SAP sales order by number, returning customer, status, and value."
  tags:
    - sales
    - sap
    - order-management
capability:
  exposes:
    - type: mcp
      namespace: order-management
      port: 8080
      tools:
        - name: get-sales-order
          description: "Given a SAP sales order number, retrieve order details. Use for order status inquiries."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP sales order number."
          call: "sap.get-sales-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: customer
              type: string
              mapping: "$.d.SoldToParty"
            - name: net_value
              type: string
              mapping: "$.d.TotalNetAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET

Monitors shelf life expiration dates for stocked materials in SAP via Snowflake, flags soon-to-expire inventory, creates ServiceNow tasks, and alerts the warehouse team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Shelf Life Expiry Alert"
  description: "Monitors shelf life expiration dates for stocked materials in SAP via Snowflake, flags soon-to-expire inventory, creates ServiceNow tasks, and alerts the warehouse team via Microsoft Teams."
  tags:
    - supply-chain
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_shelf_life_expir
      port: 8080
      tools:
        - name: sap-shelf
          description: "Given an execution date, run the sap shelf life expiry alert process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_SHELF_LIFE_EXPIRY_ALERT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_SHELF_LIFE_EXPIRY_ALERT_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "supply-chain"
                short_description: "SAP Shelf Life Expiry Alert processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_shelf_life_expir_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes transportation costs from SAP in Snowflake, identifies optimization opportunities, creates Jira tasks, and notifies the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Transportation Cost Analysis"
  description: "Analyzes transportation costs from SAP in Snowflake, identifies optimization opportunities, creates Jira tasks, and notifies the logistics team via Microsoft Teams."
  tags:
    - logistics
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_transportation_c
      port: 8080
      tools:
        - name: sap-transportation
          description: "Given an execution date, run the sap transportation cost analysis process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_TRANSPORTATION_COST_ANALYSIS LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_TRANSPORTATION_COST_ANALYS_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "SAP Transportation Cost Analysis - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_transportation_c_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a transportation order from SAP, returning carrier, route, and status.

naftiko: "0.5"
info:
  label: "SAP Transportation Order Lookup"
  description: "Retrieves a transportation order from SAP, returning carrier, route, and status."
  tags:
    - logistics
    - sap
    - transportation
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-transport-order
          description: "Given a SAP transportation order number, retrieve details. Use for shipment tracking."
          inputParameters:
            - name: transport_order
              in: body
              type: string
              description: "The transportation order number."
          call: "sap.get-transport"
          with:
            transport_order: "{{transport_order}}"
          outputParameters:
            - name: carrier
              type: string
              mapping: "$.d.Carrier"
            - name: status
              type: string
              mapping: "$.d.TransportationStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transport-orders
          path: "/FreightOrder('{{transport_order}}')"
          inputParameters:
            - name: transport_order
              in: path
          operations:
            - name: get-transport
              method: GET

Computes vendor evaluation scorecards from SAP data in Snowflake, flags underperformers, creates Jira review tasks, and notifies procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Vendor Evaluation Scorecard"
  description: "Computes vendor evaluation scorecards from SAP data in Snowflake, flags underperformers, creates Jira review tasks, and notifies procurement via Microsoft Teams."
  tags:
    - procurement
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_vendor_evaluatio
      port: 8080
      tools:
        - name: sap-vendor
          description: "Given an execution date, run the sap vendor evaluation scorecard process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_VENDOR_EVALUATION_SCORECARD LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_VENDOR_EVALUATION_SCORECAR_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "SAP Vendor Evaluation Scorecard - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_vendor_evaluatio_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves vendor master data from SAP, returning company name, country, and payment terms.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Data Lookup"
  description: "Retrieves vendor master data from SAP, returning company name, country, and payment terms."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: vendor-management
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up SAP vendor master data. Returns company name, country, and payment terms."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
          call: sap.get-vendor
          with:
            vendor_id: "{{vendor_id}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.BusinessPartnerFullName"
            - name: country
              type: string
              mapping: "$.d.Country"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_BusinessPartner('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Retrieves vendor master data from SAP.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, retrieve master data. Use for supplier verification."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: "sap.get-vendor"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Tracks manufacturing waste data from SAP in Snowflake, validates regulatory compliance, creates ServiceNow audit tasks, and notifies the EHS team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Waste Management Compliance Report"
  description: "Tracks manufacturing waste data from SAP in Snowflake, validates regulatory compliance, creates ServiceNow audit tasks, and notifies the EHS team via Microsoft Teams."
  tags:
    - sustainability
    - compliance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_waste_management
      port: 8080
      tools:
        - name: sap-waste
          description: "Given an execution date, run the sap waste management compliance report process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_WASTE_MANAGEMENT_COMPLIANCE_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_WASTE_MANAGEMENT_COMPLIANC_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "sustainability"
                short_description: "SAP Waste Management Compliance Report processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_waste_management_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a ServiceNow incident by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, retrieve details. Use for status checks."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The incident number."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

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

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

Identifies SAP Ariba contracts expiring within 90 days, creates a ServiceNow renewal task for the responsible category manager, and notifies them via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Contract Renewal Alert"
  description: "Identifies SAP Ariba contracts expiring within 90 days, creates a ServiceNow renewal task for the responsible category manager, and notifies them via Microsoft Teams."
  tags:
    - procurement
    - contracts
    - sap-ariba
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-management
      port: 8080
      tools:
        - name: alert-contract-expiry
          description: "Given a SAP Ariba contract ID, retrieve expiry details, create a ServiceNow renewal task, and notify the category manager via Teams with renewal action items."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP Ariba contract ID approaching expiry."
            - name: category_manager_upn
              in: body
              type: string
              description: "UPN of the category manager responsible for contract renewal."
          steps:
            - name: get-contract
              type: call
              call: "ariba-contract.get-contract"
              with:
                contractId: "{{contract_id}}"
            - name: create-renewal-task
              type: call
              call: "servicenow-contract.create-task"
              with:
                short_description: "Contract renewal: {{get-contract.title}} — expires {{get-contract.expirationDate}}"
                category: "procurement"
                assignment_group: "Category_Management"
            - name: notify-category-manager
              type: call
              call: "msteams-contract.send-message"
              with:
                recipient_upn: "{{category_manager_upn}}"
                text: "Contract expiry alert: {{get-contract.title}} expires {{get-contract.expirationDate}}. Renewal task: {{create-renewal-task.number}}. Please initiate supplier negotiations."
  consumes:
    - type: http
      namespace: ariba-contract
      baseUri: "https://openapi.ariba.com/api/contract-management/v1"
      authentication:
        type: apikey
        key: "apikey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: contracts
          path: "/contracts/{{contractId}}"
          inputParameters:
            - name: contractId
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: servicenow-contract
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-contract
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Tracks supplier diversity spend metrics in Snowflake, computes progress against targets, refreshes Power BI dashboards, and notifies procurement leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Diversity Spend Tracker"
  description: "Tracks supplier diversity spend metrics in Snowflake, computes progress against targets, refreshes Power BI dashboards, and notifies procurement leadership via Microsoft Teams."
  tags:
    - procurement
    - diversity
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier_diversity_s
      port: 8080
      tools:
        - name: supplier-diversity
          description: "Given an execution date, run the supplier diversity spend tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SUPPLIER_DIVERSITY_SPEND_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SUPPLIER_DIVERSITY_SPEND_TRACK_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_supplier_diversity_s_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a supplier invoice arrives in SAP, validates it against the purchase order, routes for approval in ServiceNow, and notifies the accounts payable team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Invoice Processing and Approval"
  description: "When a supplier invoice arrives in SAP, validates it against the purchase order, routes for approval in ServiceNow, and notifies the accounts payable team via Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: process-supplier-invoice
          description: "Given a SAP invoice number and PO number, validate the invoice for three-way match, create a ServiceNow approval task, and notify the AP team lead via Teams."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP supplier invoice number."
            - name: po_number
              in: body
              type: string
              description: "The associated purchase order number for three-way match."
            - name: invoice_amount
              in: body
              type: number
              description: "Invoice amount in local currency."
          steps:
            - name: get-invoice
              type: call
              call: "sap-invoice.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
            - name: create-approval-task
              type: call
              call: "servicenow-ap.create-task"
              with:
                short_description: "Invoice approval: {{invoice_number}} vs PO {{po_number}} — {{invoice_amount}}"
                category: "accounts_payable"
                assignment_group: "AP_Team"
            - name: notify-ap-lead
              type: call
              call: "msteams-ap.send-message"
              with:
                recipient_upn: "ap-lead@unilever.com"
                text: "Invoice {{invoice_number}} pending approval. PO: {{po_number}}, Amount: {{invoice_amount}}. Task: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: sap-invoice
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: servicenow-ap
      baseUri: "https://unilever.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls demand forecast signals from Salesforce opportunity pipeline for key retail customers and updates SAP supply planning parameters to align production with anticipated demand.

naftiko: "0.5"
info:
  label: "Supply Chain Demand Signal Sync"
  description: "Pulls demand forecast signals from Salesforce opportunity pipeline for key retail customers and updates SAP supply planning parameters to align production with anticipated demand."
  tags:
    - supply-chain
    - sap
    - salesforce
    - demand-planning
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: sync-demand-signals
          description: "Given a retail account ID in Salesforce, retrieve opportunity pipeline demand signals and update SAP supply planning parameters to reflect anticipated order volumes."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "The Salesforce account ID of the retail customer."
            - name: planning_horizon_months
              in: body
              type: integer
              description: "Number of months forward for the demand signal (1-12)."
          steps:
            - name: get-sf-pipeline
              type: call
              call: "salesforce-supply.get-account-opportunities"
              with:
                account_id: "{{salesforce_account_id}}"
            - name: update-sap-demand
              type: call
              call: "sap-supply.update-demand-plan"
              with:
                customer_id: "{{get-sf-pipeline.sap_customer_number}}"
                forecast_quantity: "{{get-sf-pipeline.total_quantity}}"
                horizon_months: "{{planning_horizon_months}}"
  consumes:
    - type: http
      namespace: salesforce-supply
      baseUri: "https://unilever.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Account/{{account_id}}/Opportunities"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-opportunities
              method: GET
    - type: http
      namespace: sap-supply
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_REQUIREMENTS_PLANNING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: demand-plans
          path: "/A_DemandPlanItem"
          operations:
            - name: update-demand-plan
              method: POST

Retrieves SAP sustainability data (carbon emissions, water usage, waste) for a reporting period and publishes a sustainability KPI digest to the Unilever ESG leadership Teams channel.

naftiko: "0.5"
info:
  label: "Sustainability KPI Reporting"
  description: "Retrieves SAP sustainability data (carbon emissions, water usage, waste) for a reporting period and publishes a sustainability KPI digest to the Unilever ESG leadership Teams channel."
  tags:
    - sustainability
    - esg
    - sap
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sustainability-reporting
      port: 8080
      tools:
        - name: publish-sustainability-kpis
          description: "Given a reporting quarter and plant or business unit, retrieve carbon, water, and waste KPIs from SAP and post a sustainability performance digest to the ESG leadership Teams channel."
          inputParameters:
            - name: reporting_quarter
              in: body
              type: string
              description: "Reporting quarter in YYYY-QN format (e.g., 2026-Q1)."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code to report on. Leave blank for global rollup."
            - name: esg_channel_id
              in: body
              type: string
              description: "Teams channel ID for the ESG leadership team."
          steps:
            - name: get-sustainability-data
              type: call
              call: "sap-esg.get-sustainability-kpis"
              with:
                period: "{{reporting_quarter}}"
                plant: "{{plant_code}}"
            - name: post-esg-digest
              type: call
              call: "msteams-esg.post-channel-message"
              with:
                channel_id: "{{esg_channel_id}}"
                text: "Sustainability Report ({{reporting_quarter}}): CO2e: {{get-sustainability-data.carbon_tonnes}}t | Water: {{get-sustainability-data.water_m3}}m³ | Waste recycled: {{get-sustainability-data.waste_recycled_pct}}% | Renewable energy: {{get-sustainability-data.renewable_energy_pct}}%"
  consumes:
    - type: http
      namespace: sap-esg
      baseUri: "https://unilever-s4.sap.com/sap/opu/odata/sap/SUSTAINABILITY_REPORTING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sustainability-kpis
          path: "/SustainabilityKPI"
          inputParameters:
            - name: period
              in: query
            - name: plant
              in: query
          operations:
            - name: get-sustainability-kpis
              method: GET
    - type: http
      namespace: msteams-esg
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks palm oil sourcing traceability in Snowflake, validates against sustainability commitments, creates Jira action items, and notifies the sustainability team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sustainable Sourcing Palm Oil Tracker"
  description: "Tracks palm oil sourcing traceability in Snowflake, validates against sustainability commitments, creates Jira action items, and notifies the sustainability team via Microsoft Teams."
  tags:
    - sustainability
    - sourcing
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainable_sourcing
      port: 8080
      tools:
        - name: sustainable-sourcing
          description: "Given an execution date, run the sustainable sourcing palm oil tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SUSTAINABLE_SOURCING_PALM_OIL_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SUSTAINABLE_SOURCING_PALM_OIL__RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Sustainable Sourcing Palm Oil Tracker - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sustainable_sourcing_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes trade promotion lift and ROI in Snowflake, refreshes Power BI dashboards, and distributes insights to category managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Promotion Effectiveness Analyzer"
  description: "Analyzes trade promotion lift and ROI in Snowflake, refreshes Power BI dashboards, and distributes insights to category managers via Microsoft Teams."
  tags:
    - marketing
    - trade-promotion
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade_promotion_effe
      port: 8080
      tools:
        - name: trade-promotion
          description: "Given an execution date, run the trade promotion effectiveness analyzer process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.TRADE_PROMOTION_EFFECTIVENESS_ANALYZER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.TRADE_PROMOTION_EFFECTIVENESS__RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_trade_promotion_effe_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles SAP Concur expense reports against corporate travel bookings for a given reporting period, flags policy violations, and routes exceptions to the finance team via Teams.

naftiko: "0.5"
info:
  label: "Travel Expense Report Reconciliation"
  description: "Reconciles SAP Concur expense reports against corporate travel bookings for a given reporting period, flags policy violations, and routes exceptions to the finance team via Teams."
  tags:
    - finance
    - travel-expense
    - sap-concur
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: travel-expense
      port: 8080
      tools:
        - name: reconcile-travel-expenses
          description: "Given a reporting period, retrieve all Concur expense reports, identify policy violations, and notify the finance team via Teams with a reconciliation summary."
          inputParameters:
            - name: period_start
              in: body
              type: string
              description: "Start of the reconciliation period in YYYY-MM-DD format."
            - name: period_end
              in: body
              type: string
              description: "End of the reconciliation period in YYYY-MM-DD format."
            - name: finance_channel_id
              in: body
              type: string
              description: "Teams channel ID for the finance team."
          steps:
            - name: get-expense-reports
              type: call
              call: "concur.get-expense-reports"
              with:
                modifiedAfter: "{{period_start}}"
                modifiedBefore: "{{period_end}}"
            - name: post-reconciliation-summary
              type: call
              call: "msteams-expense.post-channel-message"
              with:
                channel_id: "{{finance_channel_id}}"
                text: "Expense Reconciliation ({{period_start}} to {{period_end}}): Reports: {{get-expense-reports.count}} | Total: {{get-expense-reports.total_amount}} | Policy violations: {{get-expense-reports.violations_count}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: modifiedAfter
              in: query
            - name: modifiedBefore
              in: query
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: msteams-expense
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks water usage metrics from manufacturing in Snowflake, computes progress against sustainability goals, and notifies the ESG team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Water Usage Sustainability Reporter"
  description: "Tracks water usage metrics from manufacturing in Snowflake, computes progress against sustainability goals, and notifies the ESG team via Microsoft Teams."
  tags:
    - sustainability
    - manufacturing
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: water_usage_sustaina
      port: 8080
      tools:
        - name: water-usage
          description: "Given an execution date, run the water usage sustainability reporter process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WATER_USAGE_SUSTAINABILITY_REPORTER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WATER_USAGE_SUSTAINABILITY_REP_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_water_usage_sustaina_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes employee engagement survey results from Workday in Snowflake, generates insights, and distributes to HR business partners via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Employee Engagement Survey Processor"
  description: "Processes employee engagement survey results from Workday in Snowflake, generates insights, and distributes to HR business partners via Microsoft Teams."
  tags:
    - hr
    - engagement
    - workday
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_employee_eng
      port: 8080
      tools:
        - name: workday-employee
          description: "Given an execution date, run the workday employee engagement survey processor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_EMPLOYEE_ENGAGEMENT_SURVEY_PROCE LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_EMPLOYEE_ENGAGEMENT_SU_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_employee_eng_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and manager."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a Unilever employee profile in Workday. Returns full name, department, job title, and manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.descriptor"
            - name: department
              type: string
              mapping: "$.worker.primaryPosition.department"
            - name: job_title
              type: string
              mapping: "$.worker.primaryPosition.jobTitle"
            - name: manager
              type: string
              mapping: "$.worker.primaryPosition.manager.descriptor"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/unilever/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Tracks employee global mobility assignments in Workday via Snowflake, flags upcoming visa expirations, creates Jira tasks, and notifies HR via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Global Mobility Tracker"
  description: "Tracks employee global mobility assignments in Workday via Snowflake, flags upcoming visa expirations, creates Jira tasks, and notifies HR via Microsoft Teams."
  tags:
    - hr
    - global-mobility
    - workday
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_global_mobil
      port: 8080
      tools:
        - name: workday-global
          description: "Given an execution date, run the workday global mobility tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_GLOBAL_MOBILITY_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_GLOBAL_MOBILITY_TRACKE_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Workday Global Mobility Tracker - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_global_mobil_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Compares Workday headcount against budget in Snowflake, flags variances, refreshes Power BI dashboards, and notifies finance via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Headcount Budget Variance Report"
  description: "Compares Workday headcount against budget in Snowflake, flags variances, refreshes Power BI dashboards, and notifies finance via Microsoft Teams."
  tags:
    - hr
    - finance
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_headcount_bu
      port: 8080
      tools:
        - name: workday-headcount
          description: "Given an execution date, run the workday headcount budget variance report process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_HEADCOUNT_BUDGET_VARIANCE_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_HEADCOUNT_BUDGET_VARIA_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_headcount_bu_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls succession planning data from Workday into Snowflake, identifies gaps, creates Jira development plans, and notifies HR leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Succession Planning Digest"
  description: "Pulls succession planning data from Workday into Snowflake, identifies gaps, creates Jira development plans, and notifies HR leadership via Microsoft Teams."
  tags:
    - hr
    - succession-planning
    - workday
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_succession_p
      port: 8080
      tools:
        - name: workday-succession
          description: "Given an execution date, run the workday succession planning digest process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_SUCCESSION_PLANNING_DIGEST LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_SUCCESSION_PLANNING_DI_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ULOPS"
                issue_type: "Task"
                summary: "Workday Succession Planning Digest - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_succession_p_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://unilever.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://unilever.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls gender, ethnicity, and leadership representation data from Workday and publishes a quarterly D&I metrics digest to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workforce Diversity and Inclusion Report"
  description: "Pulls gender, ethnicity, and leadership representation data from Workday and publishes a quarterly D&I metrics digest to the HR leadership Teams channel."
  tags:
    - hr
    - diversity-inclusion
    - workday
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: di-reporting
      port: 8080
      tools:
        - name: publish-di-report
          description: "Given a reporting quarter, retrieve D&I workforce metrics from Workday and post a quarterly diversity and inclusion digest to the HR leadership Teams channel."
          inputParameters:
            - name: reporting_quarter
              in: body
              type: string
              description: "Reporting quarter in YYYY-QN format (e.g., 2026-Q1)."
            - name: hr_leadership_channel_id
              in: body
              type: string
              description: "Teams channel ID for HR leadership."
          steps:
            - name: get-di-metrics
              type: call
              call: "workday-di.get-di-report"
              with:
                period: "{{reporting_quarter}}"
            - name: post-di-digest
              type: call
              call: "msteams-di.post-channel-message"
              with:
                channel_id: "{{hr_leadership_channel_id}}"
                text: "D&I Report ({{reporting_quarter}}): Women in leadership: {{get-di-metrics.women_leadership_pct}}% | Gender parity score: {{get-di-metrics.gender_parity_score}} | Diverse hires: {{get-di-metrics.diverse_hire_pct}}%"
  consumes:
    - type: http
      namespace: workday-di
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: di-report
          path: "/reports/diversityInclusion"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-di-report
              method: GET
    - type: http
      namespace: msteams-di
      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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST