Henkel Capabilities

Naftiko 0.5 capability definitions for Henkel - 101 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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}}&region={{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