Henkel Capabilities
Naftiko 0.5 capability definitions for Henkel - 101 capabilities showing integration workflows and service orchestrations.
Escalates adhesive technical support requests by retrieving product specs from SAP, creating a Zendesk escalation ticket, and routing to the appropriate technical specialist via Workday.
naftiko: "0.5"
info:
label: "Adhesive Customer Technical Support Escalation"
description: "Escalates adhesive technical support requests by retrieving product specs from SAP, creating a Zendesk escalation ticket, and routing to the appropriate technical specialist via Workday."
tags:
- customer-service
- technical-support
- sap
- zendesk
- workday
capability:
exposes:
- type: mcp
namespace: tech-support-escalation
port: 8080
tools:
- name: escalate-tech-support
description: "Escalate a technical support request for adhesive products."
inputParameters:
- name: ticket_id
in: body
type: string
description: "The existing Zendesk ticket ID."
- name: product_code
in: body
type: string
description: "The adhesive product code."
- name: application_type
in: body
type: string
description: "The customer application type."
steps:
- name: get-product-specs
type: call
call: "sap.get-material"
with:
material_id: "{{product_code}}"
- name: find-specialist
type: call
call: "workday.search-workers"
with:
query: "technical_specialist_adhesive_{{application_type}}"
- name: escalate-ticket
type: call
call: "zendesk.update-ticket"
with:
ticket_id: "{{ticket_id}}"
priority: "high"
assignee_email: "{{find-specialist.workers[0].work_email}}"
internal_note: "Escalated for {{application_type}} application. Product: {{get-product-specs.product_name}}. Specialist: {{find-specialist.workers[0].fullName}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/MaterialSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers?search={{query}}"
inputParameters:
- name: query
in: query
operations:
- name: search-workers
method: GET
- type: http
namespace: zendesk
baseUri: "https://henkel.zendesk.com/api/v2"
authentication:
type: basic
username: "$secrets.zendesk_user"
password: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: update-ticket
method: PUT
Pulls technical specifications from SAP for an adhesive product, generates a TDS document in SharePoint, and notifies the technical team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Adhesive Technical Data Sheet Generator"
description: "Pulls technical specifications from SAP for an adhesive product, generates a TDS document in SharePoint, and notifies the technical team in Microsoft Teams."
tags:
- r-and-d
- adhesives
- sap
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: tds-generation
port: 8080
tools:
- name: generate-tds
description: "Generate a technical data sheet for an adhesive product."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
steps:
- name: get-specs
type: call
call: "sap.get-technical-specs"
with:
material_id: "{{material_number}}"
- name: store-tds
type: call
call: "sharepoint.create-file"
with:
site_id: "technical_docs_site"
file_path: "TDS/{{material_number}}_TDS_v{{get-specs.version}}.pdf"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "technical-docs"
text: "TDS generated for {{get-specs.product_name}} ({{material_number}}). Version: {{get-specs.version}}. Document: {{store-tds.url}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_TECHSPEC_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: specs
path: "/TechnicalSpecSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-technical-specs
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves e-commerce conversion metrics from Adobe Analytics for a Henkel brand website, including visits, orders, and conversion rate.
naftiko: "0.5"
info:
label: "Adobe Analytics E-Commerce Conversion Report"
description: "Retrieves e-commerce conversion metrics from Adobe Analytics for a Henkel brand website, including visits, orders, and conversion rate."
tags:
- analytics
- e-commerce
- adobe-analytics
capability:
exposes:
- type: mcp
namespace: ecommerce-analytics
port: 8080
tools:
- name: get-conversion-report
description: "Fetch e-commerce conversion metrics for a brand site."
inputParameters:
- name: report_suite_id
in: body
type: string
description: "The Adobe Analytics report suite ID."
- name: date_range
in: body
type: string
description: "Date range in YYYY-MM-DD/YYYY-MM-DD format."
call: "adobe-analytics.get-report"
with:
rsid: "{{report_suite_id}}"
dateRange: "{{date_range}}"
outputParameters:
- name: visits
type: integer
mapping: "$.report.totals.visits"
- name: orders
type: integer
mapping: "$.report.totals.orders"
- name: conversion_rate
type: number
mapping: "$.report.totals.conversionRate"
consumes:
- type: http
namespace: adobe-analytics
baseUri: "https://analytics.adobe.io/api/henkel"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
resources:
- name: reports
path: "/reports"
operations:
- name: get-report
method: POST
Retrieves payroll summary from ADP for a given pay period.
naftiko: "0.5"
info:
label: "ADP Payroll Summary"
description: "Retrieves payroll summary from ADP for a given pay period."
tags:
- hr
- payroll
- adp
capability:
exposes:
- type: mcp
namespace: hr-payroll
port: 8080
tools:
- name: get-payroll-summary
description: "Get payroll summary from ADP."
inputParameters:
- name: pay_period
in: body
type: string
description: "The pay period."
call: "adp.get-payroll"
with:
pay_period: "{{pay_period}}"
outputParameters:
- name: total_gross
type: string
mapping: "$.payrollSummary.totalGross"
- name: total_net
type: string
mapping: "$.payrollSummary.totalNet"
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/hr/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: payroll
path: "/payroll-outputs?payPeriod={{pay_period}}"
inputParameters:
- name: pay_period
in: query
operations:
- name: get-payroll
method: GET
Downloads a product formulation document from Azure Blob Storage by document name, returning the signed URL and metadata.
naftiko: "0.5"
info:
label: "Azure Blob Formulation Document Retrieval"
description: "Downloads a product formulation document from Azure Blob Storage by document name, returning the signed URL and metadata."
tags:
- product
- rd
- microsoft-azure
capability:
exposes:
- type: mcp
namespace: formulation-docs
port: 8080
tools:
- name: get-formulation-doc
description: "Retrieve a formulation document from Azure Blob Storage."
inputParameters:
- name: document_name
in: body
type: string
description: "The formulation document file name."
call: "azure-blob.get-blob"
with:
container: "formulation-docs"
blob_name: "{{document_name}}"
outputParameters:
- name: download_url
type: string
mapping: "$.url"
- name: last_modified
type: string
mapping: "$.properties.lastModified"
consumes:
- type: http
namespace: azure-blob
baseUri: "https://henkelformulations.blob.core.windows.net"
authentication:
type: bearer
token: "$secrets.azure_storage_token"
resources:
- name: blobs
path: "/{{container}}/{{blob_name}}"
inputParameters:
- name: container
in: path
- name: blob_name
in: path
operations:
- name: get-blob
method: GET
Triggers an Azure Data Factory pipeline for ETL processing and notifies the data team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Azure Data Factory Pipeline Trigger"
description: "Triggers an Azure Data Factory pipeline for ETL processing and notifies the data team in Microsoft Teams."
tags:
- data-engineering
- azure-data-factory
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: etl-pipelines
port: 8080
tools:
- name: trigger-adf-pipeline
description: "Trigger an ADF pipeline and notify the team."
inputParameters:
- name: pipeline_name
in: body
type: string
description: "The ADF pipeline name."
steps:
- name: trigger-run
type: call
call: "adf.create-pipeline-run"
with:
pipeline_name: "{{pipeline_name}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "data-engineering"
text: "ADF pipeline {{pipeline_name}} triggered. Run ID: {{trigger-run.runId}}."
consumes:
- type: http
namespace: adf
baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/henkel-rg/providers/Microsoft.DataFactory/factories/henkel-adf"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: pipelines
path: "/pipelines/{{pipeline_name}}/createRun?api-version=2018-06-01"
inputParameters:
- name: pipeline_name
in: path
operations:
- name: create-pipeline-run
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the latest build status for an Azure DevOps pipeline.
naftiko: "0.5"
info:
label: "Azure DevOps Build Status"
description: "Retrieves the latest build status for an Azure DevOps pipeline."
tags:
- devops
- ci-cd
- azure-devops
capability:
exposes:
- type: mcp
namespace: cicd-status
port: 8080
tools:
- name: get-build-status
description: "Get the latest build status for an Azure DevOps pipeline."
inputParameters:
- name: project_name
in: body
type: string
description: "The Azure DevOps project."
- name: pipeline_id
in: body
type: string
description: "The pipeline ID."
call: "azdo.get-builds"
with:
project: "{{project_name}}"
definition_id: "{{pipeline_id}}"
outputParameters:
- name: build_number
type: string
mapping: "$.value[0].buildNumber"
- name: result
type: string
mapping: "$.value[0].result"
consumes:
- type: http
namespace: azdo
baseUri: "https://dev.azure.com/henkel"
authentication:
type: basic
username: ""
password: "$secrets.azdo_pat"
resources:
- name: builds
path: "/{{project}}/_apis/build/builds?definitions={{definition_id}}&$top=1&api-version=7.0"
inputParameters:
- name: project
in: path
- name: definition_id
in: query
operations:
- name: get-builds
method: GET
On batch recall trigger, retrieves affected batch details from SAP, identifies impacted customers in Salesforce, and sends recall notifications via MailChimp.
naftiko: "0.5"
info:
label: "Batch Recall Notification Orchestrator"
description: "On batch recall trigger, retrieves affected batch details from SAP, identifies impacted customers in Salesforce, and sends recall notifications via MailChimp."
tags:
- quality
- recall
- sap
- salesforce
- mailchimp
capability:
exposes:
- type: mcp
namespace: batch-recall
port: 8080
tools:
- name: execute-recall
description: "Orchestrate a product batch recall notification."
inputParameters:
- name: batch_number
in: body
type: string
description: "The production batch number."
- name: reason
in: body
type: string
description: "The recall reason description."
steps:
- name: get-batch-details
type: call
call: "sap.get-batch"
with:
batch_id: "{{batch_number}}"
- name: find-affected-customers
type: call
call: "salesforce.query-customers"
with:
soql: "SELECT Id, Email FROM Contact WHERE Batch_Purchased__c = '{{batch_number}}'"
- name: send-recall-emails
type: call
call: "mailchimp.send-campaign"
with:
template_name: "product_recall"
list_id: "recall_{{batch_number}}"
merge_vars:
product_name: "{{get-batch-details.product_name}}"
batch_number: "{{batch_number}}"
recall_reason: "{{reason}}"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/BatchSet('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch
method: GET
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query?q={{soql}}"
inputParameters:
- name: soql
in: query
operations:
- name: query-customers
method: GET
- type: http
namespace: mailchimp
baseUri: "https://mandrillapp.com/api/1.0"
authentication:
type: apiKey
key: "$secrets.mailchimp_transactional_key"
resources:
- name: campaigns
path: "/messages/send-template"
operations:
- name: send-campaign
method: POST
Tracks influencer marketing campaigns by pulling engagement data from Instagram, matching against campaign spend in SAP, and updating ROI metrics in Google Sheets.
naftiko: "0.5"
info:
label: "Beauty Care Influencer Campaign Tracker"
description: "Tracks influencer marketing campaigns by pulling engagement data from Instagram, matching against campaign spend in SAP, and updating ROI metrics in Google Sheets."
tags:
- marketing
- influencer
- instagram
- sap
- google-sheets
capability:
exposes:
- type: mcp
namespace: influencer-tracking
port: 8080
tools:
- name: track-influencer-campaign
description: "Track ROI of an influencer marketing campaign."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The campaign identifier."
- name: influencer_handle
in: body
type: string
description: "The Instagram handle."
steps:
- name: get-engagement
type: call
call: "instagram.get-media-insights"
with:
username: "{{influencer_handle}}"
campaign_hashtag: "{{campaign_id}}"
- name: get-campaign-spend
type: call
call: "sap.get-marketing-cost"
with:
campaign_ref: "{{campaign_id}}"
- name: update-roi-sheet
type: call
call: "google-sheets.append-row"
with:
spreadsheet_id: "influencer_roi_tracker"
range: "Campaigns!A:F"
values:
- "{{campaign_id}}"
- "{{influencer_handle}}"
- "{{get-engagement.total_reach}}"
- "{{get-engagement.engagement_rate}}"
- "{{get-campaign-spend.total_cost}}"
consumes:
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.meta_access_token"
resources:
- name: insights
path: "/{{username}}/media?fields=insights"
inputParameters:
- name: username
in: path
operations:
- name: get-media-insights
method: GET
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZMK_CAMPAIGN_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: costs
path: "/CampaignCostSet('{{campaign_ref}}')"
inputParameters:
- name: campaign_ref
in: path
operations:
- name: get-marketing-cost
method: GET
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: append-row
method: POST
Archives completed documents from SharePoint to Box.
naftiko: "0.5"
info:
label: "Box Document Archive"
description: "Archives completed documents from SharePoint to Box."
tags:
- document-management
- archival
- sharepoint
- box
capability:
exposes:
- type: mcp
namespace: doc-archival
port: 8080
tools:
- name: archive-to-box
description: "Archive a SharePoint document to Box."
inputParameters:
- name: site_id
in: body
type: string
description: "SharePoint site ID."
- name: file_path
in: body
type: string
description: "File path."
- name: box_folder_id
in: body
type: string
description: "Box folder ID."
steps:
- name: get-file
type: call
call: "sharepoint.get-file-content"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
- name: upload-to-box
type: call
call: "box.upload-file"
with:
folder_id: "{{box_folder_id}}"
file_name: "{{file_path}}"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file-content
method: GET
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Aggregates social media metrics from Instagram, Facebook, and LinkedIn for a Henkel brand, then logs the combined report in Google Sheets.
naftiko: "0.5"
info:
label: "Brand Social Media Performance Aggregator"
description: "Aggregates social media metrics from Instagram, Facebook, and LinkedIn for a Henkel brand, then logs the combined report in Google Sheets."
tags:
- marketing
- social-media
- instagram
- facebook
- linkedin
- google-sheets
capability:
exposes:
- type: mcp
namespace: social-performance
port: 8080
tools:
- name: aggregate-social-metrics
description: "Aggregate social media performance for a brand across platforms."
inputParameters:
- name: brand_name
in: body
type: string
description: "The Henkel brand name."
- name: date_range
in: body
type: string
description: "Date range in YYYY-MM-DD/YYYY-MM-DD format."
steps:
- name: get-instagram-metrics
type: call
call: "instagram.get-insights"
with:
account_name: "{{brand_name}}"
period: "{{date_range}}"
- name: get-facebook-metrics
type: call
call: "facebook.get-page-insights"
with:
page_name: "{{brand_name}}"
period: "{{date_range}}"
- name: get-linkedin-metrics
type: call
call: "linkedin.get-page-stats"
with:
organization: "{{brand_name}}"
period: "{{date_range}}"
- name: log-to-sheets
type: call
call: "google-sheets.append-row"
with:
spreadsheet_id: "social_performance_tracker"
range: "{{brand_name}}!A:F"
values:
- "{{date_range}}"
- "{{get-instagram-metrics.engagement_rate}}"
- "{{get-facebook-metrics.reach}}"
- "{{get-linkedin-metrics.impressions}}"
consumes:
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.meta_access_token"
resources:
- name: insights
path: "/{{account_name}}/insights"
inputParameters:
- name: account_name
in: path
operations:
- name: get-insights
method: GET
- type: http
namespace: facebook
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.meta_access_token"
resources:
- name: page-insights
path: "/{{page_name}}/insights"
inputParameters:
- name: page_name
in: path
operations:
- name: get-page-insights
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: page-stats
path: "/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity={{organization}}"
inputParameters:
- name: organization
in: path
operations:
- name: get-page-stats
method: GET
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: append-row
method: POST
Checks Cloudflare zone health for Henkel web properties.
naftiko: "0.5"
info:
label: "Cloudflare Web Security Monitor"
description: "Checks Cloudflare zone health for Henkel web properties."
tags:
- security
- cloudflare
capability:
exposes:
- type: mcp
namespace: web-security
port: 8080
tools:
- name: check-zone-health
description: "Check DNS and security health for a Cloudflare zone."
inputParameters:
- name: zone_id
in: body
type: string
description: "Cloudflare zone ID."
call: "cloudflare.get-zone"
with:
zone_id: "{{zone_id}}"
outputParameters:
- name: status
type: string
mapping: "$.result.status"
- name: ssl_status
type: string
mapping: "$.result.ssl.status"
consumes:
- type: http
namespace: cloudflare
baseUri: "https://api.cloudflare.com/client/v4"
authentication:
type: bearer
token: "$secrets.cloudflare_token"
resources:
- name: zones
path: "/zones/{{zone_id}}"
inputParameters:
- name: zone_id
in: path
operations:
- name: get-zone
method: GET
Creates or updates a Confluence page for SOPs and technical documentation.
naftiko: "0.5"
info:
label: "Confluence Knowledge Base Publisher"
description: "Creates or updates a Confluence page for SOPs and technical documentation."
tags:
- knowledge-management
- confluence
capability:
exposes:
- type: mcp
namespace: knowledge-base
port: 8080
tools:
- name: publish-kb-article
description: "Publish a page to Confluence."
inputParameters:
- name: space_key
in: body
type: string
description: "Confluence space key."
- name: title
in: body
type: string
description: "Page title."
- name: content
in: body
type: string
description: "Page content."
call: "confluence.create-page"
with:
space_key: "{{space_key}}"
title: "{{title}}"
body: "{{content}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://henkel.atlassian.net/wiki/api/v2"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Processes consumer coupon redemptions by validating the coupon in the promotions platform, recording the transaction in SAP, and sending a confirmation email via SendGrid.
naftiko: "0.5"
info:
label: "Consumer Promotion Coupon Fulfillment"
description: "Processes consumer coupon redemptions by validating the coupon in the promotions platform, recording the transaction in SAP, and sending a confirmation email via SendGrid."
tags:
- marketing
- promotion
- sap
- sendgrid
capability:
exposes:
- type: mcp
namespace: coupon-fulfillment
port: 8080
tools:
- name: redeem-coupon
description: "Process a consumer coupon redemption."
inputParameters:
- name: coupon_code
in: body
type: string
description: "The coupon code."
- name: consumer_email
in: body
type: string
description: "Consumer email address."
- name: product_sku
in: body
type: string
description: "The purchased product SKU."
steps:
- name: validate-coupon
type: call
call: "promo-platform.validate-coupon"
with:
code: "{{coupon_code}}"
sku: "{{product_sku}}"
- name: record-redemption
type: call
call: "sap.post-promo-redemption"
with:
coupon_code: "{{coupon_code}}"
sku: "{{product_sku}}"
discount_amount: "{{validate-coupon.discount_value}}"
- name: send-confirmation
type: call
call: "sendgrid.send-email"
with:
to: "{{consumer_email}}"
template_id: "coupon_redemption_confirmation"
dynamic_data:
coupon_code: "{{coupon_code}}"
discount: "{{validate-coupon.discount_value}}"
consumes:
- type: http
namespace: promo-platform
baseUri: "https://promotions.henkel.com/api/v1"
authentication:
type: bearer
token: "$secrets.promo_platform_token"
resources:
- name: coupons
path: "/coupons/validate"
operations:
- name: validate-coupon
method: POST
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZSD_PROMO_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: redemptions
path: "/RedemptionSet"
operations:
- name: post-promo-redemption
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Tracks expiring contracts in SAP Ariba, alerts legal via Microsoft Teams, and creates a renewal task in Jira for procurement follow-up.
naftiko: "0.5"
info:
label: "Contract Renewal Tracker Orchestrator"
description: "Tracks expiring contracts in SAP Ariba, alerts legal via Microsoft Teams, and creates a renewal task in Jira for procurement follow-up."
tags:
- procurement
- contracts
- sap-ariba
- microsoft-teams
- jira
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: track-contract-renewal
description: "Monitor and orchestrate contract renewal process."
inputParameters:
- name: contract_id
in: body
type: string
description: "The Ariba contract ID."
steps:
- name: get-contract
type: call
call: "ariba.get-contract"
with:
id: "{{contract_id}}"
- name: alert-legal
type: call
call: "msteams.send-message"
with:
channel_id: "legal-contracts"
text: "Contract {{contract_id}} with {{get-contract.supplier_name}} expires {{get-contract.expiry_date}}. Value: {{get-contract.total_value}}. Please review renewal terms."
- name: create-renewal-task
type: call
call: "jira.create-issue"
with:
project: "PROC"
issue_type: "Task"
summary: "Renew contract {{contract_id}} - {{get-contract.supplier_name}}"
due_date: "{{get-contract.expiry_date}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/contract/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: jira
baseUri: "https://henkel.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
Compares actual spend from SAP against budget in Oracle Cloud, calculates variance, and sends a summary email via Microsoft Outlook to cost center owners.
naftiko: "0.5"
info:
label: "Cost Center Budget Variance Reporter"
description: "Compares actual spend from SAP against budget in Oracle Cloud, calculates variance, and sends a summary email via Microsoft Outlook to cost center owners."
tags:
- finance
- budget
- sap
- oracle-cloud
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: budget-variance
port: 8080
tools:
- name: report-variance
description: "Generate budget variance report for a cost center."
inputParameters:
- name: cost_center
in: body
type: string
description: "The SAP cost center code."
- name: fiscal_period
in: body
type: string
description: "Fiscal period in YYYY-MM format."
steps:
- name: get-actual-spend
type: call
call: "sap.get-cost-center-actuals"
with:
cost_center: "{{cost_center}}"
period: "{{fiscal_period}}"
- name: get-budget
type: call
call: "oracle-financials.get-budget"
with:
cost_center: "{{cost_center}}"
period: "{{fiscal_period}}"
- name: send-report
type: call
call: "outlook.send-email"
with:
to: "{{get-actual-spend.cost_center_owner_email}}"
subject: "Budget Variance Report: {{cost_center}} - {{fiscal_period}}"
body: "Actual: {{get-actual-spend.total}}. Budget: {{get-budget.total}}. Variance: {{get-budget.total}} - {{get-actual-spend.total}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZFI_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: actuals
path: "/CostCenterActualsSet(CostCenter='{{cost_center}}',Period='{{period}}')"
inputParameters:
- name: cost_center
in: path
- name: period
in: path
operations:
- name: get-cost-center-actuals
method: GET
- type: http
namespace: oracle-financials
baseUri: "https://henkel-fa.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: bearer
token: "$secrets.oracle_cloud_token"
resources:
- name: budgets
path: "/budgets?costCenter={{cost_center}}&period={{period}}"
inputParameters:
- name: cost_center
in: query
- name: period
in: query
operations:
- name: get-budget
method: GET
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
Aggregates project status from Jira sprints, budget actuals from SAP, and resource allocation from Workday into a unified Power BI dashboard refresh.
naftiko: "0.5"
info:
label: "Cross-Functional Project Status Aggregator"
description: "Aggregates project status from Jira sprints, budget actuals from SAP, and resource allocation from Workday into a unified Power BI dashboard refresh."
tags:
- project-management
- reporting
- jira
- sap
- workday
- power-bi
capability:
exposes:
- type: mcp
namespace: project-aggregator
port: 8080
tools:
- name: aggregate-project-status
description: "Aggregate cross-functional project status into a dashboard."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key."
steps:
- name: get-sprint-status
type: call
call: "jira.get-board-sprints"
with:
project: "{{project_key}}"
- name: get-project-budget
type: call
call: "sap.get-project-actuals"
with:
project_code: "{{project_key}}"
- name: get-resource-allocation
type: call
call: "workday.get-project-staffing"
with:
project_ref: "{{project_key}}"
- name: refresh-dashboard
type: call
call: "powerbi.refresh-dataset"
with:
dataset_id: "project-status-dashboard"
consumes:
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprints
path: "/board/{{project}}/sprint"
inputParameters:
- name: project
in: path
operations:
- name: get-board-sprints
method: GET
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPS_PROJECT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: actuals
path: "/ProjectActualsSet('{{project_code}}')"
inputParameters:
- name: project_code
in: path
operations:
- name: get-project-actuals
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: staffing
path: "/projects/{{project_ref}}/staffing"
inputParameters:
- name: project_ref
in: path
operations:
- name: get-project-staffing
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
Processes a customer complaint by creating a Zendesk ticket, looking up purchase history in Salesforce, and triggering a refund workflow in SAP.
naftiko: "0.5"
info:
label: "Customer Complaint Resolution Orchestrator"
description: "Processes a customer complaint by creating a Zendesk ticket, looking up purchase history in Salesforce, and triggering a refund workflow in SAP."
tags:
- customer-service
- complaint
- zendesk
- salesforce
- sap
capability:
exposes:
- type: mcp
namespace: complaint-resolution
port: 8080
tools:
- name: resolve-complaint
description: "Orchestrate customer complaint resolution across support and finance systems."
inputParameters:
- name: customer_email
in: body
type: string
description: "Customer email address."
- name: complaint_text
in: body
type: string
description: "The complaint description."
- name: order_id
in: body
type: string
description: "The original order ID."
steps:
- name: create-ticket
type: call
call: "zendesk.create-ticket"
with:
requester_email: "{{customer_email}}"
subject: "Complaint: Order {{order_id}}"
body: "{{complaint_text}}"
- name: get-purchase-history
type: call
call: "salesforce.query"
with:
soql: "SELECT Id, Product__c, Amount FROM Order__c WHERE OrderNumber__c = '{{order_id}}'"
- name: initiate-refund
type: call
call: "sap.create-credit-memo"
with:
order_reference: "{{order_id}}"
amount: "{{get-purchase-history.records[0].Amount}}"
reason: "customer_complaint"
consumes:
- type: http
namespace: zendesk
baseUri: "https://henkel.zendesk.com/api/v2"
authentication:
type: basic
username: "$secrets.zendesk_user"
password: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets"
operations:
- name: create-ticket
method: POST
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query?q={{soql}}"
inputParameters:
- name: soql
in: query
operations:
- name: query
method: GET
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZFI_CREDIT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: credit-memos
path: "/CreditMemoSet"
operations:
- name: create-credit-memo
method: POST
Processes B2B customer sample requests by creating a Salesforce case, generating a SAP sample delivery, and notifying the sales rep via Microsoft Teams.
naftiko: "0.5"
info:
label: "Customer Sample Request Orchestrator"
description: "Processes B2B customer sample requests by creating a Salesforce case, generating a SAP sample delivery, and notifying the sales rep via Microsoft Teams."
tags:
- sales
- samples
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sample-request
port: 8080
tools:
- name: process-sample-request
description: "Orchestrate a customer product sample request."
inputParameters:
- name: customer_id
in: body
type: string
description: "The Salesforce account ID."
- name: material_number
in: body
type: string
description: "The material to sample."
- name: quantity
in: body
type: integer
description: "Sample quantity."
steps:
- name: create-case
type: call
call: "salesforce.create-case"
with:
account_id: "{{customer_id}}"
subject: "Sample request: {{material_number}}"
type: "sample_request"
- name: create-sample-delivery
type: call
call: "sap.create-sample-order"
with:
customer: "{{customer_id}}"
material: "{{material_number}}"
quantity: "{{quantity}}"
- name: notify-sales-rep
type: call
call: "msteams.send-message"
with:
channel_id: "sales-notifications"
text: "Sample request processed for customer {{customer_id}}: {{material_number}} x{{quantity}}. Case: {{create-case.case_number}}. SAP order: {{create-sample-delivery.order_number}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZSD_SAMPLE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: samples
path: "/SampleOrderSet"
operations:
- name: create-sample-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves infrastructure health metrics from Datadog.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Health Check"
description: "Retrieves infrastructure health metrics from Datadog."
tags:
- it-operations
- monitoring
- datadog
capability:
exposes:
- type: mcp
namespace: infra-monitoring
port: 8080
tools:
- name: get-service-health
description: "Get Datadog health metrics for a service."
inputParameters:
- name: service_name
in: body
type: string
description: "The Datadog service name."
call: "datadog.get-metrics"
with:
service: "{{service_name}}"
outputParameters:
- name: cpu_usage
type: string
mapping: "$.series[0].pointlist[-1][1]"
- name: error_rate
type: string
mapping: "$.series[1].pointlist[-1][1]"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
headerName: "DD-API-KEY"
resources:
- name: metrics
path: "/query?query=avg:system.cpu.user{service:{{service}}}"
inputParameters:
- name: service
in: path
operations:
- name: get-metrics
method: GET
Pulls historical sales from SAP, runs demand forecast in Azure Machine Learning, and publishes planning results to Confluence.
naftiko: "0.5"
info:
label: "Demand Planning Pipeline"
description: "Pulls historical sales from SAP, runs demand forecast in Azure Machine Learning, and publishes planning results to Confluence."
tags:
- supply-chain
- forecasting
- sap
- azure-machine-learning
- confluence
capability:
exposes:
- type: mcp
namespace: demand-planning
port: 8080
tools:
- name: run-demand-forecast
description: "Run demand forecast for a product line."
inputParameters:
- name: product_line
in: body
type: string
description: "The product line."
- name: forecast_months
in: body
type: integer
description: "Number of months to forecast."
steps:
- name: get-history
type: call
call: "sap.get-sales-history"
with:
product_line: "{{product_line}}"
- name: run-forecast
type: call
call: "azml.run-inference"
with:
model_name: "demand_forecast"
input_data: "{{get-history.data}}"
horizon: "{{forecast_months}}"
- name: publish-results
type: call
call: "confluence.create-page"
with:
space_key: "SC"
title: "Demand Forecast: {{product_line}} - {{forecast_months}}mo"
body: "Predicted volume: {{run-forecast.predicted_units}}. Confidence: {{run-forecast.confidence}}. Recommended production: {{run-forecast.recommended_qty}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZSD_SALES_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-history
path: "/SalesHistorySet?$filter=ProductLine eq '{{product_line}}'"
inputParameters:
- name: product_line
in: query
operations:
- name: get-sales-history
method: GET
- type: http
namespace: azml
baseUri: "https://henkel-ml.azureml.ms/score"
authentication:
type: bearer
token: "$secrets.azml_token"
resources:
- name: inference
path: "/{{model_name}}"
inputParameters:
- name: model_name
in: path
operations:
- name: run-inference
method: POST
- type: http
namespace: confluence
baseUri: "https://henkel.atlassian.net/wiki/api/v2"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Monitors digital shelf presence by checking product content in Salsify, pulling e-retailer rankings from Profitero, and syncing results to Snowflake.
naftiko: "0.5"
info:
label: "Digital Shelf Analytics Pipeline"
description: "Monitors digital shelf presence by checking product content in Salsify, pulling e-retailer rankings from Profitero, and syncing results to Snowflake."
tags:
- e-commerce
- digital-shelf
- salsify
- snowflake
capability:
exposes:
- type: mcp
namespace: digital-shelf
port: 8080
tools:
- name: analyze-digital-shelf
description: "Analyze digital shelf performance for a product."
inputParameters:
- name: product_gtin
in: body
type: string
description: "The product GTIN."
- name: retailer
in: body
type: string
description: "The e-retailer name."
steps:
- name: get-content-score
type: call
call: "salsify.get-product"
with:
gtin: "{{product_gtin}}"
- name: get-search-rank
type: call
call: "profitero.get-ranking"
with:
gtin: "{{product_gtin}}"
retailer: "{{retailer}}"
- name: sync-to-snowflake
type: call
call: "snowflake.execute-query"
with:
statement: "INSERT INTO digital_shelf_metrics (gtin, retailer, content_score, search_rank, captured_at) VALUES ('{{product_gtin}}', '{{retailer}}', {{get-content-score.completeness_score}}, {{get-search-rank.rank}}, CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: salsify
baseUri: "https://app.salsify.com/api/v1"
authentication:
type: bearer
token: "$secrets.salsify_token"
resources:
- name: products
path: "/products/{{gtin}}"
inputParameters:
- name: gtin
in: path
operations:
- name: get-product
method: GET
- type: http
namespace: profitero
baseUri: "https://api.profitero.com/v2"
authentication:
type: apiKey
key: "$secrets.profitero_api_key"
resources:
- name: rankings
path: "/products/{{gtin}}/rankings?retailer={{retailer}}"
inputParameters:
- name: gtin
in: path
- name: retailer
in: query
operations:
- name: get-ranking
method: GET
- type: http
namespace: snowflake
baseUri: "https://henkel.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves APM metrics from Dynatrace for a Henkel service.
naftiko: "0.5"
info:
label: "Dynatrace Application Performance Check"
description: "Retrieves APM metrics from Dynatrace for a Henkel service."
tags:
- it-operations
- apm
- dynatrace
capability:
exposes:
- type: mcp
namespace: apm-monitoring
port: 8080
tools:
- name: get-app-performance
description: "Get Dynatrace APM metrics."
inputParameters:
- name: service_id
in: body
type: string
description: "Dynatrace service entity ID."
call: "dynatrace.get-metrics"
with:
entity_id: "{{service_id}}"
outputParameters:
- name: response_time_ms
type: number
mapping: "$.result[0].data[0].values[0]"
- name: error_rate_pct
type: number
mapping: "$.result[1].data[0].values[0]"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://henkel.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: metrics
path: "/metrics/query?metricSelector=builtin:service.response.time&entitySelector=entityId({{entity_id}})"
inputParameters:
- name: entity_id
in: path
operations:
- name: get-metrics
method: GET
Handles employee offboarding by deactivating the Workday profile, revoking Azure AD access, closing ServiceNow assets, and notifying the manager via Outlook.
naftiko: "0.5"
info:
label: "Employee Offboarding Orchestrator"
description: "Handles employee offboarding by deactivating the Workday profile, revoking Azure AD access, closing ServiceNow assets, and notifying the manager via Outlook."
tags:
- hr
- offboarding
- workday
- azure-active-directory
- servicenow
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Orchestrate employee offboarding process."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
- name: last_day
in: body
type: string
description: "Last working day in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: disable-ad-account
type: call
call: "azure-ad.disable-user"
with:
user_principal_name: "{{get-employee.work_email}}"
- name: close-assets
type: call
call: "servicenow.create-incident"
with:
short_description: "Offboarding asset collection: {{get-employee.full_name}}"
category: "hr_offboarding"
assigned_group: "IT_Asset_Management"
- name: notify-manager
type: call
call: "outlook.send-email"
with:
to: "{{get-employee.manager_email}}"
subject: "Offboarding Complete: {{get-employee.full_name}}"
body: "Offboarding steps completed for {{get-employee.full_name}} effective {{last_day}}. AD disabled, asset collection ticket {{close-assets.number}} opened."
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: azure-ad
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_principal_name}}"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://henkel.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: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Orchestrate onboarding for a new Henkel employee."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID."
- name: start_date
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: open-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Onboarding: {{get-employee.full_name}}"
category: "hr_onboarding"
assigned_group: "IT_Onboarding"
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "hr_onboarding_site"
folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Welcome to Henkel, {{get-employee.first_name}}! Onboarding ticket: {{open-ticket.number}}. Documents: {{provision-folder.url}}."
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://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{folder_path}}"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Coordinates environmental compliance audits by pulling permit data from SAP EHS, scheduling inspections in ServiceNow, and distributing audit checklists via SharePoint.
naftiko: "0.5"
info:
label: "Environmental Compliance Audit Coordinator"
description: "Coordinates environmental compliance audits by pulling permit data from SAP EHS, scheduling inspections in ServiceNow, and distributing audit checklists via SharePoint."
tags:
- compliance
- environmental
- sap
- servicenow
- sharepoint
capability:
exposes:
- type: mcp
namespace: env-audit
port: 8080
tools:
- name: coordinate-audit
description: "Coordinate an environmental compliance audit."
inputParameters:
- name: plant_code
in: body
type: string
description: "The plant code."
- name: audit_date
in: body
type: string
description: "Scheduled audit date in YYYY-MM-DD."
steps:
- name: get-permits
type: call
call: "sap-ehs.get-permits"
with:
plant: "{{plant_code}}"
- name: schedule-inspection
type: call
call: "servicenow.create-change"
with:
short_description: "Environmental audit: Plant {{plant_code}}"
scheduled_date: "{{audit_date}}"
category: "environmental_compliance"
- name: distribute-checklist
type: call
call: "sharepoint.copy-template"
with:
site_id: "environmental_compliance"
source_path: "Templates/audit_checklist_template.xlsx"
dest_path: "Audits/{{plant_code}}/audit_{{audit_date}}.xlsx"
consumes:
- type: http
namespace: sap-ehs
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEH_PERMIT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: permits
path: "/PermitSet?$filter=Plant eq '{{plant}}'"
inputParameters:
- name: plant
in: query
operations:
- name: get-permits
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.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: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: copy
path: "/{{site_id}}/drive/root:/{{source_path}}:/copy"
inputParameters:
- name: site_id
in: path
- name: source_path
in: path
operations:
- name: copy-template
method: POST
Routes a product formulation change request through Jira for engineering approval, updates the SAP recipe, and archives the change in SharePoint.
naftiko: "0.5"
info:
label: "Formulation Change Approval Workflow"
description: "Routes a product formulation change request through Jira for engineering approval, updates the SAP recipe, and archives the change in SharePoint."
tags:
- rd
- formulation
- jira
- sap
- sharepoint
capability:
exposes:
- type: mcp
namespace: formulation-change
port: 8080
tools:
- name: submit-formulation-change
description: "Submit and route a formulation change request."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: change_description
in: body
type: string
description: "Description of the formulation change."
- name: submitter_email
in: body
type: string
description: "Email of the submitter."
steps:
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "FORM"
issue_type: "Change Request"
summary: "Formulation change: {{material_number}}"
description: "{{change_description}}"
reporter: "{{submitter_email}}"
- name: update-sap-recipe
type: call
call: "sap.update-recipe"
with:
material_id: "{{material_number}}"
change_ref: "{{create-jira-ticket.key}}"
status: "pending_approval"
- name: archive-change-doc
type: call
call: "sharepoint.upload-document"
with:
site_id: "rd_formulations"
folder_path: "ChangeRequests/{{material_number}}"
file_name: "{{create-jira-ticket.key}}_change.json"
consumes:
- type: http
namespace: jira
baseUri: "https://henkel.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: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_RECIPE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: recipes
path: "/RecipeSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: update-recipe
method: PATCH
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: uploads
path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-document
method: PUT
Orchestrates global price changes by updating SAP condition records, syncing to the e-commerce platform, and notifying regional sales teams via Microsoft Teams.
naftiko: "0.5"
info:
label: "Global Product Pricing Update Orchestrator"
description: "Orchestrates global price changes by updating SAP condition records, syncing to the e-commerce platform, and notifying regional sales teams via Microsoft Teams."
tags:
- pricing
- sales
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pricing-update
port: 8080
tools:
- name: update-global-pricing
description: "Update product pricing across SAP and e-commerce, notifying sales."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: new_price
in: body
type: number
description: "The new list price."
- name: effective_date
in: body
type: string
description: "Effective date in YYYY-MM-DD."
- name: regions
in: body
type: string
description: "Comma-separated region codes."
steps:
- name: update-sap-price
type: call
call: "sap.update-condition-record"
with:
material: "{{material_number}}"
price: "{{new_price}}"
valid_from: "{{effective_date}}"
- name: sync-ecommerce
type: call
call: "sap-commerce.update-price"
with:
sku: "{{material_number}}"
price: "{{new_price}}"
- name: notify-sales
type: call
call: "msteams.send-message"
with:
channel_id: "sales-pricing-updates"
text: "Price update: {{material_number}} new price {{new_price}} effective {{effective_date}} for regions: {{regions}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZSD_PRICING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: conditions
path: "/ConditionRecordSet"
operations:
- name: update-condition-record
method: POST
- type: http
namespace: sap-commerce
baseUri: "https://henkel-commerce.sap.com/occ/v2"
authentication:
type: bearer
token: "$secrets.sap_commerce_token"
resources:
- name: prices
path: "/products/{{sku}}/prices"
inputParameters:
- name: sku
in: path
operations:
- name: update-price
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves brand website performance metrics from Google Analytics.
naftiko: "0.5"
info:
label: "Google Analytics Brand Performance"
description: "Retrieves brand website performance metrics from Google Analytics."
tags:
- marketing
- analytics
- google-analytics
capability:
exposes:
- type: mcp
namespace: brand-analytics
port: 8080
tools:
- name: get-brand-performance
description: "Get Google Analytics metrics for a Henkel brand site."
inputParameters:
- name: brand_property_id
in: body
type: string
description: "The GA property ID."
call: "ga.get-brand-metrics"
with:
property_id: "{{brand_property_id}}"
outputParameters:
- name: sessions
type: integer
mapping: "$.rows[0].metricValues[0].value"
- name: users
type: integer
mapping: "$.rows[0].metricValues[1].value"
- name: conversion_rate
type: string
mapping: "$.rows[0].metricValues[2].value"
consumes:
- type: http
namespace: ga
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/{{property_id}}:runReport"
inputParameters:
- name: property_id
in: path
operations:
- name: get-brand-metrics
method: POST
Uploads R&D documents to Google Drive.
naftiko: "0.5"
info:
label: "Google Drive R&D Document Upload"
description: "Uploads R&D documents to Google Drive."
tags:
- document-management
- google-drive
capability:
exposes:
- type: mcp
namespace: gdrive-docs
port: 8080
tools:
- name: upload-rd-document
description: "Upload an R&D document to Google Drive."
inputParameters:
- name: folder_id
in: body
type: string
description: "Google Drive folder ID."
- name: file_name
in: body
type: string
description: "File name."
- name: content
in: body
type: string
description: "File content."
call: "gdrive.upload-file"
with:
folder_id: "{{folder_id}}"
name: "{{file_name}}"
content: "{{content}}"
outputParameters:
- name: file_id
type: string
mapping: "$.id"
- name: web_view_link
type: string
mapping: "$.webViewLink"
consumes:
- type: http
namespace: gdrive
baseUri: "https://www.googleapis.com/upload/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files?uploadType=multipart"
operations:
- name: upload-file
method: POST
Retrieves search performance data from Google Search Console for Henkel brand sites.
naftiko: "0.5"
info:
label: "Google Search Console SEO Tracker"
description: "Retrieves search performance data from Google Search Console for Henkel brand sites."
tags:
- marketing
- seo
- google-search-console
capability:
exposes:
- type: mcp
namespace: seo-tracking
port: 8080
tools:
- name: get-search-performance
description: "Get search performance from Google Search Console."
inputParameters:
- name: site_url
in: body
type: string
description: "The site URL."
call: "gsc.get-search-analytics"
with:
site_url: "{{site_url}}"
outputParameters:
- name: total_clicks
type: integer
mapping: "$.rows[0].clicks"
- name: total_impressions
type: integer
mapping: "$.rows[0].impressions"
consumes:
- type: http
namespace: gsc
baseUri: "https://www.googleapis.com/webmasters/v3"
authentication:
type: bearer
token: "$secrets.google_search_console_token"
resources:
- name: search-analytics
path: "/sites/{{site_url}}/searchAnalytics/query"
inputParameters:
- name: site_url
in: path
operations:
- name: get-search-analytics
method: POST
Pulls plant KPI data from SAP and writes to Google Sheets.
naftiko: "0.5"
info:
label: "Google Sheets Plant KPI Dashboard"
description: "Pulls plant KPI data from SAP and writes to Google Sheets."
tags:
- reporting
- google-sheets
- sap
capability:
exposes:
- type: mcp
namespace: sheets-kpis
port: 8080
tools:
- name: sync-plant-kpis
description: "Sync SAP plant KPIs to Google Sheets."
inputParameters:
- name: spreadsheet_id
in: body
type: string
description: "The Google Sheets ID."
- name: plant_code
in: body
type: string
description: "The plant code."
steps:
- name: get-kpis
type: call
call: "sap.get-plant-kpis"
with:
plant: "{{plant_code}}"
- name: update-sheet
type: call
call: "gsheets.update-values"
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "KPIs!A2:E2"
values:
- - "{{plant_code}}"
- "{{get-kpis.oee}}"
- "{{get-kpis.yield}}"
- "{{get-kpis.safety_rate}}"
- "{{get-kpis.on_time_delivery}}"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPP_KPI_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: kpis
path: "/PlantKPISet('{{plant}}')"
inputParameters:
- name: plant
in: path
operations:
- name: get-plant-kpis
method: GET
- type: http
namespace: gsheets
baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/{{spreadsheet_id}}/values/{{range}}"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: update-values
method: PUT
Captures a B2B lead in HubSpot, enriches with Salesforce data, and notifies sales in Microsoft Teams.
naftiko: "0.5"
info:
label: "HubSpot Lead Capture for B2B"
description: "Captures a B2B lead in HubSpot, enriches with Salesforce data, and notifies sales in Microsoft Teams."
tags:
- sales
- lead-management
- hubspot
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: b2b-leads
port: 8080
tools:
- name: capture-b2b-lead
description: "Capture and enrich a B2B lead."
inputParameters:
- name: lead_email
in: body
type: string
description: "Lead email address."
- name: company_name
in: body
type: string
description: "Company name."
steps:
- name: create-contact
type: call
call: "hubspot.create-contact"
with:
email: "{{lead_email}}"
company: "{{company_name}}"
- name: search-sf
type: call
call: "salesforce.search-account"
with:
company_name: "{{company_name}}"
- name: notify-sales
type: call
call: "msteams.send-message"
with:
channel_id: "b2b-sales"
text: "New B2B lead: {{company_name}} ({{lead_email}}). HubSpot: {{create-contact.id}}. SF: {{search-sf.Name}}."
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com/crm/v3"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/objects/contacts"
operations:
- name: create-contact
method: POST
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/parameterizedSearch/?q={{company_name}}&sobject=Account"
inputParameters:
- name: company_name
in: query
operations:
- name: search-account
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers an Informatica data quality job for product master data, checks results, and creates a ServiceNow task for data stewards if quality thresholds are not met.
naftiko: "0.5"
info:
label: "Informatica Data Quality Pipeline"
description: "Triggers an Informatica data quality job for product master data, checks results, and creates a ServiceNow task for data stewards if quality thresholds are not met."
tags:
- data-quality
- master-data
- informatica
- servicenow
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-data-quality-check
description: "Run an Informatica data quality job and flag issues."
inputParameters:
- name: job_name
in: body
type: string
description: "The Informatica job name."
steps:
- name: run-job
type: call
call: "informatica.run-job"
with:
job_name: "{{job_name}}"
- name: create-task
type: call
call: "servicenow.create-record"
with:
table: "u_data_quality_tasks"
short_description: "Data quality: {{job_name}} - {{run-job.failed_records}} failures"
description: "Job: {{job_name}}. Total records: {{run-job.total_records}}. Passed: {{run-job.passed_records}}. Failed: {{run-job.failed_records}}. Score: {{run-job.quality_score}}%."
assigned_group: "Data_Stewards"
consumes:
- type: http
namespace: informatica
baseUri: "https://henkel.informaticacloud.com/saas/api/v2"
authentication:
type: bearer
token: "$secrets.informatica_token"
resources:
- name: jobs
path: "/job"
operations:
- name: run-job
method: POST
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
Processes IT access requests by creating a ServiceNow ticket, checking manager approval in Workday, and provisioning access in Azure Active Directory.
naftiko: "0.5"
info:
label: "IT Access Request Approval Workflow"
description: "Processes IT access requests by creating a ServiceNow ticket, checking manager approval in Workday, and provisioning access in Azure Active Directory."
tags:
- it
- access-management
- servicenow
- workday
- azure-active-directory
capability:
exposes:
- type: mcp
namespace: access-request
port: 8080
tools:
- name: process-access-request
description: "Process an IT system access request through approval workflow."
inputParameters:
- name: employee_id
in: body
type: string
description: "The employee Workday ID."
- name: system_name
in: body
type: string
description: "The target system name."
- name: access_level
in: body
type: string
description: "Requested access level."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-request-ticket
type: call
call: "servicenow.create-request"
with:
short_description: "Access request: {{system_name}} for {{get-employee.full_name}}"
category: "access_management"
requested_for: "{{get-employee.work_email}}"
access_level: "{{access_level}}"
- name: provision-access
type: call
call: "azure-ad.add-group-member"
with:
group_id: "{{system_name}}_{{access_level}}"
user_principal_name: "{{get-employee.work_email}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: azure-ad
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: groups
path: "/groups/{{group_id}}/members/$ref"
inputParameters:
- name: group_id
in: path
operations:
- name: add-group-member
method: POST
Retrieves the current status, assignee, and approval state for an IT change request ticket in Jira.
naftiko: "0.5"
info:
label: "Jira IT Change Request Status"
description: "Retrieves the current status, assignee, and approval state for an IT change request ticket in Jira."
tags:
- it
- change-management
- jira
capability:
exposes:
- type: mcp
namespace: change-requests
port: 8080
tools:
- name: get-change-request
description: "Look up an IT change request by Jira issue key."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g., CHG-1234)."
call: "jira.get-issue"
with:
key: "{{issue_key}}"
outputParameters:
- name: status
type: string
mapping: "$.fields.status.name"
- name: assignee
type: string
mapping: "$.fields.assignee.displayName"
- name: approval_state
type: string
mapping: "$.fields.customfield_10050"
consumes:
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{key}}"
inputParameters:
- name: key
in: path
operations:
- name: get-issue
method: GET
Retrieves sprint status for an R&D Jira project.
naftiko: "0.5"
info:
label: "Jira R&D Project Tracker"
description: "Retrieves sprint status for an R&D Jira project."
tags:
- r-and-d
- jira
- project-management
capability:
exposes:
- type: mcp
namespace: rd-tracking
port: 8080
tools:
- name: get-rd-project-status
description: "Get R&D project status from Jira."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key."
call: "jira.get-project"
with:
project_key: "{{project_key}}"
outputParameters:
- name: total_issues
type: integer
mapping: "$.total"
- name: open_issues
type: integer
mapping: "$.open_count"
consumes:
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: search
path: "/search?jql=project={{project_key}}"
inputParameters:
- name: project_key
in: path
operations:
- name: get-project
method: GET
Retrieves lab test results from LIMS, generates a certificate of analysis in SAP QM, and uploads the signed PDF to Box for customer distribution.
naftiko: "0.5"
info:
label: "Lab Test Result to Certificate Pipeline"
description: "Retrieves lab test results from LIMS, generates a certificate of analysis in SAP QM, and uploads the signed PDF to Box for customer distribution."
tags:
- quality
- laboratory
- sap
- box
capability:
exposes:
- type: mcp
namespace: lab-certificate
port: 8080
tools:
- name: generate-certificate
description: "Generate a certificate of analysis from lab test results."
inputParameters:
- name: batch_number
in: body
type: string
description: "The production batch number."
- name: customer_id
in: body
type: string
description: "The customer ID for distribution."
steps:
- name: get-lab-results
type: call
call: "lims.get-batch-results"
with:
batch: "{{batch_number}}"
- name: create-coa
type: call
call: "sap-qm.create-certificate"
with:
batch: "{{batch_number}}"
test_data: "{{get-lab-results.test_summary}}"
- name: upload-to-box
type: call
call: "box.upload-file"
with:
folder_id: "coa_{{customer_id}}"
file_name: "COA_{{batch_number}}.pdf"
content: "{{create-coa.pdf_content}}"
consumes:
- type: http
namespace: lims
baseUri: "https://lims.henkel.com/api/v1"
authentication:
type: bearer
token: "$secrets.lims_token"
resources:
- name: results
path: "/batches/{{batch}}/results"
inputParameters:
- name: batch
in: path
operations:
- name: get-batch-results
method: GET
- type: http
namespace: sap-qm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZQM_CERTIFICATE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: certificates
path: "/CertificateSet"
operations:
- name: create-certificate
method: POST
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Publishes a branded post to the Henkel LinkedIn company page.
naftiko: "0.5"
info:
label: "LinkedIn Brand Update Publisher"
description: "Publishes a branded post to the Henkel LinkedIn company page."
tags:
- marketing
- social-media
- linkedin
capability:
exposes:
- type: mcp
namespace: linkedin-publishing
port: 8080
tools:
- name: publish-linkedin-post
description: "Publish a post to the Henkel LinkedIn page."
inputParameters:
- name: post_text
in: body
type: string
description: "The post content."
call: "linkedin.create-post"
with:
author: "urn:li:organization:henkel"
text: "{{post_text}}"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: posts
path: "/ugcPosts"
operations:
- name: create-post
method: POST
Pulls new product data from SAP and sends a newsletter via MailChimp.
naftiko: "0.5"
info:
label: "MailChimp Product Newsletter"
description: "Pulls new product data from SAP and sends a newsletter via MailChimp."
tags:
- marketing
- newsletter
- mailchimp
- sap
capability:
exposes:
- type: mcp
namespace: product-newsletter
port: 8080
tools:
- name: send-product-newsletter
description: "Send a product newsletter via MailChimp."
inputParameters:
- name: list_id
in: body
type: string
description: "The MailChimp list ID."
- name: product_category
in: body
type: string
description: "Product category to feature."
steps:
- name: get-products
type: call
call: "sap.get-new-products"
with:
category: "{{product_category}}"
- name: create-campaign
type: call
call: "mailchimp.create-campaign"
with:
list_id: "{{list_id}}"
subject: "New from Henkel: {{product_category}}"
body: "Discover {{get-products.count}} new products in {{product_category}}!"
- name: send-campaign
type: call
call: "mailchimp.send-campaign"
with:
campaign_id: "{{create-campaign.id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: new-products
path: "/NewProductSet?$filter=Category eq '{{category}}'"
inputParameters:
- name: category
in: query
operations:
- name: get-new-products
method: GET
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: create-campaign
method: POST
- name: campaign-actions
path: "/campaigns/{{campaign_id}}/actions/send"
inputParameters:
- name: campaign_id
in: path
operations:
- name: send-campaign
method: POST
Retrieves batch quality test results from SAP, validates against specifications, and creates a ServiceNow task if any parameter is out of tolerance.
naftiko: "0.5"
info:
label: "Manufacturing Batch Quality Check"
description: "Retrieves batch quality test results from SAP, validates against specifications, and creates a ServiceNow task if any parameter is out of tolerance."
tags:
- manufacturing
- quality
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: quality-management
port: 8080
tools:
- name: check-batch-quality
description: "Check batch quality results and flag out-of-spec conditions."
inputParameters:
- name: batch_number
in: body
type: string
description: "The SAP production batch number."
steps:
- name: get-quality-data
type: call
call: "sap.get-batch-quality"
with:
batch_id: "{{batch_number}}"
- name: create-task
type: call
call: "servicenow.create-record"
with:
table: "u_quality_tasks"
short_description: "Quality review: batch {{batch_number}} - {{get-quality-data.failed_params}} out of spec"
description: "Batch {{batch_number}}, Product: {{get-quality-data.product_name}}. Failed parameters: {{get-quality-data.failed_params}}. Test date: {{get-quality-data.test_date}}."
assigned_group: "Quality_Control"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZQM_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/BatchQualitySet('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch-quality
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
Gathers market share data from Nielsen, competitor pricing from Circana, and consolidates findings into a Confluence market intelligence page.
naftiko: "0.5"
info:
label: "Market Intelligence Report Generator"
description: "Gathers market share data from Nielsen, competitor pricing from Circana, and consolidates findings into a Confluence market intelligence page."
tags:
- marketing
- market-research
- confluence
capability:
exposes:
- type: mcp
namespace: market-intelligence
port: 8080
tools:
- name: generate-market-report
description: "Generate a market intelligence report from multiple data sources."
inputParameters:
- name: category
in: body
type: string
description: "The product category."
- name: market
in: body
type: string
description: "The market region."
steps:
- name: get-market-share
type: call
call: "nielsen.get-market-data"
with:
category: "{{category}}"
market: "{{market}}"
- name: get-competitor-pricing
type: call
call: "circana.get-pricing"
with:
category: "{{category}}"
region: "{{market}}"
- name: publish-report
type: call
call: "confluence.create-page"
with:
space: "MKTINTEL"
title: "Market Intelligence: {{category}} - {{market}}"
body: "Market share: {{get-market-share.henkel_share}}%. Top competitor: {{get-competitor-pricing.leader}}. Avg price delta: {{get-competitor-pricing.price_delta}}."
consumes:
- type: http
namespace: nielsen
baseUri: "https://api.nielsen.com/v1"
authentication:
type: bearer
token: "$secrets.nielsen_token"
resources:
- name: market-data
path: "/marketshare?category={{category}}&market={{market}}"
inputParameters:
- name: category
in: query
- name: market
in: query
operations:
- name: get-market-data
method: GET
- type: http
namespace: circana
baseUri: "https://api.circana.com/v2"
authentication:
type: bearer
token: "$secrets.circana_token"
resources:
- name: pricing
path: "/pricing?category={{category}}®ion={{region}}"
inputParameters:
- name: category
in: query
- name: region
in: query
operations:
- name: get-pricing
method: GET
- type: http
namespace: confluence
baseUri: "https://henkel.atlassian.net/wiki/api/v2"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Creates a Salesforce campaign for a product launch, schedules social posts in HubSpot, sends a press release via Microsoft Outlook, and notifies the marketing team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Marketing Campaign Launcher"
description: "Creates a Salesforce campaign for a product launch, schedules social posts in HubSpot, sends a press release via Microsoft Outlook, and notifies the marketing team in Microsoft Teams."
tags:
- marketing
- campaign
- salesforce
- hubspot
- microsoft-outlook
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: marketing-campaigns
port: 8080
tools:
- name: launch-campaign
description: "Launch a marketing campaign across Salesforce, HubSpot, email, and Teams."
inputParameters:
- name: campaign_name
in: body
type: string
description: "The campaign name."
- name: product_name
in: body
type: string
description: "The product being promoted."
- name: launch_date
in: body
type: string
description: "The launch date."
steps:
- name: create-campaign
type: call
call: "salesforce.create-campaign"
with:
name: "{{campaign_name}}"
start_date: "{{launch_date}}"
type: "Product Launch"
- name: schedule-social
type: call
call: "hubspot.create-social-post"
with:
content: "Introducing {{product_name}} from Henkel! #Henkel #Innovation #{{product_name}}"
campaign_id: "{{create-campaign.Id}}"
- name: send-press-release
type: call
call: "outlook.send-email"
with:
to: "press@henkel.com"
subject: "Press Release: {{campaign_name}} - {{product_name}}"
body: "Henkel announces {{product_name}} launching {{launch_date}}. Campaign: {{create-campaign.Id}}."
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "marketing-launches"
text: "Campaign launched: {{campaign_name}} for {{product_name}}. SF Campaign: {{create-campaign.Id}}. Launch: {{launch_date}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: campaigns
path: "/sobjects/Campaign"
operations:
- name: create-campaign
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: social-posts
path: "/broadcast/v1/broadcasts"
operations:
- name: create-social-post
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0/me"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/sendMail"
operations:
- name: send-email
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Sends a formatted email via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Microsoft Outlook Email Sender"
description: "Sends a formatted email via Microsoft Outlook."
tags:
- communications
- email
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: email-sending
port: 8080
tools:
- name: send-email
description: "Send an email via Microsoft Outlook."
inputParameters:
- name: to_address
in: body
type: string
description: "Recipient email."
- name: subject
in: body
type: string
description: "Email subject."
- name: body_text
in: body
type: string
description: "Email body."
call: "outlook.send-mail"
with:
to: "{{to_address}}"
subject: "{{subject}}"
body: "{{body_text}}"
consumes:
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0/me"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/sendMail"
operations:
- name: send-mail
method: POST
Sends a formatted message to a Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Microsoft Teams Channel Notifier"
description: "Sends a formatted message to a Microsoft Teams channel."
tags:
- communications
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: team-notifications
port: 8080
tools:
- name: send-channel-notification
description: "Send a message to a Microsoft Teams channel."
inputParameters:
- name: channel_id
in: body
type: string
description: "The Teams channel ID."
- name: message_text
in: body
type: string
description: "The message text."
call: "msteams.send-channel-message"
with:
channel_id: "{{channel_id}}"
text: "{{message_text}}"
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/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Coordinates product registration for new markets by retrieving formulation data from SAP, submitting regulatory documents to Veeva Vault, and tracking progress in Jira.
naftiko: "0.5"
info:
label: "New Market Product Registration Coordinator"
description: "Coordinates product registration for new markets by retrieving formulation data from SAP, submitting regulatory documents to Veeva Vault, and tracking progress in Jira."
tags:
- regulatory
- product-registration
- sap
- jira
capability:
exposes:
- type: mcp
namespace: product-registration
port: 8080
tools:
- name: register-product
description: "Coordinate product registration for a new market."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: target_country
in: body
type: string
description: "Target country ISO code."
steps:
- name: get-formulation
type: call
call: "sap.get-recipe"
with:
material_id: "{{material_number}}"
- name: submit-regulatory-docs
type: call
call: "veeva.create-submission"
with:
product_name: "{{get-formulation.product_name}}"
country: "{{target_country}}"
formulation_ref: "{{material_number}}"
- name: create-tracking-ticket
type: call
call: "jira.create-issue"
with:
project: "REGAFF"
issue_type: "Task"
summary: "Product registration: {{get-formulation.product_name}} in {{target_country}}"
description: "Veeva submission: {{submit-regulatory-docs.submission_id}}. Material: {{material_number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_RECIPE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: recipes
path: "/RecipeSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-recipe
method: GET
- type: http
namespace: veeva
baseUri: "https://henkel.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: submissions
path: "/objects/submissions"
operations:
- name: create-submission
method: POST
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
When a new product formula is approved in SAP, creates a Jira project for packaging design, provisions a SharePoint folder for documentation, registers in Salesforce as a product record, and notifies the R&D team in Microsoft Teams.
naftiko: "0.5"
info:
label: "New Product Development Pipeline"
description: "When a new product formula is approved in SAP, creates a Jira project for packaging design, provisions a SharePoint folder for documentation, registers in Salesforce as a product record, and notifies the R&D team in Microsoft Teams."
tags:
- r-and-d
- product-development
- sap
- jira
- sharepoint
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-development
port: 8080
tools:
- name: initiate-product-development
description: "Orchestrate new product development across SAP, Jira, SharePoint, Salesforce, and Teams."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number for the new product."
- name: project_name
in: body
type: string
description: "The product development project name."
steps:
- name: get-formula
type: call
call: "sap.get-formula"
with:
material_id: "{{material_number}}"
- name: create-project
type: call
call: "jira.create-issue"
with:
project_key: "NPD"
summary: "{{project_name}} - Packaging & Launch"
issue_type: "Epic"
description: "Product: {{get-formula.ProductName}}. Formula: {{get-formula.FormulaCode}}. Category: {{get-formula.Category}}."
- name: provision-docs
type: call
call: "sharepoint.create-folder"
with:
site_id: "r_and_d_site"
folder_path: "NPD/{{material_number}}_{{project_name}}"
- name: register-product
type: call
call: "salesforce.create-product"
with:
name: "{{get-formula.ProductName}}"
product_code: "{{material_number}}"
category: "{{get-formula.Category}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "r-and-d-projects"
text: "New product development started: {{project_name}} ({{material_number}}). Jira: {{create-project.key}}. Docs: {{provision-docs.url}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_FORMULA_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: formulas
path: "/FormulaSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-formula
method: GET
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{folder_path}}"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: products
path: "/sobjects/Product2"
operations:
- name: create-product
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves application performance data from New Relic.
naftiko: "0.5"
info:
label: "New Relic Application Monitor"
description: "Retrieves application performance data from New Relic."
tags:
- it-operations
- monitoring
- new-relic
capability:
exposes:
- type: mcp
namespace: newrelic-monitoring
port: 8080
tools:
- name: get-newrelic-metrics
description: "Get New Relic performance metrics."
inputParameters:
- name: app_id
in: body
type: string
description: "The New Relic application ID."
call: "newrelic.get-app-metrics"
with:
app_id: "{{app_id}}"
outputParameters:
- name: response_time
type: number
mapping: "$.application_summary.response_time"
- name: throughput
type: number
mapping: "$.application_summary.throughput"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apiKey
key: "$secrets.newrelic_api_key"
headerName: "Api-Key"
resources:
- name: applications
path: "/applications/{{app_id}}.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app-metrics
method: GET
Retrieves the general ledger account balance from Oracle Cloud Financials for a given account code and fiscal period.
naftiko: "0.5"
info:
label: "Oracle Cloud General Ledger Balance"
description: "Retrieves the general ledger account balance from Oracle Cloud Financials for a given account code and fiscal period."
tags:
- finance
- accounting
- oracle-cloud
capability:
exposes:
- type: mcp
namespace: gl-balance
port: 8080
tools:
- name: get-gl-balance
description: "Fetch GL account balance for a specific account and period."
inputParameters:
- name: account_code
in: body
type: string
description: "The GL account code."
- name: fiscal_period
in: body
type: string
description: "Fiscal period in YYYY-MM format."
call: "oracle-financials.get-balance"
with:
account: "{{account_code}}"
period: "{{fiscal_period}}"
outputParameters:
- name: debit_total
type: number
mapping: "$.balance.debitTotal"
- name: credit_total
type: number
mapping: "$.balance.creditTotal"
- name: net_balance
type: number
mapping: "$.balance.netBalance"
consumes:
- type: http
namespace: oracle-financials
baseUri: "https://henkel-fa.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: bearer
token: "$secrets.oracle_cloud_token"
resources:
- name: balances
path: "/generalLedgerBalances?q=AccountCode={{account}};Period={{period}}"
inputParameters:
- name: account
in: query
- name: period
in: query
operations:
- name: get-balance
method: GET
Verifies packaging compliance by checking material specs in SAP, validating regulatory data in Veeva Vault, and logging results in Confluence.
naftiko: "0.5"
info:
label: "Packaging Compliance Verification Pipeline"
description: "Verifies packaging compliance by checking material specs in SAP, validating regulatory data in Veeva Vault, and logging results in Confluence."
tags:
- packaging
- compliance
- sap
- confluence
capability:
exposes:
- type: mcp
namespace: packaging-compliance
port: 8080
tools:
- name: verify-packaging-compliance
description: "Verify packaging materials meet regulatory compliance."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number for the packaging item."
- name: target_market
in: body
type: string
description: "The target market country code."
steps:
- name: get-packaging-spec
type: call
call: "sap.get-material-spec"
with:
material_id: "{{material_number}}"
- name: check-regulatory
type: call
call: "veeva.get-document"
with:
doc_type: "packaging_regulation"
market: "{{target_market}}"
material_ref: "{{material_number}}"
- name: log-result
type: call
call: "confluence.create-page"
with:
space: "PKGCOMP"
title: "Compliance Check: {{material_number}} - {{target_market}}"
body: "Material: {{get-packaging-spec.description}}. Regulatory status: {{check-regulatory.compliance_status}}. Last updated: {{check-regulatory.last_review_date}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/MaterialSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-material-spec
method: GET
- type: http
namespace: veeva
baseUri: "https://henkel.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: documents
path: "/objects/documents?doc_type={{doc_type}}&market={{market}}&material_ref={{material_ref}}"
inputParameters:
- name: doc_type
in: query
- name: market
in: query
- name: material_ref
in: query
operations:
- name: get-document
method: GET
- type: http
namespace: confluence
baseUri: "https://henkel.atlassian.net/wiki/api/v2"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Retrieves the current status, priority, and assigned responder for a PagerDuty incident by incident ID.
naftiko: "0.5"
info:
label: "PagerDuty Incident Status Lookup"
description: "Retrieves the current status, priority, and assigned responder for a PagerDuty incident by incident ID."
tags:
- operations
- incident-management
- pagerduty
capability:
exposes:
- type: mcp
namespace: pagerduty-incidents
port: 8080
tools:
- name: get-incident-status
description: "Look up a PagerDuty incident by ID."
inputParameters:
- name: incident_id
in: body
type: string
description: "The PagerDuty incident ID."
call: "pagerduty.get-incident"
with:
id: "{{incident_id}}"
outputParameters:
- name: status
type: string
mapping: "$.incident.status"
- name: priority
type: string
mapping: "$.incident.priority.summary"
- name: assigned_to
type: string
mapping: "$.incident.assignments[0].assignee.summary"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-incident
method: GET
Creates a maintenance work order in SAP PM, schedules a technician via Workday, and logs the request in ServiceNow for tracking.
naftiko: "0.5"
info:
label: "Plant Maintenance Work Order Pipeline"
description: "Creates a maintenance work order in SAP PM, schedules a technician via Workday, and logs the request in ServiceNow for tracking."
tags:
- maintenance
- manufacturing
- sap
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: maintenance-orders
port: 8080
tools:
- name: create-work-order
description: "Create and track a plant maintenance work order."
inputParameters:
- name: equipment_id
in: body
type: string
description: "The SAP equipment ID."
- name: description
in: body
type: string
description: "Work order description."
- name: priority
in: body
type: string
description: "Priority level (high, medium, low)."
steps:
- name: create-sap-order
type: call
call: "sap-pm.create-order"
with:
equipment: "{{equipment_id}}"
description: "{{description}}"
priority: "{{priority}}"
- name: find-technician
type: call
call: "workday.search-workers"
with:
query: "maintenance_technician_{{equipment_id}}"
- name: log-in-servicenow
type: call
call: "servicenow.create-incident"
with:
short_description: "Maintenance: {{description}}"
category: "plant_maintenance"
assignment_group: "Plant_Maintenance"
sap_order_number: "{{create-sap-order.order_number}}"
consumes:
- type: http
namespace: sap-pm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPM_WORKORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: orders
path: "/WorkOrderSet"
operations:
- name: create-order
method: POST
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers?search={{query}}"
inputParameters:
- name: query
in: query
operations:
- name: search-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.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
Calculates Overall Equipment Effectiveness by pulling availability from SAP PM, performance data from the MES system, and quality rates from SAP QM, then publishing to Power BI.
naftiko: "0.5"
info:
label: "Plant OEE Calculation Pipeline"
description: "Calculates Overall Equipment Effectiveness by pulling availability from SAP PM, performance data from the MES system, and quality rates from SAP QM, then publishing to Power BI."
tags:
- manufacturing
- oee
- sap
- power-bi
capability:
exposes:
- type: mcp
namespace: oee-calculation
port: 8080
tools:
- name: calculate-oee
description: "Calculate OEE for a production line and publish to dashboard."
inputParameters:
- name: line_id
in: body
type: string
description: "The production line ID."
- name: shift_date
in: body
type: string
description: "The shift date in YYYY-MM-DD."
steps:
- name: get-availability
type: call
call: "sap-pm.get-downtime"
with:
equipment: "{{line_id}}"
date: "{{shift_date}}"
- name: get-performance
type: call
call: "mes.get-cycle-times"
with:
line: "{{line_id}}"
date: "{{shift_date}}"
- name: get-quality-rate
type: call
call: "sap-qm.get-defect-rate"
with:
line: "{{line_id}}"
date: "{{shift_date}}"
- name: publish-oee
type: call
call: "powerbi.refresh-dataset"
with:
dataset_id: "plant-oee-dashboard"
consumes:
- type: http
namespace: sap-pm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPM_DOWNTIME_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: downtime
path: "/DowntimeSet(Equipment='{{equipment}}',Date='{{date}}')"
inputParameters:
- name: equipment
in: path
- name: date
in: path
operations:
- name: get-downtime
method: GET
- type: http
namespace: mes
baseUri: "https://mes.henkel.com/api/v1"
authentication:
type: bearer
token: "$secrets.mes_token"
resources:
- name: cycles
path: "/lines/{{line}}/cycle-times?date={{date}}"
inputParameters:
- name: line
in: path
- name: date
in: query
operations:
- name: get-cycle-times
method: GET
- type: http
namespace: sap-qm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZQM_DEFECT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: defects
path: "/DefectRateSet(Line='{{line}}',Date='{{date}}')"
inputParameters:
- name: line
in: path
- name: date
in: path
operations:
- name: get-defect-rate
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
Pulls production data from SAP and pushes to Power BI for manufacturing visibility.
naftiko: "0.5"
info:
label: "Power BI Manufacturing Dashboard Sync"
description: "Pulls production data from SAP and pushes to Power BI for manufacturing visibility."
tags:
- analytics
- power-bi
- sap
- manufacturing
capability:
exposes:
- type: mcp
namespace: mfg-dashboard
port: 8080
tools:
- name: sync-production-dashboard
description: "Sync SAP production data to Power BI."
inputParameters:
- name: plant_code
in: body
type: string
description: "The plant code."
steps:
- name: get-production
type: call
call: "sap.get-production-summary"
with:
plant: "{{plant_code}}"
- name: push-to-bi
type: call
call: "powerbi.push-rows"
with:
dataset_id: "production_ds"
table_name: "Production"
rows:
- plant: "{{plant_code}}"
oee: "{{get-production.oee}}"
output: "{{get-production.total_output}}"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPP_PRODORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: summary
path: "/ProductionSummarySet('{{plant}}')"
inputParameters:
- name: plant
in: path
operations:
- name: get-production-summary
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
inputParameters:
- name: dataset_id
in: path
- name: table_name
in: path
operations:
- name: push-rows
method: POST
Validates product launch readiness by checking SAP material master, regulatory approval status in SharePoint, and marketing assets in Adobe Experience Manager.
naftiko: "0.5"
info:
label: "Product Launch Readiness Checker"
description: "Validates product launch readiness by checking SAP material master, regulatory approval status in SharePoint, and marketing assets in Adobe Experience Manager."
tags:
- product
- launch
- sap
- sharepoint
- adobe
capability:
exposes:
- type: mcp
namespace: launch-readiness
port: 8080
tools:
- name: check-launch-readiness
description: "Validate product launch readiness across systems."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: brand_code
in: body
type: string
description: "The brand code."
steps:
- name: get-material
type: call
call: "sap.get-material"
with:
material_id: "{{material_number}}"
- name: check-regulatory
type: call
call: "sharepoint.get-document"
with:
site_id: "regulatory_approvals"
file_path: "Approvals/{{material_number}}_approval.pdf"
- name: check-marketing-assets
type: call
call: "aem.get-assets"
with:
folder: "/content/dam/henkel/{{brand_code}}/{{material_number}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "product-launches"
text: "Launch readiness for {{material_number}}: Material={{get-material.product_name}}, Regulatory={{check-regulatory.status}}, Assets={{check-marketing-assets.count}} files."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/MaterialSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: documents
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: aem
baseUri: "https://aem.henkel.com/api/assets"
authentication:
type: bearer
token: "$secrets.aem_token"
resources:
- name: assets
path: "{{folder}}.json"
inputParameters:
- name: folder
in: path
operations:
- name: get-assets
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Traces production batch genealogy by querying SAP batch records, retrieving raw material lot data, and publishing the full traceability tree to Confluence.
naftiko: "0.5"
info:
label: "Production Batch Genealogy Tracker"
description: "Traces production batch genealogy by querying SAP batch records, retrieving raw material lot data, and publishing the full traceability tree to Confluence."
tags:
- manufacturing
- traceability
- sap
- confluence
capability:
exposes:
- type: mcp
namespace: batch-genealogy
port: 8080
tools:
- name: trace-batch
description: "Trace complete batch genealogy across raw materials and production."
inputParameters:
- name: batch_number
in: body
type: string
description: "The finished goods batch number."
steps:
- name: get-batch-record
type: call
call: "sap.get-batch"
with:
batch_id: "{{batch_number}}"
- name: get-raw-material-lots
type: call
call: "sap.get-component-lots"
with:
production_order: "{{get-batch-record.production_order}}"
- name: publish-genealogy
type: call
call: "confluence.create-page"
with:
space: "QUALITY"
title: "Batch Genealogy: {{batch_number}}"
body: "Product: {{get-batch-record.product_name}}. Production date: {{get-batch-record.production_date}}. Components: {{get-raw-material-lots.lot_summary}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/BatchSet('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch
method: GET
- name: components
path: "/ProductionOrderSet('{{production_order}}')/ComponentLots"
inputParameters:
- name: production_order
in: path
operations:
- name: get-component-lots
method: GET
- type: http
namespace: confluence
baseUri: "https://henkel.atlassian.net/wiki/api/v2"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
On production line downtime alert from Datadog, creates a SAP PM notification, pages the on-call engineer via PagerDuty, and posts to the plant Slack channel.
naftiko: "0.5"
info:
label: "Production Downtime Escalation Pipeline"
description: "On production line downtime alert from Datadog, creates a SAP PM notification, pages the on-call engineer via PagerDuty, and posts to the plant Slack channel."
tags:
- manufacturing
- incident
- datadog
- sap
- pagerduty
- slack
capability:
exposes:
- type: mcp
namespace: downtime-escalation
port: 8080
tools:
- name: escalate-downtime
description: "Escalate production line downtime across operations systems."
inputParameters:
- name: line_id
in: body
type: string
description: "The production line identifier."
- name: plant_code
in: body
type: string
description: "The plant code."
- name: alert_severity
in: body
type: string
description: "Alert severity (critical, warning)."
steps:
- name: get-alert-details
type: call
call: "datadog.get-monitor"
with:
monitor_tag: "line:{{line_id}},plant:{{plant_code}}"
- name: create-pm-notification
type: call
call: "sap-pm.create-notification"
with:
equipment: "{{line_id}}"
plant: "{{plant_code}}"
description: "Production downtime: {{get-alert-details.message}}"
- name: page-engineer
type: call
call: "pagerduty.create-incident"
with:
service_id: "plant_{{plant_code}}"
title: "Line {{line_id}} down at plant {{plant_code}}"
urgency: "{{alert_severity}}"
- name: notify-slack
type: call
call: "slack.post-message"
with:
channel: "plant-{{plant_code}}-ops"
text: "DOWNTIME ALERT: Line {{line_id}} is down. SAP notification: {{create-pm-notification.notification_number}}. PagerDuty incident: {{page-engineer.incident_id}}."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor?monitor_tags={{monitor_tag}}"
inputParameters:
- name: monitor_tag
in: query
operations:
- name: get-monitor
method: GET
- type: http
namespace: sap-pm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPM_NOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: notifications
path: "/NotificationSet"
operations:
- name: create-notification
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a SAP production order by number, returning status, planned quantity, completed quantity, and target completion date.
naftiko: "0.5"
info:
label: "Production Order Status"
description: "Retrieves a SAP production order by number, returning status, planned quantity, completed quantity, and target completion date."
tags:
- manufacturing
- production
- sap
capability:
exposes:
- type: mcp
namespace: production-orders
port: 8080
tools:
- name: get-production-order
description: "Look up a SAP production order."
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: status
type: string
mapping: "$.d.OrderStatus"
- name: planned_qty
type: integer
mapping: "$.d.PlannedQuantity"
- name: completed_qty
type: integer
mapping: "$.d.CompletedQuantity"
- name: target_date
type: string
mapping: "$.d.TargetCompletionDate"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPP_PRODORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/ProductionOrderSet('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-production-order
method: GET
Triggers a Qlik Sense reload for manufacturing analytics and notifies the team.
naftiko: "0.5"
info:
label: "Qlik Sense Manufacturing Dashboard Refresh"
description: "Triggers a Qlik Sense reload for manufacturing analytics and notifies the team."
tags:
- analytics
- qlik-sense
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: analytics-refresh
port: 8080
tools:
- name: refresh-qlik-dashboard
description: "Trigger a Qlik Sense reload."
inputParameters:
- name: app_id
in: body
type: string
description: "Qlik Sense app ID."
steps:
- name: trigger-reload
type: call
call: "qlik.reload-app"
with:
app_id: "{{app_id}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "manufacturing-analytics"
text: "Qlik dashboard {{app_id}} reloaded. ID: {{trigger-reload.reloadId}}."
consumes:
- type: http
namespace: qlik
baseUri: "https://henkel.us.qlikcloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.qlik_token"
resources:
- name: reloads
path: "/reloads"
operations:
- name: reload-app
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Automates raw material procurement by checking stock in SAP, generating a purchase requisition, and notifying the procurement team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Raw Material Procurement Orchestrator"
description: "Automates raw material procurement by checking stock in SAP, generating a purchase requisition, and notifying the procurement team via Microsoft Teams."
tags:
- procurement
- supply-chain
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: material-procurement
port: 8080
tools:
- name: procure-material
description: "Automate raw material procurement workflow."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: quantity_needed
in: body
type: number
description: "Quantity needed."
- name: plant_code
in: body
type: string
description: "The manufacturing plant code."
steps:
- name: check-stock
type: call
call: "sap.get-stock"
with:
material_id: "{{material_number}}"
plant: "{{plant_code}}"
- name: create-requisition
type: call
call: "sap.create-purchase-req"
with:
material_id: "{{material_number}}"
quantity: "{{quantity_needed}}"
plant: "{{plant_code}}"
- name: notify-procurement
type: call
call: "msteams.send-message"
with:
channel_id: "procurement-alerts"
text: "Purchase requisition {{create-requisition.req_number}} created for material {{material_number}}, qty {{quantity_needed}} at plant {{plant_code}}. Current stock: {{check-stock.available_quantity}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZMM_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/StockSet(Material='{{material_id}}',Plant='{{plant}}')"
inputParameters:
- name: material_id
in: path
- name: plant
in: path
operations:
- name: get-stock
method: GET
- name: purchase-requisitions
path: "/PurchaseRequisitionSet"
operations:
- name: create-purchase-req
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/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Coordinates R&D project gate reviews by pulling project status from Jira, gathering test results from LIMS, and scheduling review meetings via Microsoft Outlook.
naftiko: "0.5"
info:
label: "R&D Project Gate Review Coordinator"
description: "Coordinates R&D project gate reviews by pulling project status from Jira, gathering test results from LIMS, and scheduling review meetings via Microsoft Outlook."
tags:
- rd
- project-management
- jira
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: gate-review
port: 8080
tools:
- name: coordinate-gate-review
description: "Coordinate an R&D project gate review."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key."
- name: gate_number
in: body
type: string
description: "The gate review number."
- name: reviewers
in: body
type: string
description: "Comma-separated reviewer emails."
steps:
- name: get-project-status
type: call
call: "jira.get-project-summary"
with:
project: "{{project_key}}"
- name: get-lab-results
type: call
call: "lims.get-test-summary"
with:
project_ref: "{{project_key}}"
gate: "{{gate_number}}"
- name: schedule-review
type: call
call: "outlook.create-event"
with:
subject: "Gate {{gate_number}} Review: {{project_key}}"
attendees: "{{reviewers}}"
body: "Project status: {{get-project-status.summary}}. Lab tests: {{get-lab-results.pass_rate}}% pass rate."
consumes:
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: projects
path: "/project/{{project}}"
inputParameters:
- name: project
in: path
operations:
- name: get-project-summary
method: GET
- type: http
namespace: lims
baseUri: "https://lims.henkel.com/api/v1"
authentication:
type: bearer
token: "$secrets.lims_token"
resources:
- name: tests
path: "/projects/{{project_ref}}/gates/{{gate}}/results"
inputParameters:
- name: project_ref
in: path
- name: gate
in: path
operations:
- name: get-test-summary
method: GET
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: events
path: "/me/events"
operations:
- name: create-event
method: POST
Retrieves regulatory documents from SAP, stores in SharePoint for compliance tracking, and creates a Jira task for review.
naftiko: "0.5"
info:
label: "Regulatory Compliance Document Manager"
description: "Retrieves regulatory documents from SAP, stores in SharePoint for compliance tracking, and creates a Jira task for review."
tags:
- compliance
- regulatory
- sap
- sharepoint
- jira
capability:
exposes:
- type: mcp
namespace: regulatory-compliance
port: 8080
tools:
- name: manage-regulatory-doc
description: "Store a regulatory document and create a review task."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: regulation_type
in: body
type: string
description: "The regulation type (e.g. REACH, GHS, FDA)."
steps:
- name: get-reg-data
type: call
call: "sap.get-regulatory-data"
with:
material_id: "{{material_number}}"
regulation: "{{regulation_type}}"
- name: store-doc
type: call
call: "sharepoint.create-file"
with:
site_id: "regulatory_site"
file_path: "Compliance/{{regulation_type}}/{{material_number}}_{{get-reg-data.document_version}}.pdf"
- name: create-review
type: call
call: "jira.create-issue"
with:
project_key: "REG"
summary: "{{regulation_type}} review: {{material_number}} - {{get-reg-data.product_name}}"
issue_type: "Task"
description: "Regulatory document for {{get-reg-data.product_name}}. Regulation: {{regulation_type}}. Status: {{get-reg-data.compliance_status}}. Doc: {{store-doc.url}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEH_REGULATORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: regulatory
path: "/RegulatoryDataSet(Material='{{material_id}}',Regulation='{{regulation}}')"
inputParameters:
- name: material_id
in: path
- name: regulation
in: path
operations:
- name: get-regulatory-data
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
- type: http
namespace: jira
baseUri: "https://henkel.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
Processes inbound EDI purchase orders from retail partners, creates corresponding SAP sales orders, and sends acknowledgment via AS2 gateway.
naftiko: "0.5"
info:
label: "Retail Partner EDI Data Exchange"
description: "Processes inbound EDI purchase orders from retail partners, creates corresponding SAP sales orders, and sends acknowledgment via AS2 gateway."
tags:
- edi
- retail
- sap
- supply-chain
capability:
exposes:
- type: mcp
namespace: edi-exchange
port: 8080
tools:
- name: process-edi-order
description: "Process an inbound EDI 850 purchase order from a retail partner."
inputParameters:
- name: edi_transaction_id
in: body
type: string
description: "The EDI transaction ID."
- name: partner_id
in: body
type: string
description: "The trading partner ID."
steps:
- name: parse-edi
type: call
call: "edi-gateway.get-transaction"
with:
transaction_id: "{{edi_transaction_id}}"
- name: create-sales-order
type: call
call: "sap.create-sales-order"
with:
customer: "{{partner_id}}"
items: "{{parse-edi.line_items}}"
po_number: "{{parse-edi.po_number}}"
- name: send-acknowledgment
type: call
call: "edi-gateway.send-855"
with:
partner_id: "{{partner_id}}"
po_number: "{{parse-edi.po_number}}"
sales_order: "{{create-sales-order.order_number}}"
consumes:
- type: http
namespace: edi-gateway
baseUri: "https://edi.henkel.com/api/v1"
authentication:
type: bearer
token: "$secrets.edi_gateway_token"
resources:
- name: transactions
path: "/transactions/{{transaction_id}}"
inputParameters:
- name: transaction_id
in: path
operations:
- name: get-transaction
method: GET
- name: outbound
path: "/outbound/855"
operations:
- name: send-855
method: POST
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZSD_SALESORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/SalesOrderSet"
operations:
- name: create-sales-order
method: POST
When a safety incident occurs at a plant, creates a ServiceNow incident, logs in SAP EHS, and notifies the safety team and plant manager in Microsoft Teams.
naftiko: "0.5"
info:
label: "Safety Incident Reporter"
description: "When a safety incident occurs at a plant, creates a ServiceNow incident, logs in SAP EHS, and notifies the safety team and plant manager in Microsoft Teams."
tags:
- safety
- ehs
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: safety-incidents
port: 8080
tools:
- name: report-safety-incident
description: "Report a plant safety incident across all systems."
inputParameters:
- name: plant_code
in: body
type: string
description: "The plant code."
- name: incident_description
in: body
type: string
description: "Description of the incident."
- name: severity
in: body
type: string
description: "Incident severity (low, medium, high, critical)."
steps:
- name: create-snow-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Safety incident at plant {{plant_code}}"
priority: "{{severity}}"
description: "{{incident_description}}"
assigned_group: "EHS_Team"
- name: log-in-sap
type: call
call: "sap.create-ehs-incident"
with:
plant: "{{plant_code}}"
description: "{{incident_description}}"
severity: "{{severity}}"
snow_ref: "{{create-snow-incident.number}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "safety-alerts"
text: "SAFETY INCIDENT at plant {{plant_code}} ({{severity}}): {{incident_description}}. ServiceNow: {{create-snow-incident.number}}. SAP EHS: {{log-in-sap.incident_id}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEH_EHS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ehs-incidents
path: "/EHSIncidentSet"
operations:
- name: create-ehs-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Compares actual sales from SAP BW against forecast in Snowflake, calculates variance, and sends alerts to sales leadership via Microsoft Teams when thresholds are breached.
naftiko: "0.5"
info:
label: "Sales Forecast Variance Alerter"
description: "Compares actual sales from SAP BW against forecast in Snowflake, calculates variance, and sends alerts to sales leadership via Microsoft Teams when thresholds are breached."
tags:
- sales
- forecasting
- sap-bw
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: forecast-variance
port: 8080
tools:
- name: check-forecast-variance
description: "Check sales forecast variance and alert on threshold breach."
inputParameters:
- name: brand_code
in: body
type: string
description: "The brand code."
- name: region
in: body
type: string
description: "The sales region."
- name: period
in: body
type: string
description: "The reporting period."
steps:
- name: get-actual-sales
type: call
call: "sap-bw.get-sales"
with:
brand: "{{brand_code}}"
region: "{{region}}"
period: "{{period}}"
- name: get-forecast
type: call
call: "snowflake.execute-query"
with:
statement: "SELECT forecast_amount FROM sales_forecast WHERE brand='{{brand_code}}' AND region='{{region}}' AND period='{{period}}'"
- name: alert-leadership
type: call
call: "msteams.send-message"
with:
channel_id: "sales-leadership"
text: "Forecast variance alert for {{brand_code}} in {{region}} ({{period}}): Actual={{get-actual-sales.total}}, Forecast={{get-forecast.data[0].forecast_amount}}."
consumes:
- type: http
namespace: sap-bw
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZBW_SALES_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales
path: "/SalesDataSet(Brand='{{brand}}',Region='{{region}}',Period='{{period}}')"
inputParameters:
- name: brand
in: path
- name: region
in: path
- name: period
in: path
operations:
- name: get-sales
method: GET
- type: http
namespace: snowflake
baseUri: "https://henkel.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves a B2B customer account from Salesforce by ID, returning company name, segment, annual volume, and primary contact.
naftiko: "0.5"
info:
label: "Salesforce B2B Account Lookup"
description: "Retrieves a B2B customer account from Salesforce by ID, returning company name, segment, annual volume, and primary contact."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: b2b-accounts
port: 8080
tools:
- name: get-b2b-account
description: "Look up a Salesforce B2B account."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID."
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
outputParameters:
- name: company_name
type: string
mapping: "$.Name"
- name: segment
type: string
mapping: "$.Segment__c"
- name: annual_volume
type: string
mapping: "$.Annual_Volume__c"
- name: primary_contact
type: string
mapping: "$.Primary_Contact__c"
consumes:
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
Retrieves the current stage, close date, and amount for a Salesforce opportunity by opportunity ID.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Status Lookup"
description: "Retrieves the current stage, close date, and amount for a Salesforce opportunity by opportunity ID."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: sf-opportunity
port: 8080
tools:
- name: get-opportunity
description: "Look up a Salesforce opportunity by ID."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID."
call: "salesforce.get-opportunity"
with:
opp_id: "{{opportunity_id}}"
outputParameters:
- name: stage
type: string
mapping: "$.StageName"
- name: close_date
type: string
mapping: "$.CloseDate"
- name: amount
type: string
mapping: "$.Amount"
consumes:
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opp_id}}"
inputParameters:
- name: opp_id
in: path
operations:
- name: get-opportunity
method: GET
Retrieves supplier qualification data from SAP Ariba, checks certifications, and creates a ServiceNow task for expired certifications.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Qualification"
description: "Retrieves supplier qualification data from SAP Ariba, checks certifications, and creates a ServiceNow task for expired certifications."
tags:
- procurement
- supplier-management
- sap-ariba
- servicenow
capability:
exposes:
- type: mcp
namespace: supplier-qualification
port: 8080
tools:
- name: check-supplier-quals
description: "Check supplier qualifications and flag expired certifications."
inputParameters:
- name: supplier_id
in: body
type: string
description: "The SAP Ariba supplier ID."
steps:
- name: get-supplier
type: call
call: "ariba.get-supplier"
with:
supplier_id: "{{supplier_id}}"
- name: create-task
type: call
call: "servicenow.create-record"
with:
table: "u_supplier_tasks"
short_description: "Certification review: {{get-supplier.name}} - {{get-supplier.expired_certs}} expired"
description: "Supplier: {{get-supplier.name}}. Category: {{get-supplier.category}}. Expired certifications: {{get-supplier.expired_cert_names}}."
assigned_group: "Procurement_Quality"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-management/v2"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers/{{supplier_id}}"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
Queries SAP BW for sales analytics by product line and region.
naftiko: "0.5"
info:
label: "SAP BW Sales Analytics"
description: "Queries SAP BW for sales analytics by product line and region."
tags:
- analytics
- sap-bw
- sales
capability:
exposes:
- type: mcp
namespace: sales-analytics
port: 8080
tools:
- name: get-sales-analytics
description: "Get sales analytics from SAP BW."
inputParameters:
- name: product_line
in: body
type: string
description: "The product line."
- name: region
in: body
type: string
description: "The sales region."
call: "sapbw.get-sales"
with:
product_line: "{{product_line}}"
region: "{{region}}"
outputParameters:
- name: revenue
type: string
mapping: "$.d.Revenue"
- name: volume
type: integer
mapping: "$.d.Volume"
- name: yoy_growth
type: string
mapping: "$.d.YoYGrowth"
consumes:
- type: http
namespace: sapbw
baseUri: "https://henkel-bw.sap.com/sap/opu/odata/sap/ZSD_SALES_BW_SRV"
authentication:
type: basic
username: "$secrets.sap_bw_user"
password: "$secrets.sap_bw_password"
resources:
- name: sales
path: "/SalesAnalyticsSet(ProductLine='{{product_line}}',Region='{{region}}')"
inputParameters:
- name: product_line
in: path
- name: region
in: path
operations:
- name: get-sales
method: GET
Retrieves a travel expense report from SAP Concur and creates a Jira approval task.
naftiko: "0.5"
info:
label: "SAP Concur Travel Expense Processor"
description: "Retrieves a travel expense report from SAP Concur and creates a Jira approval task."
tags:
- finance
- travel
- sap-concur
- jira
capability:
exposes:
- type: mcp
namespace: travel-expenses
port: 8080
tools:
- name: process-expense-report
description: "Validate a Concur expense report and route for approval."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur report ID."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
report_id: "{{report_id}}"
- name: create-approval
type: call
call: "jira.create-issue"
with:
project_key: "FIN"
summary: "Expense review: {{get-report.employee_name}} - {{get-report.total_amount}} {{get-report.currency}}"
issue_type: "Task"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: jira
baseUri: "https://henkel.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
Queries SAP HANA for production analytics by plant and product line, returning OEE, yield, and downtime metrics.
naftiko: "0.5"
info:
label: "SAP HANA Production Analytics"
description: "Queries SAP HANA for production analytics by plant and product line, returning OEE, yield, and downtime metrics."
tags:
- analytics
- manufacturing
- sap-hana
capability:
exposes:
- type: mcp
namespace: production-analytics
port: 8080
tools:
- name: query-production-analytics
description: "Query SAP HANA for production performance metrics."
inputParameters:
- name: plant_code
in: body
type: string
description: "The plant code."
- name: product_line
in: body
type: string
description: "The product line."
call: "saphana.query-production"
with:
plant: "{{plant_code}}"
product_line: "{{product_line}}"
outputParameters:
- name: oee
type: string
mapping: "$.d.OEE"
- name: yield_pct
type: string
mapping: "$.d.YieldPercentage"
- name: downtime_hours
type: number
mapping: "$.d.DowntimeHours"
consumes:
- type: http
namespace: saphana
baseUri: "https://henkel-hana.sap.com/sap/opu/odata/sap/ZPP_ANALYTICS_SRV"
authentication:
type: basic
username: "$secrets.sap_hana_user"
password: "$secrets.sap_hana_password"
resources:
- name: production
path: "/ProductionAnalyticsSet(Plant='{{plant}}',ProductLine='{{product_line}}')"
inputParameters:
- name: plant
in: path
- name: product_line
in: path
operations:
- name: query-production
method: GET
Retrieves the material safety data sheet for a chemical product from SAP EHS by material number, returning hazard classifications and handling instructions.
naftiko: "0.5"
info:
label: "SAP Material Safety Data Sheet Lookup"
description: "Retrieves the material safety data sheet for a chemical product from SAP EHS by material number, returning hazard classifications and handling instructions."
tags:
- safety
- regulatory
- sap
capability:
exposes:
- type: mcp
namespace: msds-lookup
port: 8080
tools:
- name: get-msds
description: "Retrieve MSDS document details for a given material number."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
call: "sap-ehs.get-msds"
with:
material_id: "{{material_number}}"
outputParameters:
- name: hazard_class
type: string
mapping: "$.d.HazardClassification"
- name: handling_instructions
type: string
mapping: "$.d.HandlingInstructions"
- name: ghs_pictograms
type: string
mapping: "$.d.GHSPictograms"
consumes:
- type: http
namespace: sap-ehs
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEH_MSDS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: msds
path: "/MSDSSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-msds
method: GET
Retrieves a product master record from SAP by material number, returning product name, category, formulation type, and regulatory status.
naftiko: "0.5"
info:
label: "SAP Product Master Lookup"
description: "Retrieves a product master record from SAP by material number, returning product name, category, formulation type, and regulatory status."
tags:
- product
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: product-master
port: 8080
tools:
- name: get-product-master
description: "Look up a SAP product master by material number."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
call: "sap.get-material"
with:
material_id: "{{material_number}}"
outputParameters:
- name: product_name
type: string
mapping: "$.d.MaterialDescription"
- name: category
type: string
mapping: "$.d.MaterialGroup"
- name: formulation_type
type: string
mapping: "$.d.FormulationType"
- name: regulatory_status
type: string
mapping: "$.d.RegulatoryStatus"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/MaterialSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-material
method: GET
Looks up a SAP purchase order by number and returns status, vendor, total value, and delivery date.
naftiko: "0.5"
info:
label: "SAP Purchase Order Status"
description: "Looks up a SAP purchase order by number and returns status, vendor, total value, and delivery date."
tags:
- procurement
- sap
- purchase-order
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP purchase order by PO number."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number."
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: delivery_date
type: string
mapping: "$.d.DeliveryDate"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves quality inspection lot details from SAP QM by inspection lot number, returning result status, defect count, and decision code.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Lookup"
description: "Retrieves quality inspection lot details from SAP QM by inspection lot number, returning result status, defect count, and decision code."
tags:
- quality
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: quality-inspection
port: 8080
tools:
- name: get-inspection-lot
description: "Look up quality inspection lot details by lot number."
inputParameters:
- name: lot_number
in: body
type: string
description: "The SAP inspection lot number."
call: "sap-qm.get-lot"
with:
lot_id: "{{lot_number}}"
outputParameters:
- name: result_status
type: string
mapping: "$.d.InspectionResult"
- name: defect_count
type: integer
mapping: "$.d.DefectCount"
- name: decision_code
type: string
mapping: "$.d.UsageDecisionCode"
consumes:
- type: http
namespace: sap-qm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZQM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: lots
path: "/InspectionLotSet('{{lot_id}}')"
inputParameters:
- name: lot_id
in: path
operations:
- name: get-lot
method: GET
Checks material availability across plants in SAP S/4HANA, returning stock levels and next replenishment dates.
naftiko: "0.5"
info:
label: "SAP S/4HANA Material Availability Check"
description: "Checks material availability across plants in SAP S/4HANA, returning stock levels and next replenishment dates."
tags:
- supply-chain
- sap
- material-planning
capability:
exposes:
- type: mcp
namespace: material-availability
port: 8080
tools:
- name: check-material-availability
description: "Check material availability across Henkel plants."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
call: "sap.check-availability"
with:
material_id: "{{material_number}}"
outputParameters:
- name: total_stock
type: integer
mapping: "$.d.TotalStock"
- name: plants_with_stock
type: array
mapping: "$.d.PlantStock.results"
- name: next_replenishment
type: string
mapping: "$.d.NextReplenishmentDate"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZMM_AVAILABILITY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: availability
path: "/MaterialAvailabilitySet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: check-availability
method: GET
Looks up a SAP sales order and returns status, customer, total value, and delivery date.
naftiko: "0.5"
info:
label: "SAP Sales Order Status"
description: "Looks up a SAP sales order and returns status, customer, total value, and delivery date."
tags:
- sales
- sap
- order-management
capability:
exposes:
- type: mcp
namespace: sales-orders
port: 8080
tools:
- name: get-sales-order
description: "Look up a SAP sales order."
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: status
type: string
mapping: "$.d.OrderStatus"
- name: customer
type: string
mapping: "$.d.CustomerName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZSD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/SalesOrderSet('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-sales-order
method: GET
Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and compliance status.
naftiko: "0.5"
info:
label: "SAP Vendor Master Lookup"
description: "Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and compliance status."
tags:
- procurement
- vendor
- sap
capability:
exposes:
- type: mcp
namespace: vendor-master
port: 8080
tools:
- name: get-vendor
description: "Look up a vendor master record by vendor number."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor number."
call: "sap.get-vendor"
with:
vendor_id: "{{vendor_number}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.d.VendorName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: compliance_status
type: string
mapping: "$.d.ComplianceStatus"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZVN_VENDOR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/VendorSet('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor
method: GET
Returns the current stock level for a material at a specific warehouse location in SAP Extended Warehouse Management.
naftiko: "0.5"
info:
label: "SAP Warehouse Stock Level"
description: "Returns the current stock level for a material at a specific warehouse location in SAP Extended Warehouse Management."
tags:
- warehouse
- inventory
- sap
capability:
exposes:
- type: mcp
namespace: warehouse-stock
port: 8080
tools:
- name: get-stock-level
description: "Check stock level for a material at a given warehouse."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: warehouse_id
in: body
type: string
description: "The warehouse location ID."
call: "sap-ewm.get-stock"
with:
material_id: "{{material_number}}"
warehouse: "{{warehouse_id}}"
outputParameters:
- name: available_quantity
type: number
mapping: "$.d.AvailableQuantity"
- name: unit_of_measure
type: string
mapping: "$.d.UnitOfMeasure"
consumes:
- type: http
namespace: sap-ewm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEWM_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/StockSet(Material='{{material_id}}',Warehouse='{{warehouse}}')"
inputParameters:
- name: material_id
in: path
- name: warehouse
in: path
operations:
- name: get-stock
method: GET
Retrieves a ServiceNow incident by number, returning state, priority, and assigned group.
naftiko: "0.5"
info:
label: "ServiceNow Ticket Status"
description: "Retrieves a ServiceNow incident by number, returning state, priority, and assigned group."
tags:
- it-service
- servicenow
capability:
exposes:
- type: mcp
namespace: itsm-tickets
port: 8080
tools:
- name: get-ticket-status
description: "Look up a ServiceNow incident."
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[0].state"
- name: priority
type: string
mapping: "$.result[0].priority"
- name: assigned_group
type: string
mapping: "$.result[0].assignment_group.display_value"
consumes:
- type: http
namespace: servicenow
baseUri: "https://henkel.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: path
operations:
- name: get-incident
method: GET
Retrieves a document from SharePoint by path.
naftiko: "0.5"
info:
label: "SharePoint Document Retrieval"
description: "Retrieves a document from SharePoint by path."
tags:
- document-management
- sharepoint
capability:
exposes:
- type: mcp
namespace: doc-management
port: 8080
tools:
- name: get-document
description: "Retrieve a document from SharePoint."
inputParameters:
- name: site_id
in: body
type: string
description: "SharePoint site ID."
- name: file_path
in: body
type: string
description: "File path."
call: "sharepoint.get-file"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
outputParameters:
- name: download_url
type: string
mapping: "$.['@microsoft.graph.downloadUrl']"
- name: last_modified
type: string
mapping: "$.lastModifiedDateTime"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file
method: GET
Sends a formatted alert message to a designated Slack channel for manufacturing plant notifications.
naftiko: "0.5"
info:
label: "Slack Plant Alert Broadcaster"
description: "Sends a formatted alert message to a designated Slack channel for manufacturing plant notifications."
tags:
- communications
- manufacturing
- slack
capability:
exposes:
- type: mcp
namespace: plant-alerts
port: 8080
tools:
- name: broadcast-plant-alert
description: "Send an alert message to a Slack plant channel."
inputParameters:
- name: channel_id
in: body
type: string
description: "The Slack channel ID."
- name: alert_message
in: body
type: string
description: "The alert message text."
call: "slack.post-message"
with:
channel: "{{channel_id}}"
text: "{{alert_message}}"
outputParameters:
- name: message_ts
type: string
mapping: "$.ts"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Runs a customer segmentation query in Snowflake, returning segment name, customer count, and average order value for a given brand.
naftiko: "0.5"
info:
label: "Snowflake Customer Segmentation Query"
description: "Runs a customer segmentation query in Snowflake, returning segment name, customer count, and average order value for a given brand."
tags:
- analytics
- customer
- snowflake
capability:
exposes:
- type: mcp
namespace: customer-segments
port: 8080
tools:
- name: query-segments
description: "Query customer segments by brand from Snowflake."
inputParameters:
- name: brand
in: body
type: string
description: "The brand name to segment."
call: "snowflake.execute-query"
with:
statement: "SELECT segment_name, customer_count, avg_order_value FROM customer_segments WHERE brand = '{{brand}}'"
outputParameters:
- name: segments
type: array
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://henkel.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves network device health from SolarWinds for Henkel plant networks.
naftiko: "0.5"
info:
label: "SolarWinds Network Monitor"
description: "Retrieves network device health from SolarWinds for Henkel plant networks."
tags:
- it-operations
- network
- solarwinds
capability:
exposes:
- type: mcp
namespace: network-monitoring
port: 8080
tools:
- name: get-network-health
description: "Get network device health from SolarWinds."
inputParameters:
- name: node_id
in: body
type: string
description: "The SolarWinds node ID."
call: "solarwinds.get-node"
with:
node_id: "{{node_id}}"
outputParameters:
- name: status
type: string
mapping: "$.StatusDescription"
- name: cpu_load
type: number
mapping: "$.CPULoad"
- name: memory_used_pct
type: number
mapping: "$.PercentMemoryUsed"
consumes:
- type: http
namespace: solarwinds
baseUri: "https://henkel-solarwinds.com:17778/SolarWinds/InformationService/v3/Json"
authentication:
type: basic
username: "$secrets.solarwinds_user"
password: "$secrets.solarwinds_password"
resources:
- name: nodes
path: "/Query?query=SELECT+*+FROM+Orion.Nodes+WHERE+NodeID={{node_id}}"
inputParameters:
- name: node_id
in: query
operations:
- name: get-node
method: GET
Searches Splunk for production error logs from manufacturing systems, filtered by plant code and time range.
naftiko: "0.5"
info:
label: "Splunk Production Error Log Search"
description: "Searches Splunk for production error logs from manufacturing systems, filtered by plant code and time range."
tags:
- monitoring
- manufacturing
- splunk
capability:
exposes:
- type: mcp
namespace: production-logs
port: 8080
tools:
- name: search-error-logs
description: "Search Splunk for production error events by plant code."
inputParameters:
- name: plant_code
in: body
type: string
description: "The manufacturing plant code."
- name: hours_back
in: body
type: integer
description: "Number of hours to search back."
call: "splunk.search"
with:
search: "search index=production plant={{plant_code}} level=ERROR earliest=-{{hours_back}}h"
outputParameters:
- name: event_count
type: integer
mapping: "$.results.count"
- name: events
type: array
mapping: "$.results.events"
consumes:
- type: http
namespace: splunk
baseUri: "https://splunk.henkel.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search-jobs
path: "/search/jobs"
operations:
- name: search
method: POST
When a supplier invoice arrives in SAP, matches against the PO, creates a Jira approval task if variance detected, and notifies finance in Microsoft Teams.
naftiko: "0.5"
info:
label: "Supplier Invoice Processor"
description: "When a supplier invoice arrives in SAP, matches against the PO, creates a Jira approval task if variance detected, and notifies finance in Microsoft Teams."
tags:
- finance
- invoicing
- sap
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: invoice-processing
port: 8080
tools:
- name: process-invoice
description: "Match a supplier invoice against its PO and route for approval."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The SAP invoice number."
- name: po_number
in: body
type: string
description: "The related PO number."
steps:
- name: get-invoice
type: call
call: "sap.get-invoice"
with:
invoice_number: "{{invoice_number}}"
- name: get-po
type: call
call: "sap.get-po"
with:
po_number: "{{po_number}}"
- name: create-approval
type: call
call: "jira.create-issue"
with:
project_key: "FIN"
summary: "Invoice variance: {{invoice_number}} vs PO {{po_number}}"
issue_type: "Task"
description: "Invoice: {{get-invoice.total_amount}} {{get-invoice.currency}}. PO: {{get-po.TotalAmount}}."
- name: notify-finance
type: call
call: "msteams.send-message"
with:
channel_id: "finance-approvals"
text: "Invoice {{invoice_number}} for PO {{po_number}} requires approval. Jira: {{create-approval.key}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice('{{invoice_number}}')"
inputParameters:
- name: invoice_number
in: path
operations:
- name: get-invoice
method: GET
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: jira
baseUri: "https://henkel.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Assesses supplier risk by pulling vendor data from SAP Ariba, checking financial health via Dun and Bradstreet, and logging findings in ServiceNow.
naftiko: "0.5"
info:
label: "Supplier Risk Assessment Pipeline"
description: "Assesses supplier risk by pulling vendor data from SAP Ariba, checking financial health via Dun and Bradstreet, and logging findings in ServiceNow."
tags:
- procurement
- risk
- sap-ariba
- servicenow
capability:
exposes:
- type: mcp
namespace: supplier-risk
port: 8080
tools:
- name: assess-supplier-risk
description: "Run supplier risk assessment across procurement and financial systems."
inputParameters:
- name: vendor_id
in: body
type: string
description: "The SAP Ariba vendor ID."
steps:
- name: get-vendor-profile
type: call
call: "ariba.get-supplier"
with:
supplier_id: "{{vendor_id}}"
- name: check-financial-health
type: call
call: "dnb.get-company-risk"
with:
duns_number: "{{get-vendor-profile.duns_number}}"
- name: log-assessment
type: call
call: "servicenow.create-record"
with:
table: "u_supplier_risk"
vendor_name: "{{get-vendor-profile.vendor_name}}"
risk_score: "{{check-financial-health.risk_score}}"
financial_rating: "{{check-financial-health.rating}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/sourcing/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers/{{supplier_id}}"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier
method: GET
- type: http
namespace: dnb
baseUri: "https://plus.dnb.com/v1"
authentication:
type: bearer
token: "$secrets.dnb_token"
resources:
- name: risk
path: "/data/duns/{{duns_number}}?productId=cmprsk"
inputParameters:
- name: duns_number
in: path
operations:
- name: get-company-risk
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
Pulls inventory levels from SAP for raw materials and finished goods, pushes to Power BI for supply chain visibility, and alerts the planning team in Microsoft Teams if below safety stock.
naftiko: "0.5"
info:
label: "Supply Chain Inventory Monitor"
description: "Pulls inventory levels from SAP for raw materials and finished goods, pushes to Power BI for supply chain visibility, and alerts the planning team in Microsoft Teams if below safety stock."
tags:
- supply-chain
- inventory
- sap
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-inventory
port: 8080
tools:
- name: monitor-inventory
description: "Monitor inventory levels and alert on low stock."
inputParameters:
- name: plant_code
in: body
type: string
description: "The SAP plant code."
- name: material_group
in: body
type: string
description: "The material group to monitor."
steps:
- name: get-inventory
type: call
call: "sap.get-plant-inventory"
with:
plant: "{{plant_code}}"
material_group: "{{material_group}}"
- name: push-to-bi
type: call
call: "powerbi.push-rows"
with:
dataset_id: "inventory_ds"
table_name: "Inventory"
rows:
- plant: "{{plant_code}}"
material_group: "{{material_group}}"
on_hand: "{{get-inventory.total_on_hand}}"
safety_stock: "{{get-inventory.safety_stock}}"
below_safety: "{{get-inventory.below_safety_count}}"
- name: alert-planning
type: call
call: "msteams.send-message"
with:
channel_id: "supply-chain-planning"
text: "Inventory alert for plant {{plant_code}}: {{get-inventory.below_safety_count}} materials below safety stock in group {{material_group}}."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZMM_INVENTORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inventory
path: "/PlantInventorySet(Plant='{{plant}}',MaterialGroup='{{material_group}}')"
inputParameters:
- name: plant
in: path
- name: material_group
in: path
operations:
- name: get-plant-inventory
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
inputParameters:
- name: dataset_id
in: path
- name: table_name
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Pulls sustainability metrics from SAP including CO2 emissions, water usage, and waste reduction, and publishes a report to Confluence.
naftiko: "0.5"
info:
label: "Sustainability Metrics Reporter"
description: "Pulls sustainability metrics from SAP including CO2 emissions, water usage, and waste reduction, and publishes a report to Confluence."
tags:
- sustainability
- reporting
- sap
- confluence
capability:
exposes:
- type: mcp
namespace: sustainability-reporting
port: 8080
tools:
- name: generate-sustainability-report
description: "Generate a sustainability report from SAP data and publish to Confluence."
inputParameters:
- name: plant_code
in: body
type: string
description: "The SAP plant code."
- name: period
in: body
type: string
description: "The reporting period."
steps:
- name: get-metrics
type: call
call: "sap.get-sustainability-metrics"
with:
plant: "{{plant_code}}"
period: "{{period}}"
- name: publish-report
type: call
call: "confluence.create-page"
with:
space_key: "ESG"
title: "Sustainability Report: Plant {{plant_code}} - {{period}}"
body: "CO2 emissions: {{get-metrics.co2_tonnes}} tonnes. Water usage: {{get-metrics.water_m3}} m3. Waste reduction: {{get-metrics.waste_reduction_pct}}%. Renewable energy: {{get-metrics.renewable_pct}}%."
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEH_SUSTAINABILITY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: metrics
path: "/SustainabilityMetricSet(Plant='{{plant}}',Period='{{period}}')"
inputParameters:
- name: plant
in: path
- name: period
in: path
operations:
- name: get-sustainability-metrics
method: GET
- type: http
namespace: confluence
baseUri: "https://henkel.atlassian.net/wiki/api/v2"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Collects sustainability metrics from SAP plant energy data, Workday headcount for diversity stats, and carbon tracking from Sphera, compiling into a SharePoint report.
naftiko: "0.5"
info:
label: "Sustainability Report Data Collector"
description: "Collects sustainability metrics from SAP plant energy data, Workday headcount for diversity stats, and carbon tracking from Sphera, compiling into a SharePoint report."
tags:
- sustainability
- reporting
- sap
- workday
- sharepoint
capability:
exposes:
- type: mcp
namespace: sustainability-data
port: 8080
tools:
- name: collect-sustainability-data
description: "Collect sustainability report data from multiple sources."
inputParameters:
- name: reporting_period
in: body
type: string
description: "Reporting period in YYYY-Q format."
- name: plant_code
in: body
type: string
description: "The plant code."
steps:
- name: get-energy-data
type: call
call: "sap.get-energy-consumption"
with:
plant: "{{plant_code}}"
period: "{{reporting_period}}"
- name: get-diversity-stats
type: call
call: "workday.get-headcount-report"
with:
report_name: "diversity_metrics"
period: "{{reporting_period}}"
- name: get-carbon-data
type: call
call: "sphera.get-emissions"
with:
facility: "{{plant_code}}"
period: "{{reporting_period}}"
- name: upload-report
type: call
call: "sharepoint.upload-document"
with:
site_id: "sustainability_reports"
folder_path: "Quarterly/{{reporting_period}}"
file_name: "plant_{{plant_code}}_sustainability.json"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEN_ENERGY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: energy
path: "/EnergyConsumptionSet(Plant='{{plant}}',Period='{{period}}')"
inputParameters:
- name: plant
in: path
- name: period
in: path
operations:
- name: get-energy-consumption
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: reports
path: "/reports/{{report_name}}?period={{period}}"
inputParameters:
- name: report_name
in: path
- name: period
in: query
operations:
- name: get-headcount-report
method: GET
- type: http
namespace: sphera
baseUri: "https://api.sphera.com/v1"
authentication:
type: bearer
token: "$secrets.sphera_token"
resources:
- name: emissions
path: "/facilities/{{facility}}/emissions?period={{period}}"
inputParameters:
- name: facility
in: path
- name: period
in: query
operations:
- name: get-emissions
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: uploads
path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-document
method: PUT
Extracts a snapshot of brand-level sales data from a Tableau workbook, returning region, category, and revenue totals.
naftiko: "0.5"
info:
label: "Tableau Brand Sales Dashboard Snapshot"
description: "Extracts a snapshot of brand-level sales data from a Tableau workbook, returning region, category, and revenue totals."
tags:
- analytics
- sales
- tableau
capability:
exposes:
- type: mcp
namespace: brand-dashboard
port: 8080
tools:
- name: get-brand-sales
description: "Retrieve brand sales dashboard data from Tableau."
inputParameters:
- name: brand_name
in: body
type: string
description: "The Henkel brand name."
call: "tableau.get-view-data"
with:
workbook: "brand-sales-performance"
view: "regional-summary"
filter_brand: "{{brand_name}}"
outputParameters:
- name: total_revenue
type: number
mapping: "$.data.summary.totalRevenue"
- name: top_region
type: string
mapping: "$.data.summary.topRegion"
consumes:
- type: http
namespace: tableau
baseUri: "https://tableau.henkel.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: views
path: "/sites/henkel/workbooks/{{workbook}}/views/{{view}}/data"
inputParameters:
- name: workbook
in: path
- name: view
in: path
operations:
- name: get-view-data
method: GET
Queries the Teradata data warehouse for historical manufacturing data by plant.
naftiko: "0.5"
info:
label: "Teradata Manufacturing Data Warehouse Query"
description: "Queries the Teradata data warehouse for historical manufacturing data by plant."
tags:
- analytics
- data-warehouse
- teradata
capability:
exposes:
- type: mcp
namespace: mfg-dwh
port: 8080
tools:
- name: query-manufacturing-data
description: "Query Teradata for historical manufacturing metrics."
inputParameters:
- name: plant_code
in: body
type: string
description: "The plant code."
- name: start_date
in: body
type: string
description: "Start date (YYYY-MM-DD)."
- name: end_date
in: body
type: string
description: "End date (YYYY-MM-DD)."
call: "teradata.query-mfg"
with:
plant: "{{plant_code}}"
start: "{{start_date}}"
end: "{{end_date}}"
outputParameters:
- name: total_output
type: integer
mapping: "$.results.total_output"
- name: avg_oee
type: string
mapping: "$.results.avg_oee"
consumes:
- type: http
namespace: teradata
baseUri: "https://henkel-td.teradata.com/api/query/v1"
authentication:
type: bearer
token: "$secrets.teradata_token"
resources:
- name: queries
path: "/execute"
operations:
- name: query-mfg
method: POST
Analyzes trade promotion effectiveness by pulling promotion data from SAP TPM, sales lift from Snowflake, and generating a summary report in Power BI.
naftiko: "0.5"
info:
label: "Trade Promotion Effectiveness Analyzer"
description: "Analyzes trade promotion effectiveness by pulling promotion data from SAP TPM, sales lift from Snowflake, and generating a summary report in Power BI."
tags:
- sales
- promotion
- sap
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: trade-promotion
port: 8080
tools:
- name: analyze-promotion
description: "Analyze trade promotion ROI across data sources."
inputParameters:
- name: promotion_id
in: body
type: string
description: "The SAP trade promotion ID."
steps:
- name: get-promotion-details
type: call
call: "sap-tpm.get-promotion"
with:
promo_id: "{{promotion_id}}"
- name: get-sales-lift
type: call
call: "snowflake.execute-query"
with:
statement: "SELECT sales_lift_pct, incremental_revenue FROM trade_promo_analytics WHERE promo_id = '{{promotion_id}}'"
- name: refresh-dashboard
type: call
call: "powerbi.refresh-dataset"
with:
dataset_id: "trade-promotion-analysis"
consumes:
- type: http
namespace: sap-tpm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZTPM_PROMO_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: promotions
path: "/PromotionSet('{{promo_id}}')"
inputParameters:
- name: promo_id
in: path
operations:
- name: get-promotion
method: GET
- type: http
namespace: snowflake
baseUri: "https://henkel.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
Tracks outbound shipments by checking SAP transportation management, getting carrier status from project44, and updating the customer in Salesforce.
naftiko: "0.5"
info:
label: "Transport Shipment Tracking Orchestrator"
description: "Tracks outbound shipments by checking SAP transportation management, getting carrier status from project44, and updating the customer in Salesforce."
tags:
- logistics
- shipment
- sap
- salesforce
capability:
exposes:
- type: mcp
namespace: shipment-tracking
port: 8080
tools:
- name: track-shipment
description: "Track an outbound shipment across logistics systems."
inputParameters:
- name: delivery_number
in: body
type: string
description: "The SAP delivery number."
steps:
- name: get-delivery
type: call
call: "sap-tm.get-delivery"
with:
delivery_id: "{{delivery_number}}"
- name: get-carrier-status
type: call
call: "project44.get-tracking"
with:
tracking_number: "{{get-delivery.carrier_tracking_number}}"
- name: update-customer-record
type: call
call: "salesforce.update-order"
with:
order_id: "{{get-delivery.sales_order}}"
shipping_status: "{{get-carrier-status.status}}"
eta: "{{get-carrier-status.estimated_arrival}}"
consumes:
- type: http
namespace: sap-tm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZTM_DELIVERY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: deliveries
path: "/DeliverySet('{{delivery_id}}')"
inputParameters:
- name: delivery_id
in: path
operations:
- name: get-delivery
method: GET
- type: http
namespace: project44
baseUri: "https://api.project44.com/api/v4"
authentication:
type: bearer
token: "$secrets.project44_token"
resources:
- name: tracking
path: "/shipments/tracking?trackingNumber={{tracking_number}}"
inputParameters:
- name: tracking_number
in: query
operations:
- name: get-tracking
method: GET
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: update-order
method: PATCH
Performs three-way matching by comparing a vendor invoice from SAP against the purchase order and goods receipt, flagging discrepancies in ServiceNow.
naftiko: "0.5"
info:
label: "Vendor Invoice Three-Way Match"
description: "Performs three-way matching by comparing a vendor invoice from SAP against the purchase order and goods receipt, flagging discrepancies in ServiceNow."
tags:
- finance
- accounts-payable
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: invoice-matching
port: 8080
tools:
- name: match-invoice
description: "Perform three-way match on a vendor invoice."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The SAP invoice document number."
steps:
- name: get-invoice
type: call
call: "sap.get-invoice"
with:
doc_number: "{{invoice_number}}"
- name: get-purchase-order
type: call
call: "sap.get-po"
with:
po_number: "{{get-invoice.po_reference}}"
- name: get-goods-receipt
type: call
call: "sap.get-gr"
with:
po_number: "{{get-invoice.po_reference}}"
- name: flag-discrepancy
type: call
call: "servicenow.create-incident"
with:
short_description: "Invoice match discrepancy: {{invoice_number}}"
category: "accounts_payable"
description: "Invoice amount: {{get-invoice.amount}}, PO amount: {{get-purchase-order.amount}}, GR quantity: {{get-goods-receipt.quantity}}"
consumes:
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZFI_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/InvoiceSet('{{doc_number}}')"
inputParameters:
- name: doc_number
in: path
operations:
- name: get-invoice
method: GET
- name: purchase-orders
path: "/PurchaseOrderSet('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- name: goods-receipts
path: "/GoodsReceiptSet?$filter=PONumber eq '{{po_number}}'"
inputParameters:
- name: po_number
in: query
operations:
- name: get-gr
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
When a cycle count discrepancy is detected in SAP EWM, creates an investigation ticket in ServiceNow, adjusts inventory if approved, and notifies the warehouse manager via Slack.
naftiko: "0.5"
info:
label: "Warehouse Cycle Count Discrepancy Handler"
description: "When a cycle count discrepancy is detected in SAP EWM, creates an investigation ticket in ServiceNow, adjusts inventory if approved, and notifies the warehouse manager via Slack."
tags:
- warehouse
- inventory
- sap
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: cycle-count
port: 8080
tools:
- name: handle-discrepancy
description: "Handle warehouse cycle count discrepancy."
inputParameters:
- name: material_number
in: body
type: string
description: "The material number."
- name: warehouse_id
in: body
type: string
description: "The warehouse ID."
- name: system_qty
in: body
type: number
description: "System quantity."
- name: counted_qty
in: body
type: number
description: "Physically counted quantity."
steps:
- name: create-investigation
type: call
call: "servicenow.create-incident"
with:
short_description: "Cycle count discrepancy: {{material_number}} at {{warehouse_id}}"
description: "System qty: {{system_qty}}, Counted: {{counted_qty}}, Delta: {{counted_qty}} - {{system_qty}}"
category: "inventory_discrepancy"
- name: adjust-inventory
type: call
call: "sap-ewm.post-adjustment"
with:
material: "{{material_number}}"
warehouse: "{{warehouse_id}}"
adjustment_qty: "{{counted_qty}}"
reference: "{{create-investigation.number}}"
- name: notify-manager
type: call
call: "slack.post-message"
with:
channel: "wh-{{warehouse_id}}-ops"
text: "Cycle count discrepancy for {{material_number}}: system={{system_qty}}, counted={{counted_qty}}. Investigation: {{create-investigation.number}}. Adjustment posted."
consumes:
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: sap-ewm
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZEWM_ADJUSTMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: adjustments
path: "/AdjustmentSet"
operations:
- name: post-adjustment
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Searches the Workday employee directory by name or department, returning employee ID, title, location, and manager.
naftiko: "0.5"
info:
label: "Workday Employee Directory Search"
description: "Searches the Workday employee directory by name or department, returning employee ID, title, location, and manager."
tags:
- hr
- employee
- workday
capability:
exposes:
- type: mcp
namespace: employee-directory
port: 8080
tools:
- name: search-employee
description: "Search for an employee by name or department in Workday."
inputParameters:
- name: search_term
in: body
type: string
description: "Employee name or department to search."
call: "workday.search-workers"
with:
query: "{{search_term}}"
outputParameters:
- name: employee_id
type: string
mapping: "$.workers[0].id"
- name: full_name
type: string
mapping: "$.workers[0].fullName"
- name: title
type: string
mapping: "$.workers[0].jobTitle"
- name: location
type: string
mapping: "$.workers[0].location"
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?search={{query}}"
inputParameters:
- name: query
in: query
operations:
- name: search-workers
method: GET
Retrieves headcount data from Workday by department.
naftiko: "0.5"
info:
label: "Workday Headcount Report"
description: "Retrieves headcount data from Workday by department."
tags:
- hr
- workforce
- workday
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount
description: "Get headcount metrics from Workday."
inputParameters:
- name: department_id
in: body
type: string
description: "The Workday department ID."
call: "workday.get-headcount"
with:
department_id: "{{department_id}}"
outputParameters:
- name: employee_count
type: integer
mapping: "$.total_count"
- name: open_positions
type: integer
mapping: "$.open_positions"
- name: turnover_rate
type: string
mapping: "$.turnover_rate"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/departments/{{department_id}}/headcount"
inputParameters:
- name: department_id
in: path
operations:
- name: get-headcount
method: GET
Tracks safety training compliance by pulling training records from Cornerstone LMS, checking certification expiry, and creating follow-up tasks in ServiceNow for non-compliant employees.
naftiko: "0.5"
info:
label: "Workplace Safety Training Compliance Tracker"
description: "Tracks safety training compliance by pulling training records from Cornerstone LMS, checking certification expiry, and creating follow-up tasks in ServiceNow for non-compliant employees."
tags:
- safety
- training
- servicenow
capability:
exposes:
- type: mcp
namespace: safety-training
port: 8080
tools:
- name: check-training-compliance
description: "Check safety training compliance and create remediation tasks."
inputParameters:
- name: plant_code
in: body
type: string
description: "The plant code."
- name: training_course_id
in: body
type: string
description: "The training course ID."
steps:
- name: get-training-records
type: call
call: "cornerstone.get-completion-report"
with:
course_id: "{{training_course_id}}"
organizational_unit: "plant_{{plant_code}}"
- name: get-employee-list
type: call
call: "workday.get-headcount"
with:
location: "plant_{{plant_code}}"
- name: create-remediation-tasks
type: call
call: "servicenow.create-incident"
with:
short_description: "Safety training non-compliance: {{training_course_id}} at plant {{plant_code}}"
category: "safety_compliance"
description: "Total employees: {{get-employee-list.count}}. Completed: {{get-training-records.completed_count}}. Non-compliant: {{get-employee-list.count}} - {{get-training-records.completed_count}}."
consumes:
- type: http
namespace: cornerstone
baseUri: "https://henkel.csod.com/services/api/x/v2"
authentication:
type: bearer
token: "$secrets.cornerstone_token"
resources:
- name: reports
path: "/reports/completions?courseId={{course_id}}&ou={{organizational_unit}}"
inputParameters:
- name: course_id
in: query
- name: organizational_unit
in: query
operations:
- name: get-completion-report
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/headcount?location={{location}}"
inputParameters:
- name: location
in: query
operations:
- name: get-headcount
method: GET
- type: http
namespace: servicenow
baseUri: "https://henkel.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
When a customer support ticket arrives in Zendesk, retrieves product info from SAP, creates a Salesforce case, and notifies the support team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Zendesk Customer Support Ticket Handler"
description: "When a customer support ticket arrives in Zendesk, retrieves product info from SAP, creates a Salesforce case, and notifies the support team in Microsoft Teams."
tags:
- customer-service
- zendesk
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: support-handling
port: 8080
tools:
- name: handle-support-ticket
description: "Process a Zendesk support ticket with SAP enrichment."
inputParameters:
- name: ticket_id
in: body
type: string
description: "The Zendesk ticket ID."
- name: material_number
in: body
type: string
description: "The related product material number."
steps:
- name: get-ticket
type: call
call: "zendesk.get-ticket"
with:
ticket_id: "{{ticket_id}}"
- name: get-product
type: call
call: "sap.get-material"
with:
material_id: "{{material_number}}"
- name: create-case
type: call
call: "salesforce.create-case"
with:
subject: "Support: {{get-ticket.subject}}"
description: "Zendesk #{{ticket_id}}: {{get-ticket.description}}. Product: {{get-product.MaterialDescription}}."
- name: notify-support
type: call
call: "msteams.send-message"
with:
channel_id: "customer-support"
text: "Support ticket for {{get-product.MaterialDescription}}: {{get-ticket.subject}}. SF Case: {{create-case.CaseNumber}}."
consumes:
- type: http
namespace: zendesk
baseUri: "https://henkel.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: get-ticket
method: GET
- type: http
namespace: sap
baseUri: "https://henkel-s4.sap.com/sap/opu/odata/sap/ZPR_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/MaterialSet('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: salesforce
baseUri: "https://henkel.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates a Zoom meeting and sends invites via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Zoom Meeting Scheduler"
description: "Creates a Zoom meeting and sends invites via Microsoft Outlook."
tags:
- communications
- meetings
- zoom
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: meeting-scheduler
port: 8080
tools:
- name: schedule-meeting
description: "Create a Zoom meeting and send invites."
inputParameters:
- name: topic
in: body
type: string
description: "Meeting topic."
- name: start_time
in: body
type: string
description: "Start time."
- name: attendee_emails
in: body
type: array
description: "Attendee emails."
steps:
- name: create-meeting
type: call
call: "zoom.create-meeting"
with:
topic: "{{topic}}"
start_time: "{{start_time}}"
- name: send-invite
type: call
call: "outlook.send-email"
with:
to: "{{attendee_emails}}"
subject: "Meeting: {{topic}}"
body: "Join Zoom: {{create-meeting.join_url}}"
consumes:
- type: http
namespace: zoom
baseUri: "https://api.zoom.us/v2"
authentication:
type: bearer
token: "$secrets.zoom_token"
resources:
- name: meetings
path: "/users/me/meetings"
operations:
- name: create-meeting
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0/me"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/sendMail"
operations:
- name: send-email
method: POST