Colgate Palmolive Capabilities

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

Sort
Expand

When Adobe Analytics detects a traffic anomaly on a Colgate-Palmolive digital property, creates a ServiceNow ticket and notifies the digital team in Teams.

naftiko: "0.5"
info:
  label: "Adobe Analytics Anomaly Triage"
  description: "When Adobe Analytics detects a traffic anomaly on a Colgate-Palmolive digital property, creates a ServiceNow ticket and notifies the digital team in Teams."
  tags:
    - marketing
    - analytics
    - adobe-analytics
    - servicenow
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: digital-monitoring
      port: 8080
      tools:
        - name: handle-analytics-anomaly
          description: "Given an Adobe Analytics report suite ID and anomaly description, create a ServiceNow ticket for investigation and alert the digital team in Teams."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "The Adobe Analytics report suite ID where the anomaly occurred."
            - name: anomaly_description
              in: body
              type: string
              description: "Description of the detected anomaly."
            - name: metric
              in: body
              type: string
              description: "The metric that anomaly was detected on, e.g. visits, revenue."
          steps:
            - name: get-anomaly-data
              type: call
              call: "adobe-analytics.get-anomaly-report"
              with:
                reportSuiteId: "{{report_suite_id}}"
                metric: "{{metric}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Analytics anomaly on {{report_suite_id}}: {{anomaly_description}}"
                category: "digital_analytics"
                description: "Metric: {{metric}}\nAnomaly: {{anomaly_description}}\nValue: {{get-anomaly-data.currentValue}}"
            - name: notify-digital-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "digital-team"
                message: "Analytics anomaly detected on {{report_suite_id}}: {{anomaly_description}} | ServiceNow: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: anomaly-detection
          path: "/anomalyDetection/suites/{{reportSuiteId}}"
          inputParameters:
            - name: reportSuiteId
              in: path
          operations:
            - name: get-anomaly-report
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-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

When Azure Cost Management detects a cost spike exceeding threshold, opens a ServiceNow ticket, tags the offending resources, and alerts the FinOps team in Teams.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly Responder"
  description: "When Azure Cost Management detects a cost spike exceeding threshold, opens a ServiceNow ticket, tags the offending resources, and alerts the FinOps team in Teams."
  tags:
    - cloud
    - finops
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and anomaly alert details, create a ServiceNow cost management ticket and post an alert to the FinOps Teams channel."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the anomaly was detected."
            - name: anomaly_amount
              in: body
              type: number
              description: "The anomalous spend amount in USD."
            - name: resource_group
              in: body
              type: string
              description: "The Azure resource group associated with the cost spike."
          steps:
            - name: get-cost-details
              type: call
              call: "azure-cost.get-usage"
              with:
                subscriptionId: "{{subscription_id}}"
                resourceGroup: "{{resource_group}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Azure cost anomaly: {{resource_group}} +${{anomaly_amount}}"
                category: "cloud_cost"
                urgency: "2"
            - name: alert-finops
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "finops-alerts"
                message: "Cost anomaly detected in {{resource_group}}: +${{anomaly_amount}}. ServiceNow: {{create-ticket.number}}."
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: usage
          path: "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscriptionId
              in: path
            - name: resourceGroup
              in: path
          operations:
            - name: get-usage
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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/colgatepalmolive"
      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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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

Monitors cold chain temperatures from Snowflake IoT data, flags excursions, and creates ServiceNow incidents for out-of-range events.

naftiko: "0.5"
info:
  label: "Cold Chain Temperature Monitoring"
  description: "Monitors cold chain temperatures from Snowflake IoT data, flags excursions, and creates ServiceNow incidents for out-of-range events."
  tags:
    - supply-chain
    - quality
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cold-chain
      port: 8080
      tools:
        - name: monitor-cold-chain
          description: "Monitor cold chain temperature excursions and create incidents."
          inputParameters:
            - name: shipment_id
              type: string
              description: "Shipment tracking ID."
            - name: max_temp
              type: number
              description: "Maximum allowed temperature in Celsius."
          steps:
            - name: get-temps
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "IOT_WH"
                query: "SELECT timestamp, temp_celsius FROM cold_chain WHERE shipment='{{shipment_id}}' AND temp_celsius>{{max_temp}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Cold chain excursion: shipment {{shipment_id}}"
                description: "{{get-temps.excursion_count}} temperature excursions above {{max_temp}}C"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-alerts"
                text: "COLD CHAIN ALERT: Shipment {{shipment_id}} had {{get-temps.excursion_count}} excursions"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://colgatepalmolive.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://colgatepalmolive.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

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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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: "/colgatepalmolive/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a Datadog monitor triggers a critical alert for a production service, automatically creates a ServiceNow P1 incident and pages the on-call team.

naftiko: "0.5"
info:
  label: "Datadog Alert to ServiceNow Incident"
  description: "When a Datadog monitor triggers a critical alert for a production service, automatically creates a ServiceNow P1 incident and pages the on-call team."
  tags:
    - observability
    - itsm
    - datadog
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog monitor alert, create a ServiceNow P1 incident and post a notification to the on-call Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: monitor_name
              in: body
              type: string
              description: "The Datadog monitor name."
            - name: alert_message
              in: body
              type: string
              description: "The alert message body from Datadog."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Datadog alert: {{monitor_name}}"
                description: "{{alert_message}}\nMonitor: {{monitor_id}}\nStatus: {{get-monitor.overall_state}}"
                urgency: "1"
                impact: "1"
            - name: page-oncall
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "oncall-alerts"
                message: "P1 Incident: {{monitor_name}} | ServiceNow: {{create-incident.number}} | Details: {{alert_message}}"
  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: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.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 distributor orders from Salesforce through SAP fulfillment and posts cash collection status to the finance Teams channel.

naftiko: "0.5"
info:
  label: "Distributor Order to Cash Tracker"
  description: "Tracks distributor orders from Salesforce through SAP fulfillment and posts cash collection status to the finance Teams channel."
  tags:
    - sales
    - finance
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: order-to-cash
      port: 8080
      tools:
        - name: track-order-to-cash
          description: "Track distributor order through fulfillment and collection."
          inputParameters:
            - name: order_id
              type: string
              description: "Salesforce order ID."
          steps:
            - name: get-order
              type: call
              call: salesforce.get-order
              with:
                order_id: "{{order_id}}"
            - name: get-fulfillment
              type: call
              call: sap.get-delivery-status
              with:
                order: "{{get-order.sap_reference}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "finance-ar"
                text: "Order {{order_id}}: Fulfillment {{get-fulfillment.status}}. Invoice: {{get-fulfillment.invoice_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://colgatepalmolive.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order"
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://colgatepalmolive-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/data"
          operations:
            - name: get-delivery-status
              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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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: "/colgatepalmolive/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://colgatepalmolive.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 processed in Workday, deactivates their Microsoft 365 account, revokes Okta access, and closes all open ServiceNow tickets.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is processed in Workday, deactivates their Microsoft 365 account, revokes Okta access, and closes all open ServiceNow tickets."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, revoke Okta access, disable the Microsoft 365 account, and resolve open ServiceNow tickets."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Termination date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                login: "{{get-worker.work_email}}"
            - name: disable-m365
              type: call
              call: "msgraph.update-user"
              with:
                userPrincipalName: "{{get-worker.work_email}}"
                accountEnabled: "false"
            - name: close-tickets
              type: call
              call: "servicenow.close-user-tickets"
              with:
                caller_id: "{{get-worker.work_email}}"
                close_notes: "Account deactivated - employee terminated {{termination_date}}"
  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: "/colgate-palmolive/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://colgate-palmolive.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              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/{{userPrincipalName}}"
          inputParameters:
            - name: userPrincipalName
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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

Verifies allergen declarations by checking SAP BOM ingredients, querying Snowflake allergen database, and creating Jira review tasks for discrepancies.

naftiko: "0.5"
info:
  label: "Food Safety Allergen Verification"
  description: "Verifies allergen declarations by checking SAP BOM ingredients, querying Snowflake allergen database, and creating Jira review tasks for discrepancies."
  tags:
    - quality
    - food-safety
    - sap
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: food-safety
      port: 8080
      tools:
        - name: verify-allergens
          description: "Verify allergen declarations against BOM and regulatory database."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: market
              type: string
              description: "Target market country code."
          steps:
            - name: get-ingredients
              type: call
              call: sap.get-bom
              with:
                material: "{{material_number}}"
            - name: check-allergens
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FOOD_SAFETY_WH"
                query: "SELECT allergen, status FROM allergen_db WHERE ingredient IN ({{get-ingredients.components}}) AND market='{{market}}'"
            - name: create-review
              type: call
              call: jira.create-issue
              with:
                project_key: "FSAFETY"
                summary: "Allergen verification: {{material_number}} for {{market}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://colgatepalmolive-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: bom
          path: "/data"
          operations:
            - name: get-bom
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://colgatepalmolive.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://colgatepalmolive.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

On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a failure summary to the engineering Teams channel, and logs the incident in Datadog.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a failure summary to the engineering Teams channel, and logs the incident in Datadog."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow failure event, create a Jira bug, log a Datadog event, and alert the engineering Teams channel with full context."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository name in owner/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: branch
              in: body
              type: string
              description: "The branch on which the failure occurred."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
          steps:
            - name: get-run-details
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                projectKey: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Run: {{run_id}}\nBranch: {{branch}}\nConclusion: {{get-run-details.conclusion}}"
            - name: log-datadog-event
              type: call
              call: "datadog.create-event"
              with:
                title: "CI Failure: {{repo}} {{workflow_name}}"
                text: "Branch: {{branch}}, Run: {{run_id}}"
                alert_type: "error"
            - name: alert-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "engineering-alerts"
                message: "CI Failure: {{repo}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Jira: {{create-jira-bug.key}}"
  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://colgate-palmolive.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Scans GitHub Dependabot alerts for critical vulnerabilities, creates Jira security tickets, and notifies the security team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Scans GitHub Dependabot alerts for critical vulnerabilities, creates Jira security tickets, and notifies the security team in Microsoft Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-vulnerability-alerts
          description: "Given a GitHub repository, retrieve critical Dependabot security alerts, create Jira security tickets for each, and post a summary to the security Teams channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
          steps:
            - name: get-alerts
              type: call
              call: "github.get-dependabot-alerts"
              with:
                repo: "{{repo}}"
                severity: "critical"
            - name: create-security-ticket
              type: call
              call: "jira.create-issue"
              with:
                projectKey: "SEC"
                issuetype: "Security"
                summary: "Critical vulnerability: {{get-alerts.advisory_summary}}"
                description: "Package: {{get-alerts.package_name}}\nCVSS: {{get-alerts.cvss_score}}\nRepo: {{repo}}"
            - name: notify-security
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "security-team"
                message: "Critical vulnerability in {{repo}}: {{get-alerts.advisory_summary}} | Jira: {{create-security-ticket.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: get-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://colgate-palmolive.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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks GMP training compliance by pulling Workday certifications, checking overdue trainings in Snowflake, and creating ServiceNow remediation tasks.

naftiko: "0.5"
info:
  label: "GMP Training Compliance Tracker"
  description: "Tracks GMP training compliance by pulling Workday certifications, checking overdue trainings in Snowflake, and creating ServiceNow remediation tasks."
  tags:
    - quality
    - manufacturing
    - workday
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: gmp-compliance
      port: 8080
      tools:
        - name: track-gmp-compliance
          description: "Track GMP training compliance across the workforce."
          inputParameters:
            - name: plant_code
              type: string
              description: "Plant code."
            - name: department
              type: string
              description: "Department name."
          steps:
            - name: get-certifications
              type: call
              call: workday.get-certifications
              with:
                plant: "{{plant_code}}"
                department: "{{department}}"
            - name: check-overdue
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "HR_WH"
                query: "SELECT employee_id, training, days_overdue FROM gmp_compliance WHERE plant='{{plant_code}}' AND overdue=true"
            - name: create-remediation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "GMP training overdue: {{plant_code}} {{department}}"
                description: "{{check-overdue.count}} employees with overdue GMP training"
  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: "/colgatepalmolive/certifications"
          operations:
            - name: get-certifications
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://colgatepalmolive.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://colgatepalmolive.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

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

Uses Anthropic Claude to summarize product compliance documents stored in SharePoint and posts the summary to the relevant product team channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Intelligent Document Summarization"
  description: "Uses Anthropic Claude to summarize product compliance documents stored in SharePoint and posts the summary to the relevant product team channel in Microsoft Teams."
  tags:
    - ai
    - automation
    - anthropic
    - sharepoint
    - microsoft-teams
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: ai-docs
      port: 8080
      tools:
        - name: summarize-compliance-document
          description: "Given a SharePoint file path and target Teams channel, retrieve the document content, send it to Claude for summarization, and post the summary to the Teams channel."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID containing the document."
            - name: file_path
              in: body
              type: string
              description: "The relative file path in SharePoint."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel ID to post the summary to."
          steps:
            - name: get-document
              type: call
              call: "sharepoint.get-file-content"
              with:
                siteId: "{{site_id}}"
                filePath: "{{file_path}}"
            - name: summarize
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Summarize this compliance document in 3-5 key bullet points: {{get-document.content}}"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                message: "Document summary for {{file_path}}:\n{{summarize.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{siteId}}/drive/root:{{filePath}}:/content"
          inputParameters:
            - name: siteId
              in: path
            - name: filePath
              in: path
          operations:
            - name: get-file-content
              method: GET
    - 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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive.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

Pulls completed sprint data from Jira, calculates team velocity metrics, and posts the sprint review summary to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Pulls completed sprint data from Jira, calculates team velocity metrics, and posts the sprint review summary to the engineering Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: engineering-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira board ID and sprint ID, retrieve completed story points and issues, then post a velocity summary to the engineering Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira software board ID."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira.get-sprint-issues"
              with:
                boardId: "{{board_id}}"
                sprintId: "{{sprint_id}}"
            - name: post-velocity
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "engineering-team"
                message: "Sprint {{sprint_id}} complete: {{get-sprint-issues.completedIssues}} issues, {{get-sprint-issues.completedPoints}} story points delivered."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://colgate-palmolive.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/board/{{boardId}}/sprint/{{sprintId}}/issue"
          inputParameters:
            - name: boardId
              in: path
            - name: sprintId
              in: path
          operations:
            - name: get-sprint-issues
              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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves engagement metrics for Colgate-Palmolive's LinkedIn brand campaigns and publishes a weekly performance digest to the marketing Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Brand Campaign Digest"
  description: "Retrieves engagement metrics for Colgate-Palmolive's LinkedIn brand campaigns and publishes a weekly performance digest to the marketing Teams channel."
  tags:
    - marketing
    - social
    - linkedin
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-performance
          description: "Given a LinkedIn campaign ID and date range, retrieve engagement metrics and post a performance digest to the marketing Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The LinkedIn campaign ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-campaign-stats
              type: call
              call: "linkedin.get-campaign-analytics"
              with:
                campaignId: "{{campaign_id}}"
                startDate: "{{start_date}}"
                endDate: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "marketing-team"
                message: "LinkedIn Campaign {{campaign_id}} ({{start_date}} to {{end_date}}): Impressions={{get-campaign-stats.impressions}}, Clicks={{get-campaign-stats.clicks}}, Engagement={{get-campaign-stats.engagementRate}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalytics"
          inputParameters:
            - name: campaignId
              in: query
            - name: startDate
              in: query
            - name: endDate
              in: query
          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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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: "/colgatepalmolive/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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 daily digest to a Microsoft Teams channel for the marketing team.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Aggregates campaign performance metrics from Adobe Analytics and publishes a daily digest to a Microsoft Teams channel for the marketing team."
  tags:
    - marketing
    - analytics
    - adobe-analytics
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a campaign ID and date range, pull performance metrics from Adobe Analytics and post a summary digest to the marketing Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Adobe Analytics campaign identifier."
            - name: date_range
              in: body
              type: string
              description: "Date range in YYYY-MM-DD/YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID to post the digest to."
          steps:
            - name: get-campaign-metrics
              type: call
              call: "adobe-analytics.get-report"
              with:
                campaignId: "{{campaign_id}}"
                dateRange: "{{date_range}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                message: "Campaign {{campaign_id}} digest ({{date_range}}): Visits={{get-campaign-metrics.visits}}, Conversions={{get-campaign-metrics.conversions}}, Revenue={{get-campaign-metrics.revenue}}"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/reports"
          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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive.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 employee is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
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 Graph, and Microsoft Teams."
          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: "Employee 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_to: "IT_Onboarding"
            - name: provision-m365
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-worker.full_name}}"
                mailNickname: "{{get-worker.username}}"
                userPrincipalName: "{{get-worker.work_email}}"
            - name: send-welcome
              type: call
              call: "msteams.post-message"
              with:
                recipient: "{{get-worker.work_email}}"
                message: "Welcome to Colgate-Palmolive, {{get-worker.first_name}}! Your onboarding 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: "/colgate-palmolive/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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: messages
          path: "/chats/messages"
          operations:
            - name: post-message
              method: POST

Orchestrates NPD gate reviews by pulling project status from Jira, financial projections from Snowflake, and posting review summary to Teams.

naftiko: "0.5"
info:
  label: "New Product Development Gate Review"
  description: "Orchestrates NPD gate reviews by pulling project status from Jira, financial projections from Snowflake, and posting review summary to Teams."
  tags:
    - r-and-d
    - innovation
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: npd-gates
      port: 8080
      tools:
        - name: conduct-gate-review
          description: "Conduct NPD gate review by gathering project status and financials."
          inputParameters:
            - name: project_key
              type: string
              description: "Jira project key for NPD."
            - name: gate_number
              type: number
              description: "Gate review number."
          steps:
            - name: get-project-status
              type: call
              call: jira.get-issue
              with:
                issue_key: "{{project_key}}"
            - name: get-financials
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "FINANCE_WH"
                query: "SELECT npv, roi_pct, payback_months FROM npd_financials WHERE project='{{project_key}}'"
            - name: post-review
              type: call
              call: msteams.send-message
              with:
                channel_id: "npd-reviews"
                text: "Gate {{gate_number}} review for {{project_key}}: NPV ${{get-financials.npv}}, ROI {{get-financials.roi_pct}}%"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://colgatepalmolive.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: get-issue
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://colgatepalmolive.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

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://colgatepalmolive-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://colgatepalmolive.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

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://colgatepalmolive.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: "/colgatepalmolive/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://colgatepalmolive.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

Retrieves a list of Okta users with privileged application assignments for a quarterly access review and posts the report to SharePoint.

naftiko: "0.5"
info:
  label: "Okta User Access Review"
  description: "Retrieves a list of Okta users with privileged application assignments for a quarterly access review and posts the report to SharePoint."
  tags:
    - identity
    - security
    - okta
    - sharepoint
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: run-access-review
          description: "Given an Okta group ID, retrieve all active members and their application assignments, then upload the access review report to SharePoint."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Okta group ID to review."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "The SharePoint site ID where the report should be uploaded."
          steps:
            - name: get-group-members
              type: call
              call: "okta.get-group-members"
              with:
                groupId: "{{group_id}}"
            - name: upload-report
              type: call
              call: "sharepoint.create-file"
              with:
                siteId: "{{sharepoint_site_id}}"
                fileName: "access-review-{{group_id}}.json"
                content: "{{get-group-members.members}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://colgate-palmolive.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupId}}/users"
          inputParameters:
            - name: groupId
              in: path
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{siteId}}/drive/root/children"
          inputParameters:
            - name: siteId
              in: path
          operations:
            - name: create-file
              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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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 scheduled Power BI dataset refresh after Snowflake pipeline completion and posts the refresh status to the analytics Teams channel.

naftiko: "0.5"
info:
  label: "Power BI Report Refresh Trigger"
  description: "Triggers a scheduled Power BI dataset refresh after Snowflake pipeline completion and posts the refresh status to the analytics Teams channel."
  tags:
    - data
    - analytics
    - power-bi
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: trigger-report-refresh
          description: "Given a Power BI dataset ID, trigger a dataset refresh and post the completion status to the analytics Teams channel."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the dataset."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspaceId: "{{workspace_id}}"
                datasetId: "{{dataset_id}}"
            - name: notify-analytics
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "analytics-team"
                message: "Power BI dataset {{dataset_id}} refresh triggered in workspace {{workspace_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: workspaceId
              in: path
            - name: datasetId
              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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.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

Coordinates a product launch by publishing content to LinkedIn and retrieving early engagement metrics to share with the brand team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Product Launch Social Media Coordinator"
  description: "Coordinates a product launch by publishing content to LinkedIn and retrieving early engagement metrics to share with the brand team in Microsoft Teams."
  tags:
    - marketing
    - social
    - linkedin
    - microsoft-teams
    - product-launch
capability:
  exposes:
    - type: mcp
      namespace: product-launch
      port: 8080
      tools:
        - name: publish-launch-content
          description: "Given a LinkedIn organization ID and post content, publish the launch post and then retrieve initial engagement metrics, posting the result to the brand Teams channel."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "The LinkedIn organization ID for Colgate-Palmolive."
            - name: post_content
              in: body
              type: string
              description: "The content text for the LinkedIn post."
          steps:
            - name: publish-post
              type: call
              call: "linkedin.create-post"
              with:
                organizationId: "{{org_id}}"
                text: "{{post_content}}"
            - name: notify-brand-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "brand-team"
                message: "Product launch post published on LinkedIn. Post ID: {{publish-post.id}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: shares
          path: "/ugcPosts"
          operations:
            - name: create-post
              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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              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://colgatepalmolive-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://colgatepalmolive.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 product shelf life by checking SAP batch expiry dates, identifying at-risk inventory in Snowflake, and alerting supply chain via Teams.

naftiko: "0.5"
info:
  label: "Product Shelf Life Monitoring"
  description: "Monitors product shelf life by checking SAP batch expiry dates, identifying at-risk inventory in Snowflake, and alerting supply chain via Teams."
  tags:
    - quality
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: shelf-life
      port: 8080
      tools:
        - name: monitor-shelf-life
          description: "Monitor product shelf life and alert on expiring inventory."
          inputParameters:
            - name: plant_code
              type: string
              description: "SAP plant code."
            - name: days_threshold
              type: number
              description: "Days until expiry threshold."
          steps:
            - name: get-expiring
              type: call
              call: sap.get-expiring-batches
              with:
                plant: "{{plant_code}}"
                threshold: "{{days_threshold}}"
            - name: get-inventory-value
              type: call
              call: snowflake.execute-query
              with:
                warehouse: "SC_WH"
                query: "SELECT sum(value) FROM inventory WHERE plant='{{plant_code}}' AND days_to_expiry<={{days_threshold}}"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain"
                text: "Shelf life alert: {{get-expiring.count}} batches expiring within {{days_threshold}} days at {{plant_code}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://colgatepalmolive-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/data"
          operations:
            - name: get-expiring-batches
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://colgatepalmolive.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

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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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

Calculates a customer health score from Salesforce case history and product usage data, then updates the account record for proactive retention management.

naftiko: "0.5"
info:
  label: "Salesforce Customer Health Score Updater"
  description: "Calculates a customer health score from Salesforce case history and product usage data, then updates the account record for proactive retention management."
  tags:
    - crm
    - customer-success
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: customer-success
      port: 8080
      tools:
        - name: update-health-score
          description: "Given a Salesforce account ID, retrieve open cases and usage data, compute a health score, and update the account record with the latest score."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account record ID."
          steps:
            - name: get-account-cases
              type: call
              call: "salesforce.get-account-cases"
              with:
                accountId: "{{account_id}}"
            - name: update-account
              type: call
              call: "salesforce-update.update-account"
              with:
                accountId: "{{account_id}}"
                healthScore: "{{get-account-cases.healthIndicator}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://colgate-palmolive.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Account/{{accountId}}/Cases"
          inputParameters:
            - name: accountId
              in: path
          operations:
            - name: get-account-cases
              method: GET
    - type: http
      namespace: salesforce-update
      baseUri: "https://colgate-palmolive.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{accountId}}"
          inputParameters:
            - name: accountId
              in: path
          operations:
            - name: update-account
              method: PATCH

When a new lead is created in Salesforce, enriches the record with ZoomInfo company data and assigns it to the correct sales territory owner.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment"
  description: "When a new lead is created in Salesforce, enriches the record with ZoomInfo company data and assigns it to the correct sales territory owner."
  tags:
    - crm
    - sales
    - salesforce
    - zoominfo
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: crm-leads
      port: 8080
      tools:
        - name: enrich-lead
          description: "Given a Salesforce lead ID, fetch company firmographics from ZoomInfo and update the Salesforce record with enriched data and territory assignment."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead record ID."
          steps:
            - name: get-lead
              type: call
              call: "salesforce.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-company
              type: call
              call: "zoominfo.search-company"
              with:
                companyName: "{{get-lead.Company}}"
                website: "{{get-lead.Website}}"
            - name: update-lead
              type: call
              call: "salesforce-update.update-lead"
              with:
                lead_id: "{{lead_id}}"
                AnnualRevenue: "{{enrich-company.revenue}}"
                NumberOfEmployees: "{{enrich-company.employeeCount}}"
                Industry: "{{enrich-company.industry}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://colgate-palmolive.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: get-lead
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce-update
      baseUri: "https://colgate-palmolive.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://colgatepalmolive.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 moves to Closed Won, creates an SAP S/4HANA sales order and notifies the account team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Stage Sync"
  description: "When a Salesforce opportunity moves to Closed Won, creates an SAP S/4HANA sales order and notifies the account team via Microsoft Teams."
  tags:
    - crm
    - sales
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-opportunity
      port: 8080
      tools:
        - name: sync-closed-opportunity
          description: "Given a Salesforce opportunity ID that has moved to Closed Won, create a matching SAP sales order and notify the account team in Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity record ID."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: "sap-sd.create-sales-order"
              with:
                customerName: "{{get-opportunity.AccountName}}"
                amount: "{{get-opportunity.Amount}}"
                currency: "{{get-opportunity.CurrencyIsoCode}}"
            - name: notify-team
              type: call
              call: "msteams.post-message"
              with:
                recipient: "{{get-opportunity.OwnerId}}"
                message: "Opportunity {{get-opportunity.Name}} is Closed Won. SAP Sales Order {{create-sales-order.salesOrderId}} has been created."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://colgate-palmolive.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-sd
      baseUri: "https://colgate-palmolive-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: messages
          path: "/chats/messages"
          operations:
            - name: post-message
              method: POST

When a purchase requisition is submitted in SAP Ariba, validates budget availability in SAP S/4HANA and routes the approval to the appropriate manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Requisition Approval"
  description: "When a purchase requisition is submitted in SAP Ariba, validates budget availability in SAP S/4HANA and routes the approval to the appropriate manager via Microsoft Teams."
  tags:
    - procurement
    - finance
    - sap-ariba
    - sap
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement-approval
      port: 8080
      tools:
        - name: approve-requisition
          description: "Given an Ariba requisition ID, check budget in SAP S/4HANA and send an approval card to the responsible manager in Microsoft Teams."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba requisition ID."
            - name: manager_email
              in: body
              type: string
              description: "The Microsoft Teams UPN of the approving manager."
          steps:
            - name: get-requisition
              type: call
              call: "ariba.get-requisition"
              with:
                requisitionId: "{{requisition_id}}"
            - name: check-budget
              type: call
              call: "sap-finance.check-budget"
              with:
                cost_center: "{{get-requisition.costCenter}}"
                amount: "{{get-requisition.totalAmount}}"
            - name: send-approval-card
              type: call
              call: "msteams.post-message"
              with:
                recipient: "{{manager_email}}"
                message: "Approval needed: Requisition {{requisition_id}} for {{get-requisition.totalAmount}} {{get-requisition.currency}}. Budget status: {{check-budget.status}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisitionId}}"
          inputParameters:
            - name: requisitionId
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap-finance
      baseUri: "https://colgate-palmolive-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: check-budget
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/chats/messages"
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Registers a new supplier in SAP Ariba, creates the corresponding vendor master record in SAP S/4HANA, and notifies procurement via Teams."
  tags:
    - procurement
    - supplier-management
    - sap-ariba
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given supplier details, register the supplier in SAP Ariba, create the vendor master in SAP S/4HANA, and notify the procurement team in Teams."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the supplier."
            - name: supplier_email
              in: body
              type: string
              description: "Primary contact email for the supplier."
            - name: country_code
              in: body
              type: string
              description: "ISO 2-letter country code for the supplier's primary country."
          steps:
            - name: register-ariba
              type: call
              call: "ariba.create-supplier"
              with:
                name: "{{supplier_name}}"
                email: "{{supplier_email}}"
                country: "{{country_code}}"
            - name: create-vendor-master
              type: call
              call: "sap-erp.create-vendor"
              with:
                companyName: "{{supplier_name}}"
                aribaId: "{{register-ariba.supplierId}}"
                country: "{{country_code}}"
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "procurement-team"
                message: "New supplier onboarded: {{supplier_name}} | Ariba ID: {{register-ariba.supplierId}} | SAP Vendor: {{create-vendor-master.vendorId}}"
  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: create-supplier
              method: POST
    - type: http
      namespace: sap-erp
      baseUri: "https://colgate-palmolive-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_BusinessPartner"
          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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive-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://colgatepalmolive-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

When an expense report is submitted in SAP Concur, validates the amount against policy limits and routes for manager approval via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "When an expense report is submitted in SAP Concur, validates the amount against policy limits and routes for manager approval via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: approve-expense-report
          description: "Given an SAP Concur expense report ID, validate the total against company policy and send an approval request card to the submitter's manager in Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: manager_email
              in: body
              type: string
              description: "Email address of the approving manager."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                reportId: "{{report_id}}"
            - name: send-approval
              type: call
              call: "msteams.post-message"
              with:
                recipient: "{{manager_email}}"
                message: "Expense approval needed: Report {{report_id}} for {{get-report.Total}} {{get-report.CurrencyCode}} submitted by {{get-report.OwnerName}}."
  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/{{reportId}}"
          inputParameters:
            - name: reportId
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/chats/messages"
          operations:
            - name: post-message
              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://colgatepalmolive-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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects"
          operations:
            - name: query
              method: GET

At month end, retrieves the SAP S/4HANA period close status for all entities, checks for open items, and posts the close checklist status to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Finance Period Close Checklist"
  description: "At month end, retrieves the SAP S/4HANA period close status for all entities, checks for open items, and posts the close checklist status to the finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - microsoft-teams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: check-period-close-status
          description: "Given a fiscal year and period, retrieve the SAP period close status for all company codes and post the consolidated status report to the finance Teams channel."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year, e.g. 2025."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period number, e.g. 03 for March."
          steps:
            - name: get-close-status
              type: call
              call: "sap-finance.get-period-status"
              with:
                fiscalYear: "{{fiscal_year}}"
                fiscalPeriod: "{{fiscal_period}}"
            - name: post-status
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "finance-team"
                message: "Period close status FY{{fiscal_year}} P{{fiscal_period}}: Open items={{get-close-status.openItems}}, Blocked postings={{get-close-status.blockedPostings}}"
  consumes:
    - type: http
      namespace: sap-finance
      baseUri: "https://colgate-palmolive-s4.sap.com/sap/opu/odata/sap/API_FIGL_PERIOD_LOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-status
          path: "/A_AccountingPeriodLock"
          inputParameters:
            - name: fiscalYear
              in: query
            - name: fiscalPeriod
              in: query
          operations:
            - name: get-period-status
              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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive-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://colgatepalmolive.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

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://colgatepalmolive.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://colgatepalmolive-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

Looks up an SAP S/4HANA purchase order by number and returns structured header status, vendor, and line items for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up an SAP S/4HANA purchase order by number and returns structured header status, vendor, and line items for procurement review."
  tags:
    - procurement
    - finance
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a PO number, retrieve the SAP S/4HANA purchase order status, vendor name, total value, and open line items. Use for procurement approvals and spend visibility."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500012345."
          call: "sap-erp.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-erp
      baseUri: "https://colgate-palmolive-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 product recipe details from SAP including ingredients, process parameters, and yield specifications.

naftiko: "0.5"
info:
  label: "SAP Recipe Management Lookup"
  description: "Retrieves product recipe details from SAP including ingredients, process parameters, and yield specifications."
  tags:
    - manufacturing
    - r-and-d
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: recipe-mgmt
      port: 8080
      tools:
        - name: get-recipe
          description: "Look up a product recipe in SAP by material number. Returns ingredients, process steps, and yield."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
          call: sap.get-recipe
          with:
            material: "{{material_number}}"
          outputParameters:
            - name: recipe_id
              type: string
              mapping: "$.d.RecipeId"
            - name: ingredients
              type: string
              mapping: "$.d.Ingredients"
            - name: yield_pct
              type: string
              mapping: "$.d.PlannedYield"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://colgatepalmolive-s4.sap.com/sap/opu/odata/sap/API_RECIPE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: recipes
          path: "/A_Recipe"
          operations:
            - name: get-recipe
              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://colgatepalmolive-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://colgatepalmolive.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 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://colgatepalmolive-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://colgatepalmolive-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://colgatepalmolive.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

Creates a standard ServiceNow change request for planned maintenance, associates it with affected CI records, and sends pre-change notifications via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Automation"
  description: "Creates a standard ServiceNow change request for planned maintenance, associates it with affected CI records, and sends pre-change notifications via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: open-change-request
          description: "Given a change description, affected configuration items, and planned window, create a ServiceNow standard change request and notify stakeholders in Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the planned change."
            - name: affected_ci
              in: body
              type: string
              description: "Comma-separated list of affected configuration item names."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start datetime in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned change end datetime in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "{{change_description}}"
                type: "standard"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
                cmdb_ci: "{{affected_ci}}"
            - name: notify-stakeholders
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "it-operations"
                message: "Change request {{create-change.number}} opened: {{change_description}} | Window: {{planned_start}} to {{planned_end}} | CIs: {{affected_ci}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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
              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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When a high-priority ServiceNow incident is raised for a digital product, automatically creates a linked Jira bug and notifies the engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Incident to Jira Bug Bridge"
  description: "When a high-priority ServiceNow incident is raised for a digital product, automatically creates a linked Jira bug and notifies the engineering team in Microsoft Teams."
  tags:
    - itsm
    - devops
    - servicenow
    - jira
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a ServiceNow P1 incident number, create a linked Jira bug in the engineering project and post an alert to the engineering Teams channel."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                projectKey: "ENG"
                issuetype: "Bug"
                summary: "[P1 Incident] {{get-incident.short_description}}"
                description: "ServiceNow: {{incident_number}}\nImpact: {{get-incident.impact}}\nDescription: {{get-incident.description}}"
            - name: alert-engineering
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "engineering-alerts"
                message: "P1 Incident {{incident_number}}: {{get-incident.short_description}} | Jira: {{create-jira-bug.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://colgate-palmolive.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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              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

Checks the status of Snowflake data pipelines and tasks, surfaces any failures, and creates ServiceNow incidents for failed jobs requiring manual intervention.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Monitor"
  description: "Checks the status of Snowflake data pipelines and tasks, surfaces any failures, and creates ServiceNow incidents for failed jobs requiring manual intervention."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Given a Snowflake task name, retrieve task execution history, identify failures, and open a ServiceNow incident if the failure count exceeds threshold."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "The Snowflake task name to check."
            - name: failure_threshold
              in: body
              type: integer
              description: "Number of consecutive failures before opening an incident."
          steps:
            - name: get-task-history
              type: call
              call: "snowflake.get-task-history"
              with:
                taskName: "{{task_name}}"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Snowflake task failure: {{task_name}}"
                category: "data_pipeline"
                description: "Task {{task_name}} has exceeded failure threshold. Last error: {{get-task-history.error_message}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://colgate-palmolive.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/tasks/{{taskName}}/executions"
          inputParameters:
            - name: taskName
              in: path
          operations:
            - name: get-task-history
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.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 the Snowflake account usage schema to identify long-running and expensive queries, and posts a performance audit report to the data engineering Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Query Performance Audit"
  description: "Queries the Snowflake account usage schema to identify long-running and expensive queries, and posts a performance audit report to the data engineering Teams channel."
  tags:
    - data
    - analytics
    - snowflake
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-performance
      port: 8080
      tools:
        - name: audit-query-performance
          description: "Given a time window and cost threshold, retrieve expensive Snowflake queries from account usage and post a top offenders report to the data engineering Teams channel."
          inputParameters:
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours to look back for query history."
            - name: credits_threshold
              in: body
              type: number
              description: "Minimum credits consumed to flag a query as expensive."
          steps:
            - name: get-expensive-queries
              type: call
              call: "snowflake.get-query-history"
              with:
                hoursBack: "{{hours_back}}"
                creditsThreshold: "{{credits_threshold}}"
            - name: post-audit-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "data-engineering"
                message: "Snowflake query audit (last {{hours_back}}h): {{get-expensive-queries.queryCount}} expensive queries found. Top query: {{get-expensive-queries.topQuery}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://colgate-palmolive.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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive.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

Aggregates demand signals from Salesforce opportunity pipeline and SAP inventory positions to produce a consolidated supply chain outlook report.

naftiko: "0.5"
info:
  label: "Supply Chain Demand Signal Aggregator"
  description: "Aggregates demand signals from Salesforce opportunity pipeline and SAP inventory positions to produce a consolidated supply chain outlook report."
  tags:
    - supply-chain
    - finance
    - salesforce
    - sap
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-reporting
      port: 8080
      tools:
        - name: get-demand-outlook
          description: "Given a product family code and planning horizon, retrieve open Salesforce pipeline opportunities and SAP inventory positions to produce a demand vs. supply summary."
          inputParameters:
            - name: product_family
              in: body
              type: string
              description: "The Salesforce product family code, e.g. ORAL_CARE."
            - name: horizon_weeks
              in: body
              type: integer
              description: "Planning horizon in weeks."
          steps:
            - name: get-pipeline
              type: call
              call: "salesforce.get-opportunities-by-product"
              with:
                productFamily: "{{product_family}}"
            - name: get-inventory
              type: call
              call: "sap-inventory.get-stock-overview"
              with:
                productFamily: "{{product_family}}"
            - name: post-outlook
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "supply-chain-team"
                message: "Demand outlook for {{product_family}} ({{horizon_weeks}}w): Pipeline={{get-pipeline.totalValue}}, On-hand stock={{get-inventory.totalUnits}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://colgate-palmolive.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          inputParameters:
            - name: productFamily
              in: query
          operations:
            - name: get-opportunities-by-product
              method: GET
    - type: http
      namespace: sap-inventory
      baseUri: "https://colgate-palmolive-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"
          inputParameters:
            - name: productFamily
              in: query
          operations:
            - name: get-stock-overview
              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/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              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://colgatepalmolive.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

Triggers a Terraform Cloud workspace run to provision or update cloud infrastructure, monitors the run result, and creates a ServiceNow change record.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision or update cloud infrastructure, monitors the run result, and creates a ServiceNow change record."
  tags:
    - cloud
    - infrastructure
    - terraform
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and message, trigger a plan and apply run, then create a ServiceNow change record documenting the infrastructure change."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID."
            - name: change_description
              in: body
              type: string
              description: "Description of the infrastructure change being applied."
          steps:
            - name: create-run
              type: call
              call: "terraform.create-run"
              with:
                workspaceId: "{{workspace_id}}"
                message: "{{change_description}}"
            - name: create-change-record
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Terraform infra change: {{change_description}}"
                description: "Workspace: {{workspace_id}}\nRun ID: {{create-run.runId}}"
                category: "Infrastructure"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://colgate-palmolive.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              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://colgatepalmolive.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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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://colgatepalmolive-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://colgatepalmolive.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

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: "/colgatepalmolive/workers"
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://colgatepalmolive.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 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: "/colgatepalmolive/workers"
          operations:
            - name: get-worker
              method: GET

Pulls current headcount by department and cost center from Workday and returns the structured dataset for workforce planning and finance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Report Snapshot"
  description: "Pulls current headcount by department and cost center from Workday and returns the structured dataset for workforce planning and finance reporting."
  tags:
    - hr
    - finance
    - workday
    - reporting
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns current active employee headcount grouped by department and cost center from Workday. Use for workforce planning, finance period close, and budget reviews."
          call: "workday.get-headcount"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.id"
                - name: full_name
                  type: string
                  mapping: "$.name"
                - name: department
                  type: string
                  mapping: "$.department"
                - name: cost_center
                  type: string
                  mapping: "$.costCenter"
  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: "/colgate-palmolive/workers"
          operations:
            - name: get-headcount
              method: GET

Compares current period payroll totals from Workday against the previous period and flags variances exceeding threshold for finance review.

naftiko: "0.5"
info:
  label: "Workday Payroll Variance Report"
  description: "Compares current period payroll totals from Workday against the previous period and flags variances exceeding threshold for finance review."
  tags:
    - hr
    - finance
    - workday
    - payroll
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: payroll-reporting
      port: 8080
      tools:
        - name: get-payroll-variance
          description: "Given a pay period and variance threshold percentage, retrieve Workday payroll totals for the current and prior period, identify variances, and return flagged entries."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period identifier in YYYY-MM format."
            - name: variance_threshold
              in: body
              type: number
              description: "Percentage threshold above which a variance is flagged, e.g. 5 for 5%."
          call: "workday.get-payroll-results"
          with:
            payPeriod: "{{pay_period}}"
          outputParameters:
            - name: total_gross_pay
              type: number
              mapping: "$.totals.grossPay"
            - name: total_net_pay
              type: number
              mapping: "$.totals.netPay"
            - name: period
              type: string
              mapping: "$.payPeriod"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll-results
          path: "/colgate-palmolive/payrollResults"
          inputParameters:
            - name: payPeriod
              in: query
          operations:
            - name: get-payroll-results
              method: GET

Retrieves the current hiring pipeline status for an open Workday job requisition and summarizes candidate stage counts for recruiters.

naftiko: "0.5"
info:
  label: "Workday Recruiting Candidate Status Tracker"
  description: "Retrieves the current hiring pipeline status for an open Workday job requisition and summarizes candidate stage counts for recruiters."
  tags:
    - hr
    - recruiting
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: get-requisition-pipeline
          description: "Given a Workday job requisition ID, return a summary of candidates by stage including screened, interviewed, offered, and rejected counts."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          call: "workday.get-job-requisition"
          with:
            requisitionId: "{{requisition_id}}"
          outputParameters:
            - name: job_title
              type: string
              mapping: "$.jobRequisition.jobTitle"
            - name: total_candidates
              type: number
              mapping: "$.jobRequisition.candidateCount"
            - name: stage_summary
              type: string
              mapping: "$.jobRequisition.stageSummary"
  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: "/colgate-palmolive/jobRequisitions/{{requisitionId}}"
          inputParameters:
            - name: requisitionId
              in: path
          operations:
            - name: get-job-requisition
              method: GET

When an employee's role changes in Workday, updates their Okta application assignments to reflect the new role's access profile.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Provisioning"
  description: "When an employee's role changes in Workday, updates their Okta application assignments to reflect the new role's access profile."
  tags:
    - hr
    - identity
    - workday
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-identity
      port: 8080
      tools:
        - name: sync-role-access
          description: "Given a Workday employee ID and new job profile, update Okta group memberships to match the new role's access entitlements."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: new_job_profile
              in: body
              type: string
              description: "The new Workday job profile name."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: assign-okta-group
              type: call
              call: "okta.add-user-to-group"
              with:
                userId: "{{get-worker.okta_user_id}}"
                groupProfile: "{{new_job_profile}}"
  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: "/colgate-palmolive/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://colgate-palmolive.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupProfile}}/users/{{userId}}"
          inputParameters:
            - name: groupProfile
              in: path
            - name: userId
              in: path
          operations:
            - name: add-user-to-group
              method: PUT

Returns the current paid time off and vacation accrual balances for an employee from Workday, for use in absence planning and manager approvals.

naftiko: "0.5"
info:
  label: "Workday Time-Off Balance Lookup"
  description: "Returns the current paid time off and vacation accrual balances for an employee from Workday, for use in absence planning and manager approvals."
  tags:
    - hr
    - workday
    - absence-management
capability:
  exposes:
    - type: mcp
      namespace: hr-absence
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given a Workday employee ID, return current accrued vacation, PTO, and sick leave balances. Use when an employee or manager needs to verify available time-off before approving a request."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-leave-balance"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: vacation_days
              type: number
              mapping: "$.leaveBalances.vacation"
            - name: pto_days
              type: number
              mapping: "$.leaveBalances.pto"
            - name: sick_days
              type: number
              mapping: "$.leaveBalances.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: leave-balances
          path: "/colgate-palmolive/workers/{{worker_id}}/leaveBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-leave-balance
              method: GET