Kimberly-Clark Capabilities

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

Sort
Expand

Uses Anthropic Claude to summarize supplier contracts retrieved from SharePoint and stores the structured summary back in SharePoint alongside the original document.

naftiko: "0.5"
info:
  label: "AI-Assisted Contract Summarization"
  description: "Uses Anthropic Claude to summarize supplier contracts retrieved from SharePoint and stores the structured summary back in SharePoint alongside the original document."
  tags:
    - ai
    - procurement
    - anthropic
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: ai-contracts
      port: 8080
      tools:
        - name: summarize-contract
          description: "Given a SharePoint document URL for a supplier contract, retrieve the document content, send it to Anthropic Claude for structured summarization (key terms, obligations, renewal dates), and write the summary back to SharePoint. Use for contract review and obligation tracking."
          inputParameters:
            - name: document_url
              in: body
              type: string
              description: "The SharePoint document URL for the contract to summarize."
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID where the document is stored."
          steps:
            - name: get-document
              type: call
              call: sharepoint.get-document
              with:
                site_id: "{{site_id}}"
                document_url: "{{document_url}}"
            - name: summarize
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                content: "Summarize this supplier contract, extracting: key obligations, payment terms, renewal date, and termination clauses. Document: {{get-document.content}}"
            - name: write-summary
              type: call
              call: sharepoint.create-file
              with:
                site_id: "{{site_id}}"
                filename: "contract-summary.md"
                content: "{{summarize.text}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-document
              method: GET
            - name: create-file
              method: PUT
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST

Checks Azure AD group memberships for a user to validate access rights.

naftiko: "0.5"
info:
  label: "Azure AD User Group Membership Check"
  description: "Checks Azure AD group memberships for a user to validate access rights."
  tags:
    - security
    - identity
    - azure-active-directory
    - access
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: check-groups
          description: "List Azure AD group memberships for access validation."
          inputParameters:
            - name: user_upn
              type: string
              description: "User principal name."
          call: azuread.get-member-of
          with:
            upn: "{{user_upn}}"
          outputParameters:
            - name: groups
              type: string
              mapping: "$.value"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: member-of
          path: "/users/memberOf"
          operations:
            - name: get-member-of
              method: GET

Monitors Azure cost management for spend anomalies and, when detected, creates a ServiceNow incident and posts an alert to the cloud FinOps Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Alert"
  description: "Monitors Azure cost management for spend anomalies and, when detected, creates a ServiceNow incident and posts an alert to the cloud FinOps Teams channel."
  tags:
    - cloud
    - finops
    - cost-management
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and anomaly detection period, retrieve cost anomalies from Azure Cost Management, open a ServiceNow ticket, and post an alert to the FinOps Teams channel. Invoke on scheduled cost monitoring runs."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to check for cost anomalies."
            - name: period_days
              in: body
              type: integer
              description: "Number of days to analyze for anomalies, e.g. 7."
          steps:
            - name: get-anomalies
              type: call
              call: azure-cost.get-anomalies
              with:
                subscription_id: "{{subscription_id}}"
                period_days: "{{period_days}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure cost anomaly detected in subscription {{subscription_id}}"
                category: "cloud_cost"
                priority: "3"
            - name: post-alert
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Cost Anomaly Alert: Azure subscription {{subscription_id}} exceeded expected spend. SNOW: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: anomalies
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/anomalies"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-anomalies
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Handles releases by checking Azure DevOps pipeline, ServiceNow change, and notifying Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Approval Handler"
  description: "Handles releases by checking Azure DevOps pipeline, ServiceNow change, and notifying Teams."
  tags:
    - operations
    - devops
    - azure-devops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-mgmt
      port: 8080
      tools:
        - name: handle-release
          description: "Handle release approval."
          inputParameters:
            - name: pipeline_id
              type: string
              description: "Pipeline ID."
            - name: change_request
              type: string
              description: "Change request."
          steps:
            - name: get-pipeline
              type: call
              call: azuredevops.get-run
              with:
                pipeline_id: "{{pipeline_id}}"
            - name: validate
              type: call
              call: servicenow.get-change
              with:
                number: "{{change_request}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "releases"
                text: "Release: Pipeline {{pipeline_id}} ({{get-pipeline.status}})"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/kimberlyclark"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_token"
      resources:
        - name: pipelines
          path: "/_apis/pipelines"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Monitors brand sentiment from Snowflake, creates Salesforce cases, and alerts brand management via Teams.

naftiko: "0.5"
info:
  label: "Brand Sentiment Monitoring Responder"
  description: "Monitors brand sentiment from Snowflake, creates Salesforce cases, and alerts brand management via Teams."
  tags:
    - marketing
    - social
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: brand-monitoring
      port: 8080
      tools:
        - name: respond-sentiment
          description: "Monitor brand sentiment and respond to negative trends."
          inputParameters:
            - name: brand_name
              type: string
              description: "Brand name."
            - name: threshold
              type: number
              description: "Negative threshold pct."
          steps:
            - name: get-sentiment
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SOCIAL_WH"
                query: "SELECT negative_pct FROM sentiment WHERE brand='{{brand_name}}'"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                Subject: "Sentiment alert: {{brand_name}}"
            - name: alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "brand-mgmt"
                text: "SENTIMENT: {{brand_name}} negative at {{get-sentiment.negative_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Polls the Meta Graph API for Kimberly-Clark brand mentions across Facebook and Instagram, and posts significant engagement spikes or negative sentiment to the brand team Teams channel.

naftiko: "0.5"
info:
  label: "Brand Social Media Monitoring Alert"
  description: "Polls the Meta Graph API for Kimberly-Clark brand mentions across Facebook and Instagram, and posts significant engagement spikes or negative sentiment to the brand team Teams channel."
  tags:
    - marketing
    - social
    - meta
    - microsoft-teams
    - brand-monitoring
capability:
  exposes:
    - type: mcp
      namespace: brand-monitoring
      port: 8080
      tools:
        - name: monitor-social-mentions
          description: "Retrieve recent brand mentions from Meta Graph API for Kimberly-Clark brand pages. If engagement volume exceeds threshold, post an alert to the brand Teams channel. Use for real-time brand reputation monitoring."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Meta Facebook page ID for the Kimberly-Clark brand to monitor."
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours to look back for mentions and engagements."
          steps:
            - name: get-mentions
              type: call
              call: meta.get-page-insights
              with:
                page_id: "{{page_id}}"
                hours_back: "{{hours_back}}"
            - name: post-alert
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_brand_channel_id"
                text: "Social Monitor Alert: {{get-mentions.total_impressions}} impressions in last {{hours_back}}h on page {{page_id}}."
  consumes:
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_page_token"
      resources:
        - name: page-insights
          path: "/{{page_id}}/insights"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page-insights
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Compiles competitive intelligence from Snowflake Circana data, updates Salesforce, and posts digest to Teams.

naftiko: "0.5"
info:
  label: "Competitive Market Intelligence Digest"
  description: "Compiles competitive intelligence from Snowflake Circana data, updates Salesforce, and posts digest to Teams."
  tags:
    - marketing
    - analytics
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: market-intelligence
      port: 8080
      tools:
        - name: generate-digest
          description: "Generate competitive market intelligence digest."
          inputParameters:
            - name: category
              type: string
              description: "Product category."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MARKET_WH"
                query: "SELECT brand, share FROM circana WHERE category='{{category}}'"
            - name: update-sf
              type: call
              call: salesforce.update-report
              with:
                category: "{{category}}"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "market-intel"
                text: "Market digest for {{category}} ready"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Analyzes consumer reviews from Snowflake, creates Jira tasks, and posts summary to Teams.

naftiko: "0.5"
info:
  label: "Consumer Review Analysis Pipeline"
  description: "Analyzes consumer reviews from Snowflake, creates Jira tasks, and posts summary to Teams."
  tags:
    - marketing
    - quality
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consumer-insights
      port: 8080
      tools:
        - name: analyze-reviews
          description: "Analyze consumer reviews for complaint trends."
          inputParameters:
            - name: product_line
              type: string
              description: "Product line."
            - name: period_days
              type: number
              description: "Lookback days."
          steps:
            - name: get-reviews
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "CONSUMER_WH"
                query: "SELECT topic, count FROM reviews WHERE product='{{product_line}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "PROD"
                summary: "Reviews: {{product_line}}"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "insights"
                text: "Review analysis for {{product_line}} complete"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Initiates CM audit from Ariba supplier data, Jira tasks, and SharePoint checklists.

naftiko: "0.5"
info:
  label: "Contract Manufacturer Quality Audit"
  description: "Initiates CM audit from Ariba supplier data, Jira tasks, and SharePoint checklists."
  tags:
    - quality
    - procurement
    - sap
    - jira
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: quality-audit
      port: 8080
      tools:
        - name: initiate-audit
          description: "Start contract manufacturer quality audit."
          inputParameters:
            - name: supplier_id
              type: string
              description: "Supplier ID."
            - name: audit_type
              type: string
              description: "Audit type."
          steps:
            - name: get-supplier
              type: call
              call: ariba.get-supplier
              with:
                supplier_id: "{{supplier_id}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "QAUDIT"
                summary: "CM Audit: {{get-supplier.name}}"
            - name: share-checklist
              type: call
              call: sharepoint.copy-template
              with:
                template: "audit-{{audit_type}}"
                destination: "audits/{{supplier_id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/drive/items"
          operations:
            - name: search-docs
              method: GET

Handles contractor expiry by checking Okta, Workday dates, and creating ServiceNow tasks.

naftiko: "0.5"
info:
  label: "Contractor Access Expiry Handler"
  description: "Handles contractor expiry by checking Okta, Workday dates, and creating ServiceNow tasks."
  tags:
    - security
    - identity
    - okta
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-lifecycle
      port: 8080
      tools:
        - name: handle-expiry
          description: "Handle contractor access expiry."
          inputParameters:
            - name: contractor_email
              type: string
              description: "Contractor email."
          steps:
            - name: get-okta
              type: call
              call: okta.get-user
              with:
                email: "{{contractor_email}}"
            - name: check-wd
              type: call
              call: workday.get-worker
              with:
                email: "{{contractor_email}}"
            - name: create-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Expiry: {{contractor_email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://kimberlyclark.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Routes complaints to quality by tracing batch in SAP, creating Jira investigation, and updating ServiceNow.

naftiko: "0.5"
info:
  label: "Customer Complaint Quality Investigation"
  description: "Routes complaints to quality by tracing batch in SAP, creating Jira investigation, and updating ServiceNow."
  tags:
    - quality
    - customer-service
    - sap
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: complaint-quality
      port: 8080
      tools:
        - name: route-complaint
          description: "Route customer complaint to quality investigation."
          inputParameters:
            - name: ticket_id
              type: string
              description: "ServiceNow ticket."
            - name: batch_number
              type: string
              description: "Batch number."
            - name: material_number
              type: string
              description: "Material number."
          steps:
            - name: trace
              type: call
              call: sap.get-batch
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: create-inv
              type: call
              call: jira.create-issue
              with:
                project_key: "QUAL"
                summary: "Complaint: batch {{batch_number}}"
            - name: update
              type: call
              call: servicenow.update-incident
              with:
                number: "{{ticket_id}}"
                comment: "Investigation: {{create-inv.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Analyzes returns from SAP, Snowflake quality data, and creates Jira improvement tasks.

naftiko: "0.5"
info:
  label: "Customer Returns Analysis"
  description: "Analyzes returns from SAP, Snowflake quality data, and creates Jira improvement tasks."
  tags:
    - quality
    - sales
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: returns-analytics
      port: 8080
      tools:
        - name: analyze-returns
          description: "Analyze customer return patterns."
          inputParameters:
            - name: material_number
              type: string
              description: "Material."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-returns
              type: call
              call: sap.get-returns
              with:
                material: "{{material_number}}"
            - name: get-quality
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "QUALITY_WH"
                query: "SELECT reason FROM returns WHERE material='{{material_number}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "QUAL"
                summary: "Returns: {{material_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_RETURNS_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-returns
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.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 Datadog detects a production anomaly alert, creates a ServiceNow incident, assigns the on-call engineer, and posts a triage message to the ops Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Production Anomaly Response"
  description: "When Datadog detects a production anomaly alert, creates a ServiceNow incident, assigns the on-call engineer, and posts a triage message to the ops Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-datadog-anomaly
          description: "Given a Datadog alert ID and monitor name, retrieve alert details, create a ServiceNow incident, and post a triage message to the operations Teams channel. Invoke when Datadog fires a production anomaly alert."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert or event ID."
            - name: monitor_name
              in: body
              type: string
              description: "The name of the Datadog monitor that fired."
          steps:
            - name: get-alert
              type: call
              call: datadog.get-alert
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Datadog anomaly: {{monitor_name}}"
                category: "production_monitoring"
                priority: "2"
            - name: post-triage
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "Datadog anomaly detected: {{monitor_name}} | SNOW: {{create-incident.number}} | Alert: {{alert_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks production service health in Datadog including error rate, latency, and uptime.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Checks production service health in Datadog including error rate, latency, and uptime."
  tags:
    - operations
    - monitoring
    - datadog
    - performance
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: check-service-health
          description: "Check Datadog for service health metrics."
          inputParameters:
            - name: service_name
              type: string
              description: "Datadog service name."
            - name: time_from
              type: string
              description: "Start timestamp."
          call: datadog.query-metrics
          with:
            query: "avg:trace.errors{service:{{service_name}}}"
            from: "{{time_from}}"
          outputParameters:
            - name: error_rate
              type: string
              mapping: "$.series[0].pointlist[0][1]"
            - name: latency
              type: string
              mapping: "$.series[1].pointlist[0][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Syncs demand forecasts from Snowflake with SAP inventory and creates planned production orders.

naftiko: "0.5"
info:
  label: "Demand Forecast to Production Sync"
  description: "Syncs demand forecasts from Snowflake with SAP inventory and creates planned production orders."
  tags:
    - supply-chain
    - manufacturing
    - snowflake
    - sap
    - planning
capability:
  exposes:
    - type: mcp
      namespace: demand-planning
      port: 8080
      tools:
        - name: sync-demand
          description: "Synchronize demand forecasts with production planning."
          inputParameters:
            - name: category
              type: string
              description: "Product category."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: weeks
              type: number
              description: "Planning weeks."
          steps:
            - name: get-forecast
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "DEMAND_WH"
                query: "SELECT sku, units FROM forecast WHERE category='{{category}}'"
            - name: check-stock
              type: call
              call: sap.get-stock
              with:
                plant: "{{plant_code}}"
                category: "{{category}}"
            - name: create-orders
              type: call
              call: sap.create-planned-order
              with:
                plant: "{{plant_code}}"
                data: "{{get-forecast.data}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-stock
              method: GET
            - name: create-planned-order
              method: POST

Monitors e-commerce pricing from Snowflake, flags MAP violations, creates Salesforce cases, alerts Teams.

naftiko: "0.5"
info:
  label: "Digital Shelf Price Monitor"
  description: "Monitors e-commerce pricing from Snowflake, flags MAP violations, creates Salesforce cases, alerts Teams."
  tags:
    - ecommerce
    - sales
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pricing-ops
      port: 8080
      tools:
        - name: monitor-pricing
          description: "Monitor digital shelf pricing for MAP violations."
          inputParameters:
            - name: brand
              type: string
              description: "Brand name."
            - name: marketplace
              type: string
              description: "Marketplace."
          steps:
            - name: get-prices
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "ECOM_WH"
                query: "SELECT sku, price FROM shelf WHERE brand='{{brand}}'"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                Subject: "MAP violation: {{brand}} on {{marketplace}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "pricing"
                text: "MAP alert: {{brand}} on {{marketplace}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Tracks fulfillment from Salesforce order, SAP picking, and updates ServiceNow customer ticket.

naftiko: "0.5"
info:
  label: "E-commerce Order Fulfillment Tracker"
  description: "Tracks fulfillment from Salesforce order, SAP picking, and updates ServiceNow customer ticket."
  tags:
    - ecommerce
    - supply-chain
    - salesforce
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ecom-fulfillment
      port: 8080
      tools:
        - name: track-fulfillment
          description: "Track e-commerce order fulfillment."
          inputParameters:
            - name: order_id
              type: string
              description: "Salesforce order ID."
            - name: ticket_id
              type: string
              description: "ServiceNow ticket."
          steps:
            - name: get-order
              type: call
              call: salesforce.get-order
              with:
                order_id: "{{order_id}}"
            - name: check-picking
              type: call
              call: sap.get-delivery
              with:
                order: "{{get-order.sap_order}}"
            - name: update-ticket
              type: call
              call: servicenow.update-incident
              with:
                number: "{{ticket_id}}"
                comment: "Status: {{get-order.status}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Generates learning paths from Workday skills, matches with training, and creates Jira development plans.

naftiko: "0.5"
info:
  label: "Employee Learning Path Generator"
  description: "Generates learning paths from Workday skills, matches with training, and creates Jira development plans."
  tags:
    - hr
    - training
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: hr-learning
      port: 8080
      tools:
        - name: generate-path
          description: "Create personalized learning path."
          inputParameters:
            - name: employee_id
              type: string
              description: "Employee ID."
            - name: target_role
              type: string
              description: "Target role."
          steps:
            - name: get-skills
              type: call
              call: workday.get-skills
              with:
                worker_id: "{{employee_id}}"
            - name: create-plan
              type: call
              call: jira.create-issue
              with:
                project_key: "LEARN"
                summary: "Learning: {{target_role}} for {{employee_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.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 an employee termination is recorded in Workday, disables their Microsoft 365 account, revokes Okta sessions, and closes all open ServiceNow tickets assigned to them.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is recorded in Workday, disables their Microsoft 365 account, revokes Okta sessions, and closes all open ServiceNow tickets assigned to them."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID for a terminating employee, disable Microsoft 365 access, revoke all Okta sessions, and close their open ServiceNow tickets. Invoke on confirmed termination events."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last day in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: disable-m365
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{get-worker.work_email}}"
            - name: revoke-okta-sessions
              type: call
              call: okta.clear-user-sessions
              with:
                user_id: "{{get-worker.work_email}}"
            - name: close-snow-tickets
              type: call
              call: servicenow.close-user-tickets
              with:
                assigned_to: "{{get-worker.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: "/kimberly-clark/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://kimberly-clark.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: clear-user-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH

On a GitHub Actions workflow failure in a protected branch, opens a Jira bug ticket and posts an alert to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure in a protected branch, opens a Jira bug ticket and posts an alert to the engineering Microsoft Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow run ID and repository that has failed on a protected branch, create a Jira bug and alert the engineering Teams channel. Invoke when a CI/CD pipeline fails on main or release branches."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name in owner/repo format."
            - name: workflow_run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID that failed."
            - name: branch
              in: body
              type: string
              description: "The branch where the failure occurred."
          steps:
            - name: get-run-details
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo_name}}"
                run_id: "{{workflow_run_id}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch}} — Run {{workflow_run_id}}"
                description: "GitHub Actions workflow failed. Run: {{workflow_run_id}} Branch: {{branch}}"
            - name: post-alert
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "CI Failure: {{repo_name}} | Branch: {{branch}} | Jira: {{create-jira-bug.key}} | Run: {{workflow_run_id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberly-clark.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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Runs a security vulnerability scan summary across Kimberly-Clark's GitHub repositories using the GitHub Advanced Security API and creates Jira issues for critical findings.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Scan Summary"
  description: "Runs a security vulnerability scan summary across Kimberly-Clark's GitHub repositories using the GitHub Advanced Security API and creates Jira issues for critical findings."
  tags:
    - security
    - devops
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: scan-repo-security
          description: "Given a GitHub repository name, retrieve open code scanning alerts at critical or high severity from GitHub Advanced Security and create a Jira security issue for each critical finding. Use for weekly security posture reviews."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository in owner/repo format to scan, e.g. kimberly-clark/digital-platform."
          steps:
            - name: get-alerts
              type: call
              call: github.get-code-scanning-alerts
              with:
                repo: "{{repo_name}}"
                severity: "critical"
            - name: create-jira-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                issuetype: "Security"
                summary: "Critical security alerts in {{repo_name}}: {{get-alerts.count}} findings"
                description: "GitHub Advanced Security found {{get-alerts.count}} critical vulnerabilities in {{repo_name}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberly-clark.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

Retrieves web traffic metrics from Google Analytics for a brand website.

naftiko: "0.5"
info:
  label: "Google Analytics Web Traffic Report"
  description: "Retrieves web traffic metrics from Google Analytics for a brand website."
  tags:
    - marketing
    - analytics
    - google-analytics
    - web
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-traffic
          description: "Fetch web traffic data from Google Analytics."
          inputParameters:
            - name: property_id
              type: string
              description: "GA4 property ID."
            - name: date_from
              type: string
              description: "Start date."
            - name: date_to
              type: string
              description: "End date."
          call: ga.run-report
          with:
            property: "{{property_id}}"
            startDate: "{{date_from}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: conversion_rate
              type: string
              mapping: "$.rows[0].metricValues[1].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/runReport"
          operations:
            - name: run-report
              method: POST

Retrieves current headcount grouped by department and cost center from Workday for finance planning and reporting.

naftiko: "0.5"
info:
  label: "Headcount Snapshot by Cost Center"
  description: "Retrieves current headcount grouped by department and cost center from Workday for finance planning and reporting."
  tags:
    - hr
    - finance
    - reporting
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns a list of active employees grouped by department and cost center from Workday. Use for headcount planning, capacity analysis, and quarterly finance reviews."
          call: workday.get-headcount
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
            - name: total_count
              type: number
              mapping: "$.total"
  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: "/kimberly-clark/workers"
          operations:
            - name: get-headcount
              method: GET

On a high-severity PagerDuty alert, creates a ServiceNow P1 incident, pages the on-call team, and posts a war-room message to the IT Teams channel.

naftiko: "0.5"
info:
  label: "IT Incident Response Handler"
  description: "On a high-severity PagerDuty alert, creates a ServiceNow P1 incident, pages the on-call team, and posts a war-room message to the IT Teams channel."
  tags:
    - itsm
    - incident-response
    - pagerduty
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a PagerDuty alert ID for a critical production incident, create a P1 ServiceNow incident, trigger an on-call page, and post a war-room message to the IT Teams channel. Invoke when PagerDuty fires a critical-severity alert."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The PagerDuty alert ID for the critical incident."
            - name: service_name
              in: body
              type: string
              description: "The name of the affected service or system."
            - name: alert_summary
              in: body
              type: string
              description: "A brief description of the alert condition."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                priority: "1"
                short_description: "P1: {{alert_summary}} in {{service_name}}"
                category: "production_outage"
            - name: trigger-page
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1 Incident: {{alert_summary}}"
                service_id: "$secrets.pagerduty_it_service_id"
                body_details: "ServiceNow: {{create-snow-incident.number}}"
            - name: post-war-room
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 INCIDENT OPEN: {{alert_summary}} | SNOW: {{create-snow-incident.number}} | PD: {{trigger-page.incident_key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Jira project backlog summary with issue counts by priority and status.

naftiko: "0.5"
info:
  label: "Jira Project Backlog Summary"
  description: "Retrieves Jira project backlog summary with issue counts by priority and status."
  tags:
    - project-management
    - operations
    - jira
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: project-ops
      port: 8080
      tools:
        - name: get-backlog
          description: "Get Jira project backlog summary."
          inputParameters:
            - name: project_key
              type: string
              description: "Jira project key."
          call: jira.search-issues
          with:
            jql: "project={{project_key}} AND status!=Done"
          outputParameters:
            - name: total
              type: string
              mapping: "$.total"
            - name: issues
              type: string
              mapping: "$.issues"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.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

Aggregates sprint velocity and story point completion data from Jira across engineering teams and posts a weekly summary to the engineering leadership Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Aggregates sprint velocity and story point completion data from Jira across engineering teams and posts a weekly summary to the engineering leadership Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering-reporting
      port: 8080
      tools:
        - name: digest-sprint-velocity
          description: "Given a Jira project key and sprint ID, retrieve velocity metrics (completed vs. committed story points) and post a summary to the engineering leadership Teams channel. Use for weekly engineering reviews."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key to report on, e.g. ENG."
            - name: sprint_id
              in: body
              type: integer
              description: "The Jira sprint ID to analyze."
          steps:
            - name: get-sprint-report
              type: call
              call: jira.get-sprint-report
              with:
                project_key: "{{project_key}}"
                sprint_id: "{{sprint_id}}"
            - name: post-summary
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Sprint {{sprint_id}} Velocity ({{project_key}}): {{get-sprint-report.completed_points}} / {{get-sprint-report.committed_points}} points completed."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kimberly-clark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{sprint_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves LinkedIn Campaign Manager performance metrics for Kimberly-Clark brand campaigns and posts a weekly summary to the social media Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Brand Campaign Performance"
  description: "Retrieves LinkedIn Campaign Manager performance metrics for Kimberly-Clark brand campaigns and posts a weekly summary to the social media Teams channel."
  tags:
    - marketing
    - social
    - linkedin
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-performance
          description: "Given a date range, retrieve LinkedIn campaign impressions, clicks, and engagement rates from LinkedIn Campaign Manager and post a performance summary to the social media Teams channel."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date for the reporting period in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date for the reporting period in YYYY-MM-DD format."
          steps:
            - name: get-campaign-stats
              type: call
              call: linkedin.get-campaign-analytics
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_social_channel_id"
                text: "LinkedIn Campaign Digest {{start_date}} - {{end_date}}: {{get-campaign-stats.summary}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: ad-analytics
          path: "/adAnalytics"
          operations:
            - name: get-campaign-analytics
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Enriches talent pipeline from Workday requisitions, LinkedIn data, and Jira sourcing tasks.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Enrichment"
  description: "Enriches talent pipeline from Workday requisitions, LinkedIn data, and Jira sourcing tasks."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - jira
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: enrich-pipeline
          description: "Enrich talent pipeline."
          inputParameters:
            - name: department
              type: string
              description: "Department."
          steps:
            - name: get-reqs
              type: call
              call: workday.get-positions
              with:
                department: "{{department}}"
            - name: create-tasks
              type: call
              call: jira.create-issue
              with:
                project_key: "RECRUIT"
                summary: "Sourcing: {{department}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Handles line downtime by creating ServiceNow incident, updating SAP status, and alerting operations via Teams.

naftiko: "0.5"
info:
  label: "Manufacturing Line Downtime Handler"
  description: "Handles line downtime by creating ServiceNow incident, updating SAP status, and alerting operations via Teams."
  tags:
    - manufacturing
    - operations
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mfg-ops
      port: 8080
      tools:
        - name: handle-downtime
          description: "Respond to manufacturing line downtime."
          inputParameters:
            - name: production_line
              type: string
              description: "Line ID."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: reason
              type: string
              description: "Downtime reason."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Line down: {{production_line}}"
                urgency: "1"
            - name: update-sap
              type: call
              call: sap.update-status
              with:
                plant: "{{plant_code}}"
                line: "{{production_line}}"
            - name: alert-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "plant-ops"
                text: "LINE DOWN: {{production_line}}. Reason: {{reason}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.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://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: update-status
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Coordinates launch by creating Salesforce campaign, Meta ads, and notifying marketing via Teams.

naftiko: "0.5"
info:
  label: "Marketing Campaign Launch Coordinator"
  description: "Coordinates launch by creating Salesforce campaign, Meta ads, and notifying marketing via Teams."
  tags:
    - marketing
    - campaigns
    - salesforce
    - meta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: campaign-ops
      port: 8080
      tools:
        - name: launch-campaign
          description: "Orchestrate marketing campaign launch."
          inputParameters:
            - name: campaign_name
              type: string
              description: "Campaign name."
            - name: brand
              type: string
              description: "Brand."
            - name: start_date
              type: string
              description: "Start date."
            - name: budget
              type: number
              description: "Budget USD."
          steps:
            - name: create-campaign
              type: call
              call: salesforce.create-campaign
              with:
                Name: "{{campaign_name}}"
                Brand: "{{brand}}"
            - name: activate-ads
              type: call
              call: meta.activate
              with:
                name: "{{campaign_name}}"
                status: "ACTIVE"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "marketing"
                text: "Campaign '{{campaign_name}}' launched for {{brand}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_token"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: get-insights
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Aggregates campaign performance metrics from Adobe Analytics and publishes a weekly digest to the marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Aggregates campaign performance metrics from Adobe Analytics and publishes a weekly digest to the marketing Microsoft Teams channel."
  tags:
    - marketing
    - analytics
    - reporting
    - adobe-analytics
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a date range, pull campaign performance data from Adobe Analytics (impressions, clicks, conversions) and post a summary to the marketing Teams channel. Use for weekly brand performance reviews."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-campaign-metrics
              type: call
              call: adobe-analytics.get-report
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_marketing_channel_id"
                text: "Campaign Performance {{start_date}} to {{end_date}}: {{get-campaign-metrics.summary}}"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{global_company_id}}/reports"
          inputParameters:
            - name: global_company_id
              in: path
          operations:
            - name: get-report
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates media mix reports from Snowflake, refreshes Power BI, and posts summary to Teams.

naftiko: "0.5"
info:
  label: "Media Mix Optimization Report"
  description: "Generates media mix reports from Snowflake, refreshes Power BI, and posts summary to Teams."
  tags:
    - marketing
    - analytics
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: media-planning
      port: 8080
      tools:
        - name: gen-media-report
          description: "Generate media mix optimization report."
          inputParameters:
            - name: brand
              type: string
              description: "Brand."
            - name: date_from
              type: string
              description: "Start."
            - name: date_to
              type: string
              description: "End."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MARKETING_WH"
                query: "SELECT channel, roas FROM media WHERE brand='{{brand}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "media-mix"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "media"
                text: "Media report for {{brand}} ready"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Retrieves Meta Ads campaign performance metrics for a campaign and date range.

naftiko: "0.5"
info:
  label: "Meta Ad Campaign Performance Lookup"
  description: "Retrieves Meta Ads campaign performance metrics for a campaign and date range."
  tags:
    - marketing
    - social
    - meta
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: social-ads
      port: 8080
      tools:
        - name: get-campaign-insights
          description: "Fetch Meta Ads campaign insights."
          inputParameters:
            - name: campaign_id
              type: string
              description: "Meta campaign ID."
            - name: date_from
              type: string
              description: "Start date."
            - name: date_to
              type: string
              description: "End date."
          call: meta.get-insights
          with:
            campaign_id: "{{campaign_id}}"
            since: "{{date_from}}"
          outputParameters:
            - name: impressions
              type: string
              mapping: "$.data[0].impressions"
            - name: spend
              type: string
              mapping: "$.data[0].spend"
  consumes:
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_token"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: get-insights
              method: GET

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account via Graph API, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account via Graph API, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Microsoft 365, and Microsoft Teams. Invoke when a new hire record is confirmed in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-m365
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                mailNickname: "{{get-worker.preferred_name}}"
                userPrincipalName: "{{get-worker.work_email}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Kimberly-Clark, {{get-worker.first_name}}! Your IT ticket is {{create-snow-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberly-clark/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Onboards new SKU by creating SAP material, Salesforce product, and notifying supply chain via Teams.

naftiko: "0.5"
info:
  label: "New SKU Onboarding Workflow"
  description: "Onboards new SKU by creating SAP material, Salesforce product, and notifying supply chain via Teams."
  tags:
    - supply-chain
    - sales
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sku-management
      port: 8080
      tools:
        - name: onboard-sku
          description: "Orchestrate new SKU onboarding."
          inputParameters:
            - name: sku_name
              type: string
              description: "Product name."
            - name: category
              type: string
              description: "Category."
            - name: unit_cost
              type: number
              description: "Unit cost."
          steps:
            - name: create-material
              type: call
              call: sap.create-material
              with:
                description: "{{sku_name}}"
                group: "{{category}}"
            - name: create-product
              type: call
              call: salesforce.create-product
              with:
                Name: "{{sku_name}}"
                ProductCode: "{{create-material.number}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain"
                text: "New SKU: {{sku_name}} ({{create-material.number}})"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: create-material
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

When an employee's role changes in Workday, updates their Okta group memberships and access profile to match the new role's permissions.

naftiko: "0.5"
info:
  label: "Okta Access Provisioning for New Role"
  description: "When an employee's role changes in Workday, updates their Okta group memberships and access profile to match the new role's permissions."
  tags:
    - identity
    - security
    - hr
    - okta
    - workday
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: sync-role-access
          description: "Given a Workday employee ID and their new job profile, update the employee's Okta group memberships to match the new role's access entitlements. Invoke on role change events from Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role has changed."
            - name: new_role
              in: body
              type: string
              description: "The new job profile or role name as defined in Workday."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: get-okta-user
              type: call
              call: okta.get-user
              with:
                login: "{{get-worker.work_email}}"
            - name: update-groups
              type: call
              call: okta.update-user-groups
              with:
                user_id: "{{get-okta-user.id}}"
                profile: "{{new_role}}"
  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: "/kimberly-clark/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://kimberly-clark.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: POST

Audits privileged Okta accounts against Workday employment, creating ServiceNow review tasks.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Audit"
  description: "Audits privileged Okta accounts against Workday employment, creating ServiceNow review tasks."
  tags:
    - security
    - identity
    - okta
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: security-audit
      port: 8080
      tools:
        - name: audit-access
          description: "Audit privileged access."
          inputParameters:
            - name: role_type
              type: string
              description: "Okta admin role type."
          steps:
            - name: get-admins
              type: call
              call: okta.list-admins
              with:
                role_type: "{{role_type}}"
            - name: check-employment
              type: call
              call: workday.get-active
              with:
                emails: "{{get-admins.emails}}"
            - name: create-review
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Access audit: {{role_type}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://kimberlyclark.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Checks packaging sustainability from SAP BOM, Snowflake compliance data, and creates Jira tasks.

naftiko: "0.5"
info:
  label: "Packaging Sustainability Compliance Check"
  description: "Checks packaging sustainability from SAP BOM, Snowflake compliance data, and creates Jira tasks."
  tags:
    - sustainability
    - quality
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: check-packaging
          description: "Verify packaging sustainability compliance."
          inputParameters:
            - name: material_number
              type: string
              description: "Material number."
            - name: plant_code
              type: string
              description: "Plant code."
          steps:
            - name: get-bom
              type: call
              call: sap.get-bom
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: check
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SUSTAINABILITY_WH"
                query: "SELECT recyclable_pct FROM packaging WHERE material IN ({{get-bom.components}})"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SUSTAIN"
                summary: "Packaging: {{material_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-bom
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Monitors plant energy from Snowflake IoT data, creates ServiceNow tasks, and alerts via Teams.

naftiko: "0.5"
info:
  label: "Plant Energy Consumption Monitor"
  description: "Monitors plant energy from Snowflake IoT data, creates ServiceNow tasks, and alerts via Teams."
  tags:
    - manufacturing
    - sustainability
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: energy-monitoring
      port: 8080
      tools:
        - name: monitor-energy
          description: "Monitor plant energy against targets."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: date
              type: string
              description: "Date."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "IOT_WH"
                query: "SELECT kwh FROM energy WHERE plant='{{plant_code}}'"
            - name: create-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Energy anomaly: {{plant_code}}"
            - name: alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "sustainability"
                text: "Energy alert: {{plant_code}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Generates maintenance reports from SAP orders, Snowflake equipment history, and posts to Teams.

naftiko: "0.5"
info:
  label: "Plant Maintenance Schedule Report"
  description: "Generates maintenance reports from SAP orders, Snowflake equipment history, and posts to Teams."
  tags:
    - manufacturing
    - operations
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: maintenance-reporting
      port: 8080
      tools:
        - name: gen-schedule
          description: "Generate maintenance schedule report."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: weeks
              type: number
              description: "Weeks ahead."
          steps:
            - name: get-orders
              type: call
              call: sap.get-orders
              with:
                plant: "{{plant_code}}"
            - name: get-history
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MFG_WH"
                query: "SELECT mtbf FROM equipment WHERE plant='{{plant_code}}'"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "maintenance"
                text: "Maintenance for {{plant_code}}: {{get-orders.count}} orders"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-orders
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Checks Power BI dataset refresh status and returns last refresh time.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks Power BI dataset refresh status and returns last refresh time."
  tags:
    - analytics
    - reporting
    - power-bi
    - data
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: check-refresh
          description: "Check Power BI dataset refresh status."
          inputParameters:
            - name: dataset_id
              type: string
              description: "Power BI dataset ID."
          call: powerbi.get-refresh
          with:
            datasetId: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST

Triggers a Power BI dataset refresh for the financial reporting workspace and notifies the finance team via Teams when the refresh completes or fails.

naftiko: "0.5"
info:
  label: "Power BI Financial Report Refresh"
  description: "Triggers a Power BI dataset refresh for the financial reporting workspace and notifies the finance team via Teams when the refresh completes or fails."
  tags:
    - finance
    - analytics
    - reporting
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: refresh-financial-report
          description: "Trigger a Power BI dataset refresh for the specified financial reporting workspace and dataset, then notify the finance Teams channel of completion status. Use at period close or on demand."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID containing the financial dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Power BI financial dataset {{dataset_id}} refresh triggered. Refresh ID: {{trigger-refresh.refresh_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - 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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Analyzes costing variances between SAP standard and Snowflake actual costs, creating Jira reviews.

naftiko: "0.5"
info:
  label: "Product Costing Variance Analyzer"
  description: "Analyzes costing variances between SAP standard and Snowflake actual costs, creating Jira reviews."
  tags:
    - finance
    - manufacturing
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: cost-analytics
      port: 8080
      tools:
        - name: analyze-variance
          description: "Analyze product costing variances."
          inputParameters:
            - name: material_number
              type: string
              description: "Material number."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-standard
              type: call
              call: sap.get-cost
              with:
                material: "{{material_number}}"
            - name: get-actual
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT actual_cost FROM costs WHERE material='{{material_number}}'"
            - name: create-review
              type: call
              call: jira.create-issue
              with:
                project_key: "FIN"
                summary: "Variance: {{material_number}} ({{period}})"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-cost
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Traces affected batch in SAP, creates ServiceNow incident, and alerts quality team via Teams.

naftiko: "0.5"
info:
  label: "Product Recall Investigation Orchestrator"
  description: "Traces affected batch in SAP, creates ServiceNow incident, and alerts quality team via Teams."
  tags:
    - quality
    - supply-chain
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: investigate-recall
          description: "Orchestrate product recall investigation."
          inputParameters:
            - name: batch_number
              type: string
              description: "Batch number."
            - name: material_number
              type: string
              description: "Material number."
            - name: severity
              type: string
              description: "Severity level."
          steps:
            - name: trace-batch
              type: call
              call: sap.get-batch-details
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Recall: batch {{batch_number}}"
                urgency: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-alerts"
                text: "RECALL: Batch {{batch_number}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-batch-details
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Releases production batch after QA by checking SAP inspection, updating status, and notifying logistics via Teams.

naftiko: "0.5"
info:
  label: "Production Batch Release Workflow"
  description: "Releases production batch after QA by checking SAP inspection, updating status, and notifying logistics via Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: batch-release
      port: 8080
      tools:
        - name: release-batch
          description: "Release production batch after QA."
          inputParameters:
            - name: batch_number
              type: string
              description: "Batch number."
            - name: material_number
              type: string
              description: "Material number."
          steps:
            - name: check-qa
              type: call
              call: sap.get-inspection
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: release
              type: call
              call: sap.update-batch
              with:
                batch: "{{batch_number}}"
                status: "RELEASED"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "logistics"
                text: "Batch {{batch_number}} released. QA: {{check-qa.decision}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-inspection
              method: GET
            - name: update-batch
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Optimizes scheduling from Snowflake demand, SAP capacity, and Jira schedule proposals.

naftiko: "0.5"
info:
  label: "Production Scheduling Optimizer"
  description: "Optimizes scheduling from Snowflake demand, SAP capacity, and Jira schedule proposals."
  tags:
    - manufacturing
    - supply-chain
    - snowflake
    - sap
    - jira
capability:
  exposes:
    - type: mcp
      namespace: production-planning
      port: 8080
      tools:
        - name: optimize-schedule
          description: "Optimize production scheduling."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-demand
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "DEMAND_WH"
                query: "SELECT sku, units FROM demand WHERE plant='{{plant_code}}'"
            - name: get-capacity
              type: call
              call: sap.get-capacity
              with:
                plant: "{{plant_code}}"
            - name: create-schedule
              type: call
              call: jira.create-issue
              with:
                project_key: "PROD"
                summary: "Schedule: {{plant_code}} {{period}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-capacity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Analyzes yield from SAP planned vs actual, Snowflake waste trends, and creates Jira improvement tasks.

naftiko: "0.5"
info:
  label: "Production Yield Analysis"
  description: "Analyzes yield from SAP planned vs actual, Snowflake waste trends, and creates Jira improvement tasks."
  tags:
    - manufacturing
    - quality
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: production-analytics
      port: 8080
      tools:
        - name: analyze-yield
          description: "Analyze production yield."
          inputParameters:
            - name: line
              type: string
              description: "Production line."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-yield
              type: call
              call: sap.get-confirmations
              with:
                plant: "{{plant_code}}"
                line: "{{line}}"
            - name: get-waste
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "MFG_WH"
                query: "SELECT waste_pct FROM waste WHERE line='{{line}}'"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "MFG"
                summary: "Yield: {{line}} ({{period}})"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-confirmations
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Handles shortages by checking SAP stock, identifying affected orders, and creating Ariba procurement requests.

naftiko: "0.5"
info:
  label: "Raw Material Shortage Alert Handler"
  description: "Handles shortages by checking SAP stock, identifying affected orders, and creating Ariba procurement requests."
  tags:
    - supply-chain
    - procurement
    - sap
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: supply-ops
      port: 8080
      tools:
        - name: handle-shortage
          description: "Handle raw material shortage."
          inputParameters:
            - name: material_number
              type: string
              description: "Material number."
            - name: plant_code
              type: string
              description: "Plant code."
            - name: reorder_qty
              type: number
              description: "Reorder quantity."
          steps:
            - name: check-stock
              type: call
              call: sap.get-stock
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: get-orders
              type: call
              call: sap.get-orders
              with:
                material: "{{material_number}}"
            - name: create-req
              type: call
              call: ariba.create-requisition
              with:
                material: "{{material_number}}"
                quantity: "{{reorder_qty}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-stock
              method: GET
            - name: get-orders
              method: GET
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: get-supplier
              method: GET

Tracks regulatory compliance from Jira submissions, SharePoint docs, and Power BI dashboard.

naftiko: "0.5"
info:
  label: "Regulatory Document Compliance Tracker"
  description: "Tracks regulatory compliance from Jira submissions, SharePoint docs, and Power BI dashboard."
  tags:
    - regulatory
    - quality
    - jira
    - sharepoint
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: track-compliance
          description: "Track regulatory submission status."
          inputParameters:
            - name: submission_id
              type: string
              description: "Jira submission key."
          steps:
            - name: get-status
              type: call
              call: jira.get-issue
              with:
                issue_key: "{{submission_id}}"
            - name: check-docs
              type: call
              call: sharepoint.list-folder
              with:
                folder: "{{submission_id}}"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "regulatory-tracker"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/drive/items"
          operations:
            - name: search-docs
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST

Audits planogram compliance from Salesforce visits, Snowflake metrics, and Jira follow-ups.

naftiko: "0.5"
info:
  label: "Retail Planogram Compliance Audit"
  description: "Audits planogram compliance from Salesforce visits, Snowflake metrics, and Jira follow-ups."
  tags:
    - sales
    - retail
    - salesforce
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: retail-compliance
      port: 8080
      tools:
        - name: audit-planogram
          description: "Audit planogram compliance."
          inputParameters:
            - name: region
              type: string
              description: "Region."
            - name: audit_week
              type: string
              description: "Audit week."
          steps:
            - name: get-visits
              type: call
              call: salesforce.get-visits
              with:
                region: "{{region}}"
            - name: get-compliance
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "RETAIL_WH"
                query: "SELECT score FROM planogram WHERE region='{{region}}'"
            - name: create-followup
              type: call
              call: jira.create-issue
              with:
                project_key: "RETAIL"
                summary: "Planogram: {{region}} week {{audit_week}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Orchestrates shelf audits from Salesforce data, Snowflake compliance, and Jira follow-ups.

naftiko: "0.5"
info:
  label: "Retail Shelf Audit Orchestrator"
  description: "Orchestrates shelf audits from Salesforce data, Snowflake compliance, and Jira follow-ups."
  tags:
    - sales
    - retail
    - salesforce
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: retail-ops
      port: 8080
      tools:
        - name: run-audit
          description: "Orchestrate retail shelf audit."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce account ID."
            - name: audit_period
              type: string
              description: "Period."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-compliance
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "RETAIL_WH"
                query: "SELECT score FROM audit WHERE account='{{account_id}}'"
            - name: create-followup
              type: call
              call: jira.create-issue
              with:
                project_key: "RETAIL"
                summary: "Audit: {{get-account.name}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kimberlyclark.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

Generates a daily digest of Kimberly-Clark's top accounts from Salesforce CRM including open opportunities, recent activity, and revenue to date, and posts the summary to a Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Digest"
  description: "Generates a daily digest of Kimberly-Clark's top accounts from Salesforce CRM including open opportunities, recent activity, and revenue to date, and posts the summary to a Teams channel."
  tags:
    - sales
    - crm
    - reporting
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-reporting
      port: 8080
      tools:
        - name: digest-account-health
          description: "Retrieve active Salesforce accounts with open opportunities and recent activity logs, then post a formatted digest to the sales leadership Teams channel. Run daily for pipeline visibility."
          inputParameters:
            - name: days_back
              in: body
              type: integer
              description: "Number of days of activity to include in the digest, e.g. 7 for a weekly summary."
          steps:
            - name: get-accounts
              type: call
              call: salesforce.query-accounts
              with:
                days_back: "{{days_back}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "Account Health Digest: {{get-accounts.summary}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberly-clark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/query"
          operations:
            - name: query-accounts
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Enriches a new Salesforce lead with product interest data derived from associated Jira feature requests and customer feedback tickets.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment from Jira"
  description: "Enriches a new Salesforce lead with product interest data derived from associated Jira feature requests and customer feedback tickets."
  tags:
    - sales
    - crm
    - salesforce
    - jira
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: lead-enrichment
      port: 8080
      tools:
        - name: enrich-lead-from-jira
          description: "Given a Salesforce lead ID and associated Jira customer ticket keys, retrieve Jira ticket details and update the Salesforce lead record with product interest and priority signals. Use for pre-sales intelligence gathering."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to enrich."
            - name: jira_ticket_key
              in: body
              type: string
              description: "The Jira ticket key linked to this lead's customer feedback, e.g. CUST-1234."
          steps:
            - name: get-jira-ticket
              type: call
              call: jira.get-issue
              with:
                issue_key: "{{jira_ticket_key}}"
            - name: update-lead
              type: call
              call: salesforce.update-lead
              with:
                lead_id: "{{lead_id}}"
                product_interest: "{{get-jira-ticket.summary}}"
                priority: "{{get-jira-ticket.priority}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kimberly-clark.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kimberly-clark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

Retrieves the sales opportunity pipeline from Salesforce for a business unit.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Lookup"
  description: "Retrieves the sales opportunity pipeline from Salesforce for a business unit."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: crm-sales
      port: 8080
      tools:
        - name: get-pipeline
          description: "Look up Salesforce opportunity pipeline by business unit."
          inputParameters:
            - name: business_unit
              type: string
              description: "Business unit name."
          call: salesforce.get-pipeline
          with:
            bu: "{{business_unit}}"
          outputParameters:
            - name: total_value
              type: string
              mapping: "$.totalSize"
            - name: opportunities
              type: string
              mapping: "$.records"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

When a Salesforce opportunity is marked Closed Won, creates a corresponding sales order in SAP S/4HANA and notifies the account team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Order Sync"
  description: "When a Salesforce opportunity is marked Closed Won, creates a corresponding sales order in SAP S/4HANA and notifies the account team via Microsoft Teams."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-erp-sync
      port: 8080
      tools:
        - name: sync-opportunity-to-order
          description: "Given a Salesforce opportunity ID that has been marked Closed Won, retrieve opportunity details, create a SAP S/4HANA sales order, and notify the account team in Microsoft Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID (18-character Salesforce record ID)."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-order
              type: call
              call: sap.create-sales-order
              with:
                customer_id: "{{get-opportunity.account_sap_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency_code}}"
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "New SAP order {{create-sap-order.order_number}} created from Salesforce opportunity {{opportunity_id}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberly-clark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kimberly-clark-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves retail buyer account details from Salesforce including account health, open opportunities, and planogram compliance scores.

naftiko: "0.5"
info:
  label: "Salesforce Retail Buyer Account Lookup"
  description: "Retrieves retail buyer account details from Salesforce including account health, open opportunities, and planogram compliance scores."
  tags:
    - sales
    - retail
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm-retail
      port: 8080
      tools:
        - name: get-retail-buyer
          description: "Look up a retail buyer account in Salesforce. Returns health score, open opportunities, and compliance metrics."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce account ID."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: account_name
              type: string
              mapping: "$.Name"
            - name: health_score
              type: string
              mapping: "$.Health_Score__c"
            - name: open_opps
              type: string
              mapping: "$.Open_Opportunity_Count__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.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

Registers a new supplier in SAP Ariba, creates a corresponding vendor record in SAP S/4HANA, and notifies the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Registers a new supplier in SAP Ariba, creates a corresponding vendor record in SAP S/4HANA, and notifies the procurement team via Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - sap
    - supplier-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-ops
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given supplier details, register the supplier in SAP Ariba, create a vendor master record in SAP S/4HANA, and notify the procurement Teams channel. Use for new supplier qualification and onboarding."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "The legal name of the supplier company."
            - name: supplier_country
              in: body
              type: string
              description: "Two-letter ISO country code for the supplier's primary country."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact email address for the supplier."
          steps:
            - name: register-ariba
              type: call
              call: ariba.create-supplier
              with:
                name: "{{supplier_name}}"
                country: "{{supplier_country}}"
                contactEmail: "{{contact_email}}"
            - name: create-vendor
              type: call
              call: sap.create-vendor
              with:
                supplierName: "{{supplier_name}}"
                country: "{{supplier_country}}"
                aribaId: "{{register-ariba.supplier_id}}"
            - name: notify-procurement
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "New supplier onboarded: {{supplier_name}} | Ariba ID: {{register-ariba.supplier_id}} | SAP Vendor: {{create-vendor.vendor_id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://kimberly-clark-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier"
          operations:
            - name: create-vendor
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Traces a product batch through SAP to retrieve production origins and component lots.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Traces a product batch through SAP to retrieve production origins and component lots."
  tags:
    - quality
    - supply-chain
    - sap
    - traceability
capability:
  exposes:
    - type: mcp
      namespace: erp-traceability
      port: 8080
      tools:
        - name: trace-batch
          description: "Trace a product batch in SAP for production details."
          inputParameters:
            - name: batch_number
              type: string
              description: "SAP batch number."
            - name: material_number
              type: string
              description: "SAP material number."
          call: sap.get-batch-trace
          with:
            batch: "{{batch_number}}"
            material: "{{material_number}}"
          outputParameters:
            - name: plant
              type: string
              mapping: "$.d.ProductionPlant"
            - name: date
              type: string
              mapping: "$.d.ManufactureDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-batch-trace
              method: GET

Retrieves the bill of materials for a finished product from SAP including component materials and quantities.

naftiko: "0.5"
info:
  label: "SAP Bill of Materials Lookup"
  description: "Retrieves the bill of materials for a finished product from SAP including component materials and quantities."
  tags:
    - manufacturing
    - r-and-d
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-engineering
      port: 8080
      tools:
        - name: get-bom
          description: "Retrieve BOM from SAP for a material. Returns component list with quantities."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: plant_code
              type: string
              description: "SAP plant code."
          call: sap.get-bom
          with:
            material: "{{material_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: bom_number
              type: string
              mapping: "$.d.BillOfMaterial"
            - name: components
              type: string
              mapping: "$.d.to_BillOfMaterialItem.results"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-bom
              method: GET

Retrieves submitted expense reports from SAP Concur that exceed policy thresholds and flags them in ServiceNow for manager review.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Audit"
  description: "Retrieves submitted expense reports from SAP Concur that exceed policy thresholds and flags them in ServiceNow for manager review."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
    - audit
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: audit-expense-reports
          description: "Retrieve expense reports from SAP Concur that exceed the policy limit and create ServiceNow approval tasks for manager review. Invoke on a nightly schedule or before period close."
          inputParameters:
            - name: threshold_amount
              in: body
              type: number
              description: "The expense amount threshold in USD above which reports require additional review."
            - name: submission_date
              in: body
              type: string
              description: "Filter expense reports submitted on or after this date in YYYY-MM-DD format."
          steps:
            - name: get-expense-reports
              type: call
              call: concur.get-expense-reports
              with:
                submitDateAfter: "{{submission_date}}"
            - name: create-review-task
              type: call
              call: servicenow.create-approval
              with:
                short_description: "Expense reports exceeding ${{threshold_amount}} require review"
                category: "expense_audit"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST

Retrieves actual spending for a cost center from SAP for a fiscal period.

naftiko: "0.5"
info:
  label: "SAP Cost Center Actuals Lookup"
  description: "Retrieves actual spending for a cost center from SAP for a fiscal period."
  tags:
    - finance
    - operations
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: get-actuals
          description: "Look up cost center actuals in SAP."
          inputParameters:
            - name: cost_center
              type: string
              description: "SAP cost center ID."
            - name: period
              type: string
              description: "Fiscal period."
          call: sap.get-actuals
          with:
            cost_center: "{{cost_center}}"
            period: "{{period}}"
          outputParameters:
            - name: total
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.Currency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_OPLACCTGDOCITEMCUBE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-actuals
              method: GET

Monitors budgets from SAP actuals, Snowflake plans, and alerts via Teams.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Monitor"
  description: "Monitors budgets from SAP actuals, Snowflake plans, and alerts via Teams."
  tags:
    - finance
    - operations
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: budget-monitoring
      port: 8080
      tools:
        - name: monitor-budget
          description: "Monitor cost center budget."
          inputParameters:
            - name: cost_center
              type: string
              description: "Cost center."
            - name: period
              type: string
              description: "Period."
            - name: threshold
              type: number
              description: "Threshold pct."
          steps:
            - name: get-actuals
              type: call
              call: sap.get-actuals
              with:
                cc: "{{cost_center}}"
                period: "{{period}}"
            - name: get-plan
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT planned FROM budget WHERE cc='{{cost_center}}'"
            - name: alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance"
                text: "Budget: {{cost_center}} at {{get-plan.consumed_pct}}%"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_OPLACCTGDOCITEMCUBE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Processes credit memos by validating SAP invoice, creating credit doc, and updating Salesforce account.

naftiko: "0.5"
info:
  label: "SAP Credit Memo Processing"
  description: "Processes credit memos by validating SAP invoice, creating credit doc, and updating Salesforce account."
  tags:
    - finance
    - sales
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: finance-ar
      port: 8080
      tools:
        - name: process-credit-memo
          description: "Process credit memo."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Invoice number."
            - name: credit_amount
              type: number
              description: "Credit amount."
            - name: reason
              type: string
              description: "Reason."
          steps:
            - name: validate
              type: call
              call: sap.get-invoice
              with:
                invoice: "{{invoice_number}}"
            - name: create-credit
              type: call
              call: sap.create-credit-memo
              with:
                reference: "{{invoice_number}}"
                amount: "{{credit_amount}}"
            - name: update-account
              type: call
              call: salesforce.update-account
              with:
                id: "{{validate.customer_id}}"
                credit: "{{credit_amount}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-invoice
              method: GET
            - name: create-credit-memo
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

Orchestrates monthly close by running SAP tasks, validating Snowflake balances, and posting status to Teams.

naftiko: "0.5"
info:
  label: "SAP Financial Period Close Orchestrator"
  description: "Orchestrates monthly close by running SAP tasks, validating Snowflake balances, and posting status to Teams."
  tags:
    - finance
    - operations
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: close-period
          description: "Orchestrate financial period close."
          inputParameters:
            - name: period
              type: string
              description: "Fiscal period."
            - name: company_code
              type: string
              description: "Company code."
          steps:
            - name: check-items
              type: call
              call: sap.get-open-items
              with:
                code: "{{company_code}}"
                period: "{{period}}"
            - name: validate
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT * FROM recon WHERE code='{{company_code}}'"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance-close"
                text: "Period {{period}}: Open items {{check-items.count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_OPLACCTGDOCITEMCUBE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-open-items
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Confirms goods receipt in SAP S/4HANA for a purchase order, returning receipt document and quantity.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Confirmation"
  description: "Confirms goods receipt in SAP S/4HANA for a purchase order, returning receipt document and quantity."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-logistics
      port: 8080
      tools:
        - name: confirm-goods-receipt
          description: "Confirm goods receipt against a PO. Returns receipt doc, quantity, and posting date."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number."
            - name: plant_code
              type: string
              description: "SAP plant code."
          call: sap.post-goods-receipt
          with:
            po_number: "{{po_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: receipt_doc
              type: string
              mapping: "$.d.MaterialDocumentNumber"
            - name: quantity
              type: string
              mapping: "$.d.QuantityReceived"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: post-goods-receipt
              method: POST

Creates intercompany transfers in SAP, updates Snowflake forecasts, and notifies via Teams.

naftiko: "0.5"
info:
  label: "SAP Intercompany Transfer Workflow"
  description: "Creates intercompany transfers in SAP, updates Snowflake forecasts, and notifies via Teams."
  tags:
    - supply-chain
    - logistics
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: intercompany
      port: 8080
      tools:
        - name: create-transfer
          description: "Create intercompany stock transfer."
          inputParameters:
            - name: material
              type: string
              description: "Material."
            - name: from_plant
              type: string
              description: "Source plant."
            - name: to_plant
              type: string
              description: "Target plant."
            - name: quantity
              type: number
              description: "Quantity."
          steps:
            - name: transfer
              type: call
              call: sap.create-transfer
              with:
                material: "{{material}}"
                from: "{{from_plant}}"
                to: "{{to_plant}}"
            - name: update
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "CALL update_forecast('{{to_plant}}', '{{material}}', {{quantity}})"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "logistics"
                text: "Transfer: {{quantity}} of {{material}} from {{from_plant}} to {{to_plant}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_STOCK_TRANSFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: create-transfer
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

When a supplier invoice arrives in SAP Ariba, validates the invoice against a SAP S/4HANA purchase order and routes for approval if there is a discrepancy.

naftiko: "0.5"
info:
  label: "SAP Invoice Processing and Approval"
  description: "When a supplier invoice arrives in SAP Ariba, validates the invoice against a SAP S/4HANA purchase order and routes for approval if there is a discrepancy."
  tags:
    - finance
    - procurement
    - sap
    - sap-ariba
    - invoice
    - approval
capability:
  exposes:
    - type: mcp
      namespace: invoice-ops
      port: 8080
      tools:
        - name: process-invoice
          description: "Given an Ariba invoice ID, retrieve the invoice details from SAP Ariba, validate against the matching SAP S/4HANA PO, and create an approval task if amounts or quantities do not match."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice document ID."
            - name: po_number
              in: body
              type: string
              description: "The associated SAP purchase order number."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: servicenow.create-approval
              with:
                short_description: "Invoice discrepancy: {{invoice_id}} vs PO {{po_number}}"
                amount_invoiced: "{{get-invoice.total_amount}}"
                amount_po: "{{get-po.total_value}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kimberly-clark-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
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST

Creates maintenance orders in SAP from ServiceNow requests and notifies team via Teams.

naftiko: "0.5"
info:
  label: "SAP Maintenance Order Creation"
  description: "Creates maintenance orders in SAP from ServiceNow requests and notifies team via Teams."
  tags:
    - manufacturing
    - operations
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-order
          description: "Create maintenance order."
          inputParameters:
            - name: snow_ticket
              type: string
              description: "ServiceNow ticket."
            - name: equipment_id
              type: string
              description: "Equipment ID."
            - name: priority
              type: string
              description: "Priority."
          steps:
            - name: get-request
              type: call
              call: servicenow.get-request
              with:
                number: "{{snow_ticket}}"
            - name: create-order
              type: call
              call: sap.create-order
              with:
                equipment: "{{equipment_id}}"
                priority: "{{priority}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                channel_id: "maintenance"
                text: "Maintenance order for {{equipment_id}}. Priority: {{priority}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.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://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Checks current material stock levels in SAP for tissue, diaper, and personal care raw materials at a specific plant.

naftiko: "0.5"
info:
  label: "SAP Material Stock Level Check"
  description: "Checks current material stock levels in SAP for tissue, diaper, and personal care raw materials at a specific plant."
  tags:
    - supply-chain
    - inventory
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-inventory
      port: 8080
      tools:
        - name: check-stock-level
          description: "Query SAP for current stock level of a material at a specific plant. Returns unrestricted use, quality inspection, and blocked stock quantities."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: plant_code
              type: string
              description: "SAP plant code."
          call: sap.get-stock
          with:
            material: "{{material_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: unrestricted_qty
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
            - name: quality_inspection_qty
              type: string
              mapping: "$.d.QualityInspectionStockQty"
            - name: blocked_qty
              type: string
              mapping: "$.d.BlockedStockQty"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod(Material='{{material}}',Plant='{{plant}}')"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-stock
              method: GET

Runs the month-end period close checklist in SAP S/4HANA, verifying that all posting periods are closed and all open items are resolved, then posts a status report to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period Close Checklist"
  description: "Runs the month-end period close checklist in SAP S/4HANA, verifying that all posting periods are closed and all open items are resolved, then posts a status report to the finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - period-close
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: run-period-close-check
          description: "Given a fiscal period and company code, verify SAP S/4HANA posting period status, check for open items, and post a close-readiness report to the finance Teams channel. Use at month-end close."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period in YYYYMM format, e.g. 202503."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code to check, e.g. 1000."
          steps:
            - name: check-periods
              type: call
              call: sap.get-posting-periods
              with:
                period: "{{fiscal_period}}"
                companyCode: "{{company_code}}"
            - name: get-open-items
              type: call
              call: sap.get-open-items
              with:
                period: "{{fiscal_period}}"
                companyCode: "{{company_code}}"
            - name: post-status
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Period close check for {{fiscal_period}} ({{company_code}}): {{check-periods.status}} | Open items: {{get-open-items.count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberly-clark-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPLANDATA_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: posting-periods
          path: "/PostingPeriods"
          operations:
            - name: get-posting-periods
              method: GET
        - name: open-items
          path: "/OpenItems"
          operations:
            - name: get-open-items
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the current status and progress of a manufacturing production order from SAP S/4HANA for tissue and personal care product lines.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Lookup"
  description: "Retrieves the current status and progress of a manufacturing production order from SAP S/4HANA for tissue and personal care product lines."
  tags:
    - manufacturing
    - production
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a production order in SAP by order number. Returns status, planned quantity, confirmed quantity, and target completion date."
          inputParameters:
            - name: order_number
              type: string
              description: "SAP production order number."
          call: sap.get-production-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
            - name: planned_qty
              type: string
              mapping: "$.d.TotalPlannedQuantity"
            - name: confirmed_qty
              type: string
              mapping: "$.d.TotalConfirmedYieldQuantity"
            - name: target_end_date
              type: string
              mapping: "$.d.MfgOrderPlannedEndDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor name, total value, and open line items for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor name, total value, and open line items for procurement review."
  tags:
    - procurement
    - finance
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, vendor name, total amount, and currency. Use for procurement approvals, spend analysis, and vendor reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to look up, e.g. 4500012345."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberly-clark-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 for tissue and hygiene product batches to verify inspection status.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves quality inspection lot details from SAP QM for tissue and hygiene product batches to verify inspection status."
  tags:
    - quality
    - manufacturing
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-quality
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Look up a quality inspection lot in SAP by material and batch. Returns inspection status, usage decision, and defect count."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: batch
              type: string
              description: "Batch number."
          call: sap.get-inspection-lot
          with:
            material: "{{material_number}}"
            batch: "{{batch}}"
          outputParameters:
            - name: inspection_lot
              type: string
              mapping: "$.d.InspectionLot"
            - name: status
              type: string
              mapping: "$.d.InspectionLotStatus"
            - name: usage_decision
              type: string
              mapping: "$.d.UsageDecision"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot"
          operations:
            - name: get-inspection-lot
              method: GET

Tracks shipments from SAP delivery docs and updates Salesforce orders with tracking info.

naftiko: "0.5"
info:
  label: "SAP Transport Shipment Tracker"
  description: "Tracks shipments from SAP delivery docs and updates Salesforce orders with tracking info."
  tags:
    - supply-chain
    - logistics
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: logistics-tracking
      port: 8080
      tools:
        - name: track-shipment
          description: "Track outbound shipment."
          inputParameters:
            - name: delivery_number
              type: string
              description: "SAP delivery number."
            - name: sf_order_id
              type: string
              description: "Salesforce order ID."
          steps:
            - name: get-delivery
              type: call
              call: sap.get-delivery
              with:
                delivery: "{{delivery_number}}"
            - name: update-order
              type: call
              call: salesforce.update-order
              with:
                order_id: "{{sf_order_id}}"
                tracking: "{{get-delivery.tracking}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

Retrieves vendor master data from SAP including payment terms, pulp and raw material supplier details, and compliance status.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP including payment terms, pulp and raw material supplier details, and compliance status."
  tags:
    - procurement
    - supply-chain
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up vendor master record in SAP by vendor number. Returns supplier name, payment terms, and purchasing organization."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor account number."
          call: sap.get-vendor
          with:
            vendor: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: purchasing_org
              type: string
              mapping: "$.d.PurchasingOrganization"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor}}')"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-vendor
              method: GET

Retrieves vendor payment terms and credit limit from SAP.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Terms Lookup"
  description: "Retrieves vendor payment terms and credit limit from SAP."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-payment-terms
          description: "Look up vendor payment terms in SAP."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor number."
          call: sap.get-vendor-terms
          with:
            vendor: "{{vendor_number}}"
          outputParameters:
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: credit_limit
              type: string
              mapping: "$.d.CreditLimit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-vendor-terms
              method: GET

Posts warehouse transfers in SAP, updates Snowflake inventory, and confirms via Teams.

naftiko: "0.5"
info:
  label: "SAP Warehouse Transfer Posting"
  description: "Posts warehouse transfers in SAP, updates Snowflake inventory, and confirms via Teams."
  tags:
    - supply-chain
    - logistics
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: post-transfer
          description: "Post warehouse transfer."
          inputParameters:
            - name: material
              type: string
              description: "Material."
            - name: from_loc
              type: string
              description: "Source."
            - name: to_loc
              type: string
              description: "Target."
            - name: quantity
              type: number
              description: "Quantity."
          steps:
            - name: transfer
              type: call
              call: sap.post-transfer
              with:
                material: "{{material}}"
                from: "{{from_loc}}"
            - name: update
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "CALL update_inv('{{material}}', {{quantity}})"
            - name: confirm
              type: call
              call: msteams.send-message
              with:
                channel_id: "warehouse"
                text: "Transfer: {{quantity}} of {{material}} to {{to_loc}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: post-transfer
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Opens and routes a ServiceNow change request for IT infrastructure changes, attaches a risk assessment, and notifies the change advisory board via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval"
  description: "Opens and routes a ServiceNow change request for IT infrastructure changes, attaches a risk assessment, and notifies the change advisory board via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: create-change-request
          description: "Given a change description, risk level, and implementation window, open a ServiceNow change request and notify the change advisory board channel in Teams. Use before any planned production infrastructure change."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "A clear description of the planned change and its purpose."
            - name: risk_level
              in: body
              type: string
              description: "Risk level of the change: low, medium, or high."
            - name: implementation_window
              in: body
              type: string
              description: "Planned implementation window in ISO 8601 interval format."
          steps:
            - name: create-cr
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "{{change_description}}"
                risk: "{{risk_level}}"
                start_date: "{{implementation_window}}"
            - name: notify-cab
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_cab_channel_id"
                text: "New Change Request {{create-cr.number}} (Risk: {{risk_level}}): {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves current status of a ServiceNow incident including priority and assignment.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves current status of a ServiceNow incident including priority and assignment."
  tags:
    - operations
    - it-service
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: it-service-mgmt
      port: 8080
      tools:
        - name: get-incident
          description: "Look up ServiceNow incident status."
          inputParameters:
            - name: incident_number
              type: string
              description: "ServiceNow incident number."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.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

Syncs IT hardware and software asset records from ServiceNow Asset Management with the Microsoft 365 device inventory to identify unmanaged devices.

naftiko: "0.5"
info:
  label: "ServiceNow IT Asset Inventory Sync"
  description: "Syncs IT hardware and software asset records from ServiceNow Asset Management with the Microsoft 365 device inventory to identify unmanaged devices."
  tags:
    - itsm
    - asset-management
    - servicenow
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: asset-ops
      port: 8080
      tools:
        - name: sync-asset-inventory
          description: "Retrieve all managed devices from Microsoft Graph (Intune) and compare with ServiceNow hardware asset records. Return a list of devices present in Intune but missing from ServiceNow for reconciliation."
          steps:
            - name: get-intune-devices
              type: call
              call: msgraph.get-managed-devices
            - name: get-snow-assets
              type: call
              call: servicenow.get-hardware-assets
            - name: create-snow-assets
              type: call
              call: servicenow.create-asset
              with:
                device_data: "{{get-intune-devices.value}}"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: managed-devices
          path: "/deviceManagement/managedDevices"
          operations:
            - name: get-managed-devices
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: hardware-assets
          path: "/table/alm_hardware"
          operations:
            - name: get-hardware-assets
              method: GET
            - name: create-asset
              method: POST

Searches SharePoint for documents matching a keyword.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches SharePoint for documents matching a keyword."
  tags:
    - operations
    - documents
    - sharepoint
    - search
capability:
  exposes:
    - type: mcp
      namespace: doc-management
      port: 8080
      tools:
        - name: search-docs
          description: "Search SharePoint for documents."
          inputParameters:
            - name: keyword
              type: string
              description: "Search keyword."
            - name: site_id
              type: string
              description: "SharePoint site ID."
          call: sharepoint.search
          with:
            siteId: "{{site_id}}"
            query: "{{keyword}}"
          outputParameters:
            - name: results
              type: string
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/drive/items"
          operations:
            - name: search-docs
              method: GET

Queries Snowflake for consumer demand signals across tissue, diaper, and personal care categories by region.

naftiko: "0.5"
info:
  label: "Snowflake Consumer Demand Signal Query"
  description: "Queries Snowflake for consumer demand signals across tissue, diaper, and personal care categories by region."
  tags:
    - analytics
    - supply-chain
    - snowflake
    - data
capability:
  exposes:
    - type: mcp
      namespace: demand-analytics
      port: 8080
      tools:
        - name: query-demand-signals
          description: "Query Snowflake for consumer demand signals including velocity, weeks of supply, and demand trend indicators."
          inputParameters:
            - name: category
              type: string
              description: "Product category (e.g., bath-tissue, diapers, fem-care)."
            - name: region
              type: string
              description: "Market region code."
          call: snowflake.execute-query
          with:
            warehouse: "DEMAND_ANALYTICS_WH"
            query: "SELECT sku, velocity, weeks_of_supply, trend FROM demand_signals WHERE category='{{category}}' AND region='{{region}}'"
          outputParameters:
            - name: signals
              type: string
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for failed or stalled data pipeline tasks, compiles a summary, and opens a ServiceNow incident if any critical jobs are overdue.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Check"
  description: "Queries Snowflake for failed or stalled data pipeline tasks, compiles a summary, and opens a ServiceNow incident if any critical jobs are overdue."
  tags:
    - data
    - analytics
    - monitoring
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Query Snowflake task execution history for failures or missed schedules in the last N hours. If critical jobs are overdue, open a ServiceNow incident. Use for automated data platform monitoring."
          inputParameters:
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours of task execution history to check, e.g. 6."
          steps:
            - name: get-failed-tasks
              type: call
              call: snowflake.query-task-history
              with:
                hours_back: "{{hours_back}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Snowflake pipeline failures detected in last {{hours_back}} hours"
                category: "data_platform"
                priority: "2"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberly-clark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/statements"
          operations:
            - name: query-task-history
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kimberly-clark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries Snowflake's query history to identify long-running or expensive queries, flags policy violations, and posts a governance summary to the data platform Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Query Governance Audit"
  description: "Queries Snowflake's query history to identify long-running or expensive queries, flags policy violations, and posts a governance summary to the data platform Teams channel."
  tags:
    - data
    - governance
    - snowflake
    - analytics
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: audit-query-governance
          description: "Retrieve Snowflake query history for the last N hours and identify queries exceeding execution time or credit thresholds. Post a governance summary to the data platform Teams channel. Use for daily data platform cost governance."
          inputParameters:
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours of query history to analyze, e.g. 24."
            - name: threshold_seconds
              in: body
              type: integer
              description: "Query execution time threshold in seconds. Queries exceeding this are flagged."
          steps:
            - name: get-query-history
              type: call
              call: snowflake.get-query-history
              with:
                hours_back: "{{hours_back}}"
                threshold_seconds: "{{threshold_seconds}}"
            - name: post-report
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "Snowflake Query Governance Report (last {{hours_back}}h): {{get-query-history.flagged_count}} queries exceeded {{threshold_seconds}}s threshold."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberly-clark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: query-history
          path: "/statements"
          operations:
            - name: get-query-history
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for retail POS analytics including velocity, distribution, and share data.

naftiko: "0.5"
info:
  label: "Snowflake Retail POS Analytics Query"
  description: "Queries Snowflake for retail POS analytics including velocity, distribution, and share data."
  tags:
    - analytics
    - sales
    - snowflake
    - retail
capability:
  exposes:
    - type: mcp
      namespace: retail-analytics
      port: 8080
      tools:
        - name: query-pos-data
          description: "Query Snowflake retail POS data for a category and retailer."
          inputParameters:
            - name: category
              type: string
              description: "Product category."
            - name: retailer
              type: string
              description: "Retail account."
            - name: date_from
              type: string
              description: "Start date."
          call: snowflake.execute-query
          with:
            warehouse: "RETAIL_ANALYTICS_WH"
            query: "SELECT * FROM pos WHERE category='{{category}}'"
          outputParameters:
            - name: data
              type: string
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for supply chain KPIs including fill rate, OTIF, and inventory turns.

naftiko: "0.5"
info:
  label: "Snowflake Supply Chain KPI Query"
  description: "Queries Snowflake for supply chain KPIs including fill rate, OTIF, and inventory turns."
  tags:
    - supply-chain
    - analytics
    - snowflake
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sc-analytics
      port: 8080
      tools:
        - name: query-sc-kpis
          description: "Query supply chain KPIs from Snowflake."
          inputParameters:
            - name: region
              type: string
              description: "Region code."
            - name: period
              type: string
              description: "Period."
          call: snowflake.execute-query
          with:
            warehouse: "SC_ANALYTICS_WH"
            query: "SELECT fill_rate, otif FROM sc_kpis WHERE region='{{region}}'"
          outputParameters:
            - name: fill_rate
              type: string
              mapping: "$.data[0].fill_rate"
            - name: otif
              type: string
              mapping: "$.data[0].otif"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Generates supplier scorecards from Ariba delivery data, Snowflake quality metrics, and posts to Teams.

naftiko: "0.5"
info:
  label: "Supplier Performance Scorecard Generator"
  description: "Generates supplier scorecards from Ariba delivery data, Snowflake quality metrics, and posts to Teams."
  tags:
    - procurement
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-analytics
      port: 8080
      tools:
        - name: generate-scorecard
          description: "Generate supplier performance scorecard."
          inputParameters:
            - name: supplier_id
              type: string
              description: "Ariba supplier ID."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-delivery
              type: call
              call: ariba.get-performance
              with:
                supplier_id: "{{supplier_id}}"
                period: "{{period}}"
            - name: get-quality
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "PROCUREMENT_WH"
                query: "SELECT defect_rate FROM supplier_quality WHERE supplier='{{supplier_id}}'"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "procurement"
                text: "Supplier {{supplier_id}}: OTD {{get-delivery.on_time_rate}}%"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Queries SAP S/4HANA for current inventory levels across Kimberly-Clark's distribution centers and generates a Snowflake-backed analytics summary for supply chain planning.

naftiko: "0.5"
info:
  label: "Supply Chain Inventory Snapshot"
  description: "Queries SAP S/4HANA for current inventory levels across Kimberly-Clark's distribution centers and generates a Snowflake-backed analytics summary for supply chain planning."
  tags:
    - supply-chain
    - inventory
    - sap
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: get-inventory-snapshot
          description: "Pull current inventory levels by material and plant from SAP S/4HANA, then write a snapshot to Snowflake for supply chain analytics. Use for daily inventory monitoring and replenishment planning."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code to query inventory for, e.g. KC01."
          steps:
            - name: get-inventory
              type: call
              call: sap.get-inventory
              with:
                plant: "{{plant_code}}"
            - name: write-snapshot
              type: call
              call: snowflake.insert-snapshot
              with:
                plant: "{{plant_code}}"
                data: "{{get-inventory.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberly-clark-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod"
          operations:
            - name: get-inventory
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberly-clark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-snapshot
              method: POST

Assesses risk from Snowflake supplier data, Ariba status, and posts alerts to Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Risk Assessment"
  description: "Assesses risk from Snowflake supplier data, Ariba status, and posts alerts to Teams."
  tags:
    - supply-chain
    - procurement
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-risk
      port: 8080
      tools:
        - name: assess-risk
          description: "Assess supply chain risk."
          inputParameters:
            - name: material_group
              type: string
              description: "Material group."
          steps:
            - name: get-data
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "SELECT supplier, share FROM concentration WHERE group='{{material_group}}'"
            - name: get-risk
              type: call
              call: ariba.get-risk
              with:
                group: "{{material_group}}"
            - name: post
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-risk"
                text: "Risk for {{material_group}}: Top share {{get-data.top_share}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: send-message
              method: POST

Creates and configures a new Terraform Cloud workspace for infrastructure provisioning, links it to the corresponding GitHub repository, and notifies the cloud team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Provisioning"
  description: "Creates and configures a new Terraform Cloud workspace for infrastructure provisioning, links it to the corresponding GitHub repository, and notifies the cloud team via Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - github
    - microsoft-teams
    - devops
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-terraform-workspace
          description: "Given a workspace name and GitHub repository URL, create a Terraform Cloud workspace, link it to the GitHub source repo, and notify the cloud team in Teams. Use when onboarding a new infrastructure project."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "The name for the new Terraform Cloud workspace in kebab-case."
            - name: github_repo
              in: body
              type: string
              description: "The GitHub repository URL to link to the workspace."
          steps:
            - name: create-workspace
              type: call
              call: terraform.create-workspace
              with:
                name: "{{workspace_name}}"
                vcs_repo: "{{github_repo}}"
            - name: notify-cloud-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_cloud_channel_id"
                text: "Terraform workspace '{{workspace_name}}' created and linked to {{github_repo}}. Workspace ID: {{create-workspace.id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/kimberly-clark/workspaces"
          operations:
            - name: create-workspace
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates TPE by pulling Salesforce promotions, Snowflake sales, and refreshing Power BI.

naftiko: "0.5"
info:
  label: "Trade Promotion Effectiveness Report"
  description: "Generates TPE by pulling Salesforce promotions, Snowflake sales, and refreshing Power BI."
  tags:
    - sales
    - marketing
    - salesforce
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: trade-analytics
      port: 8080
      tools:
        - name: generate-tpe
          description: "Generate trade promotion effectiveness report."
          inputParameters:
            - name: promotion_id
              type: string
              description: "Salesforce promotion ID."
            - name: date_from
              type: string
              description: "Start date."
            - name: date_to
              type: string
              description: "End date."
          steps:
            - name: get-promo
              type: call
              call: salesforce.get-promotion
              with:
                promotion_id: "{{promotion_id}}"
            - name: get-sales
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SALES_WH"
                query: "SELECT revenue FROM pos WHERE promo='{{promotion_id}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "trade-promotion-effectiveness"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kimberlyclark.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST

Performs three-way match between SAP PO, goods receipt, and invoice, routing exceptions to ServiceNow.

naftiko: "0.5"
info:
  label: "Vendor Invoice Three-Way Match"
  description: "Performs three-way match between SAP PO, goods receipt, and invoice, routing exceptions to ServiceNow."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ap-automation
      port: 8080
      tools:
        - name: three-way-match
          description: "Perform three-way match for vendor invoice."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Invoice number."
            - name: po_number
              type: string
              description: "PO number."
          steps:
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: get-receipt
              type: call
              call: sap.get-receipt
              with:
                po_number: "{{po_number}}"
            - name: create-exception
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Mismatch: {{invoice_number}} vs PO {{po_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-po
              method: GET
            - name: get-receipt
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kimberlyclark.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Analyzes warehouse capacity from SAP, demand from Snowflake, and refreshes Power BI dashboard.

naftiko: "0.5"
info:
  label: "Warehouse Capacity Planning Orchestrator"
  description: "Analyzes warehouse capacity from SAP, demand from Snowflake, and refreshes Power BI dashboard."
  tags:
    - supply-chain
    - logistics
    - sap
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: warehouse-planning
      port: 8080
      tools:
        - name: plan-capacity
          description: "Analyze warehouse capacity."
          inputParameters:
            - name: warehouse_id
              type: string
              description: "Warehouse number."
            - name: weeks
              type: number
              description: "Forecast weeks."
          steps:
            - name: get-util
              type: call
              call: sap.get-warehouse-stock
              with:
                warehouse: "{{warehouse_id}}"
            - name: get-forecast
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "SELECT pallets FROM forecast WHERE id='{{warehouse_id}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "warehouse-capacity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kimberlyclark-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: resource
          path: "/data"
          operations:
            - name: get-warehouse-stock
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST

Pulls current compensation data from Workday and generates a cost-center benchmarking report published to Power BI for finance and HR leadership.

naftiko: "0.5"
info:
  label: "Workday Compensation Benchmarking Report"
  description: "Pulls current compensation data from Workday and generates a cost-center benchmarking report published to Power BI for finance and HR leadership."
  tags:
    - hr
    - finance
    - workday
    - power-bi
    - reporting
    - compensation
capability:
  exposes:
    - type: mcp
      namespace: compensation-reporting
      port: 8080
      tools:
        - name: publish-compensation-benchmark
          description: "Pull salary and grade data from Workday for all active employees, push the dataset to Power BI, and trigger a report refresh. Use for quarterly compensation benchmarking and HR finance reviews."
          inputParameters:
            - name: effective_date
              in: body
              type: string
              description: "The effective date for the compensation snapshot in YYYY-MM-DD format."
          steps:
            - name: get-compensation-data
              type: call
              call: workday.get-compensation
              with:
                effectiveDate: "{{effective_date}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.refresh-dataset
              with:
                workspace_id: "$secrets.powerbi_hr_workspace_id"
                dataset_id: "$secrets.powerbi_compensation_dataset_id"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/kimberly-clark/compensation/workers"
          operations:
            - name: get-compensation
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Generates diversity metrics from Workday, enriches with Snowflake analytics, refreshes Power BI.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Report"
  description: "Generates diversity metrics from Workday, enriches with Snowflake analytics, refreshes Power BI."
  tags:
    - hr
    - analytics
    - workday
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: hr-analytics
      port: 8080
      tools:
        - name: generate-diversity
          description: "Generate workforce diversity metrics."
          inputParameters:
            - name: business_unit
              type: string
              description: "Business unit."
            - name: period
              type: string
              description: "Period."
          steps:
            - name: get-demo
              type: call
              call: workday.get-demographics
              with:
                bu: "{{business_unit}}"
            - name: get-analytics
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "HR_WH"
                query: "SELECT diversity_index FROM metrics WHERE bu='{{business_unit}}'"
            - name: refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                datasetId: "diversity-dashboard"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kimberlyclark.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets"
          operations:
            - name: refresh-dataset
              method: POST

Retrieves employee certifications and training completions from Workday for compliance tracking at manufacturing facilities.

naftiko: "0.5"
info:
  label: "Workday Employee Certification Lookup"
  description: "Retrieves employee certifications and training completions from Workday for compliance tracking at manufacturing facilities."
  tags:
    - hr
    - compliance
    - workday
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: hr-compliance
      port: 8080
      tools:
        - name: get-certifications
          description: "Look up employee certifications in Workday including safety training, GMP, and equipment qualifications."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday employee ID."
          call: workday.get-certifications
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: certifications
              type: string
              mapping: "$.certifications"
            - name: expired_count
              type: string
              mapping: "$.expired_count"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/kimberlyclark/workers/{{worker_id}}/certifications"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-certifications
              method: GET

Retrieves headcount data from Workday by department including active employees and open positions.

naftiko: "0.5"
info:
  label: "Workday Headcount Report Lookup"
  description: "Retrieves headcount data from Workday by department including active employees and open positions."
  tags:
    - hr
    - workforce
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount
          description: "Get headcount report from Workday by department."
          inputParameters:
            - name: department
              type: string
              description: "Department name."
          call: workday.get-headcount
          with:
            department: "{{department}}"
          outputParameters:
            - name: active_count
              type: string
              mapping: "$.headcount.active"
            - name: open_positions
              type: string
              mapping: "$.headcount.open"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET

Triggers the annual performance review cycle in Workday for a specified population, assigns reviewers, and sends reminder notifications via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Launch"
  description: "Triggers the annual performance review cycle in Workday for a specified population, assigns reviewers, and sends reminder notifications via Microsoft Teams."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a review cycle name and due date, initiate the Workday performance review process for all eligible employees, and send kick-off reminders to managers via Teams. Use at the start of each annual or mid-year review period."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "Name of the performance review cycle, e.g. 2025 Annual Review."
            - name: due_date
              in: body
              type: string
              description: "Deadline for completing reviews in YYYY-MM-DD format."
          steps:
            - name: launch-cycle
              type: call
              call: workday.create-review-cycle
              with:
                name: "{{cycle_name}}"
                dueDate: "{{due_date}}"
            - name: notify-managers
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Performance review cycle '{{cycle_name}}' has launched. Deadline: {{due_date}}. Please complete your reviews in Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/kimberly-clark/performanceManagement/reviewCycles"
          operations:
            - name: create-review-cycle
              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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new job requisition is approved in Workday Recruiting, creates a corresponding Jira project tracking ticket for the hiring team and notifies the HR channel in Teams.

naftiko: "0.5"
info:
  label: "Workday Recruiting Requisition Sync to Jira"
  description: "When a new job requisition is approved in Workday Recruiting, creates a corresponding Jira project tracking ticket for the hiring team and notifies the HR channel in Teams."
  tags:
    - hr
    - recruiting
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: recruiting-ops
      port: 8080
      tools:
        - name: sync-requisition-to-jira
          description: "Given a Workday job requisition ID, retrieve requisition details and create a Jira tracking issue for the hiring team. Notify the HR Teams channel with requisition and Jira details."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-job-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-jira-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Hiring: {{get-requisition.job_title}} ({{get-requisition.department}})"
                description: "Workday requisition {{requisition_id}} approved. Target hire date: {{get-requisition.target_hire_date}}"
            - name: notify-hr
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "New requisition approved: {{get-requisition.job_title}} | Jira: {{create-jira-ticket.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/kimberly-clark/recruiting/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kimberly-clark.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/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves employee time off balances from Workday.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves employee time off balances from Workday."
  tags:
    - hr
    - workforce
    - workday
    - time-off
capability:
  exposes:
    - type: mcp
      namespace: hr-time-mgmt
      port: 8080
      tools:
        - name: get-time-off
          description: "Look up time off balances in Workday."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday employee ID."
          call: workday.get-time-off
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: vacation
              type: string
              mapping: "$.balance.vacation"
            - name: sick
              type: string
              mapping: "$.balance.sick"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/kimberlyclark/workers"
          operations:
            - name: get-worker
              method: GET