Unilever Capabilities
Naftiko 0.5 capability definitions for Unilever - 100 capabilities showing integration workflows and service orchestrations.
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